Linux操作系统基线检查与安全加固概述
前言:
在数字化转型浪潮中,Linux凭借其开源生态与卓越稳定性,已成为云计算、金融核心系统及关键基础设施的承载主体。然而,随着网络攻击手段的持续演进和漏洞利用的产业化,默认配置的Linux系统如同“不设防的堡垒”——弱口令、未修复漏洞、过度权限配置等隐患,正成为攻击者突破的黄金入口
目录
一、系统安全基线
1、账户与认证安全
2、文件与目录权限
3、SSH服务安全
4、网络与服务配置
5、日志与审计
6、内核参数加固
7、更新与补丁
8、安全模块配置
9、SUID/SGID文件检查
10、默认权限控制(umask)
二、系统安全加固
1、账户与认证加固
2、服务与网络加固
3、文件系统与权限加固
4、内核参数加固
5、日志与审计加固
6、安全工具与模块
7、其他加固措施
8、总结
三、漏洞修复案例
案例1:Shellshock漏洞(CVE-2014-6271)
案例2:Dirty COW漏洞(CVE-2016-5195)
案例3:Heartbleed漏洞(CVE-2014-0160)
案例4:Sudo提权漏洞(CVE-2021-3156)
案例5:Ghost漏洞(CVE-2015-0235)
案例6:SSH Weak MAC Algorithms(CVE-2008-5161)
案例7:Polkit权限提升漏洞(CVE-2021-4034)
案例8:Apache HTTP Server漏洞(CVE-2021-41773)
案例9:Log4j远程代码执行漏洞(CVE-2021-44228)
案例10:Linux内核Netfilter漏洞(CVE-2024-1086)
总结
一、系统安全基线
1、账户与认证安全
-
检查默认账户状态
-
检查点:锁定或删除不必要的默认账户(如
guest
,test
)。 -
案例:
# 锁定账户sudo passwd -l guest# 删除账户sudo userdel test
-
-
密码策略配置
-
检查点:密码长度≥8位,复杂度包含大小写、数字、符号,有效期≤90天。
-
案例:修改
/etc/login.defs
:PASS_MAX_DAYS 90PASS_MIN_LEN 8PASS_WARN_AGE 7
安装
libpam-pwquality
并配置复杂度(/etc/security/pwquality.conf
):minlen = 8dcredit = -1ucredit = -1
-
-
禁止Root直接登录
-
检查点:通过SSH禁止Root远程登录,使用普通用户+
sudo
提权。 -
案例:修改
/etc/ssh/sshd_config
:PermitRootLogin no
-
-
空密码账户检查
-
检查点:确保所有账户均有密码。
-
案例:
awk -F: '($2 == "") {print $1}' /etc/shadow
-
2、文件与目录权限
-
关键文件权限
-
检查点:
/etc/passwd
权限644,/etc/shadow
权限600。 -
案例:
chmod 644 /etc/passwdchmod 600 /etc/shadow
-
-
全局可写文件检查
-
检查点:查找权限为777的文件或目录。
-
案例:
find / -perm -0777 -type f -exec ls -l {} \;
-
-
无属主文件检查
-
检查点:修复无属主或属组的文件。
-
案例:
find / -nouser -o -nogroup -exec chown root:root {} \;
-
-
临时目录粘滞位
-
检查点:
/tmp
目录设置粘滞位(权限1777)。 -
案例:
chmod +t /tmp
-
3、SSH服务安全
-
使用SSH协议版本2
-
检查点:禁用不安全的SSHv1。
-
案例:修改
/etc/ssh/sshd_config
:Protocol 2
-
-
限制登录尝试次数
-
检查点:防止暴力破解,限制失败尝试为3次。
-
案例:修改
/etc/ssh/sshd_config
:MaxAuthTries 3
-
-
启用密钥认证
-
检查点:禁用密码登录,强制使用密钥。
-
案例:
PasswordAuthentication no
-
4、网络与服务配置
-
关闭非必要服务
-
检查点:禁用Telnet、FTP等不安全服务。
-
案例:
systemctl stop telnet.socketsystemctl disable telnet.socket
-
-
防火墙配置
-
检查点:仅开放必要端口(如SSH的22/HTTP的80)。
-
案例(使用
iptables
):iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -j DROP
-
-
禁用ICMP重定向
-
检查点:防止网络参数被篡改。
-
案例:修改
/etc/sysctl.conf
:net.ipv4.conf.all.accept_redirects = 0
-
5、日志与审计
-
日志服务状态
-
检查点:确保
rsyslog
/auditd
运行。 -
案例:
systemctl status rsyslog
-
-
关键日志权限
-
检查点:
/var/log/secure
权限设为640。 -
案例:
chmod 640 /var/log/secure
-
-
审计关键文件
-
检查点:监控
/etc/passwd
的修改。 -
案例:添加
auditd
规则(/etc/audit/rules.d/audit.rules
):-w /etc/passwd -p wa -k passwd_change
-
6、内核参数加固
-
防SYN洪水攻击
-
检查点:启用SYN Cookies。
-
案例:修改
/etc/sysctl.conf
:net.ipv4.tcp_syncookies = 1
-
-
禁用IP源路由
-
检查点:防止IP欺骗。
-
案例:
net.ipv4.conf.all.accept_source_route = 0
-
7、更新与补丁
-
系统更新检查
-
检查点:定期更新所有软件包。
-
案例:
apt update && apt upgrade -y # Debian/Ubuntuyum update -y # CentOS/RHEL
-
8、安全模块配置
-
启用SELinux/AppArmor
-
检查点:确保处于
enforcing
模式。 -
案例:修改
/etc/selinux/config
:SELINUX=enforcing
-
9、SUID/SGID文件检查
-
清理危险权限文件
-
检查点:移除不必要的SUID/SGID文件。
-
案例:
find / -perm /4000 -type f -exec ls -l {} \; # SUID文件find / -perm /2000 -type f -exec ls -l {} \; # SGID文件
-
10、默认权限控制(umask)
-
设置严格umask
-
检查点:全局umask设置为027(文件640,目录750)。
-
案例:修改
/etc/profile
:umask 027
-
二、系统安全加固
1、账户与认证加固
-
禁用默认账户与空密码账户
-
加固点:删除或锁定未使用的默认账户,禁止空密码登录。
-
案例:
# 锁定账户(如guest)sudo passwd -l guest# 删除空密码账户sudo userdel $(awk -F: '($2 == "") {print $1}' /etc/shadow)
-
-
强化密码策略
-
加固点:强制密码复杂度、有效期及历史记录。
-
案例:修改
/etc/login.defs
:PASS_MAX_DAYS 90 # 密码最长使用90天PASS_MIN_DAYS 1 # 最短修改间隔1天PASS_WARN_AGE 7 # 密码到期前7天提醒
配置
/etc/security/pwquality.conf
(需安装libpam-pwquality
):minlen = 10 # 密码最小长度10位minclass = 3 # 包含至少3种字符类别(大小写、数字、符号)
-
-
限制sudo权限
-
加固点:仅允许特定用户或组使用
sudo
。 -
案例:修改
/etc/sudoers
:# 仅允许admin组用户使用sudo%admin ALL=(ALL) ALL# 禁止普通用户执行危险命令(如重启)User_Alias RESTRICTED_USERS = alice, bobCmnd_Alias DANGEROUS_CMDS = /sbin/reboot, /sbin/shutdownRESTRICTED_USERS ALL=(ALL) ALL, !DANGEROUS_CMDS
-
2、服务与网络加固
-
关闭非必要服务
-
加固点:禁用未使用的服务(如Telnet、FTP)。
-
案例:
# 查看所有服务状态(systemd系统)systemctl list-unit-files --state=enabled# 禁用Telnet服务systemctl disable telnet.socket
-
-
防火墙配置
-
加固点:仅开放必要端口,默认拒绝所有入站流量。
-
案例(使用
iptables
):# 清空现有规则iptables -F# 允许SSH(22)、HTTP(80)、HTTPS(443)iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT# 默认拒绝其他入站流量iptables -P INPUT DROP# 保存规则(CentOS/RHEL)service iptables save
-
-
SSH服务加固
-
加固点:限制SSH访问、启用密钥认证、禁止Root登录。
-
案例:修改
/etc/ssh/sshd_config
:PermitRootLogin no # 禁止Root登录PasswordAuthentication no # 禁用密码登录(强制密钥)AllowUsers alice@192.168.1.0/24 # 仅允许特定IP段的用户alice登录MaxAuthTries 3 # 最大登录尝试3次
-
3、文件系统与权限加固
-
关键文件权限控制
-
加固点:限制敏感文件(如
/etc/passwd
、/etc/shadow
)的访问。 -
案例:
chmod 600 /etc/shadow # 仅Root可读写chmod 644 /etc/passwd # Root可读写,其他用户只读
-
-
禁用危险权限文件
-
加固点:查找并移除不必要的SUID/SGID权限文件。
-
案例:
# 查找所有SUID/SGID文件find / -perm /4000 -o -perm /2000 -exec ls -l {} \;# 移除危险文件权限(如不必要的setuid程序)chmod u-s /usr/bin/example_tool
-
-
挂载选项加固
-
加固点:为关键分区添加
noexec
、nosuid
选项。 -
案例:修改
/etc/fstab
:/tmp /tmp ext4 defaults,noexec,nosuid,nodev 0 0/home /home ext4 defaults,nodev 0 0
-
4、内核参数加固
-
防SYN洪水攻击
-
加固点:启用SYN Cookies防止DDoS攻击。
-
案例:修改
/etc/sysctl.conf
:net.ipv4.tcp_syncookies = 1 # 启用SYN Cookiesnet.ipv4.tcp_max_syn_backlog = 2048 # 增大SYN队列长度
-
-
禁用IP转发与源路由
-
加固点:防止系统被用作路由器或遭受IP欺骗。
-
案例:
net.ipv4.ip_forward = 0 # 禁用IPv4转发 net.ipv4.conf.all.accept_source_route = 0 # 禁用源路由
-
-
限制核心转储文件
-
加固点:防止通过核心转储泄露敏感信息。
-
案例:
# 限制核心转储文件大小(单位:KB)ulimit -c 0# 永久生效:在/etc/security/limits.conf中添加* hard core 0
-
5、日志与审计加固
-
启用审计服务(auditd)
-
加固点:监控关键文件和用户操作。
-
案例:配置
/etc/audit/rules.d/audit.rules
:# 监控/etc/passwd和/etc/shadow的修改-w /etc/passwd -p wa -k passwd_change-w /etc/shadow -p wa -k shadow_change# 监控用户提权操作(sudo)-a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -k sudo_use
-
-
日志远程存储
-
加固点:防止本地日志被篡改,配置日志服务器。
-
案例:修改
/etc/rsyslog.conf
:# 将日志发送到远程服务器(替换IP)*.* @192.168.1.100:514
-
-
日志轮转与保留
-
加固点:避免日志文件过大,保留90天日志。
-
案例:修改
/etc/logrotate.conf
:rotate 12 # 保留12个日志副本(按月轮转)maxage 90 # 日志保留90天
-
6、安全工具与模块
-
启用SELinux/AppArmor
-
加固点:强制访问控制(MAC)限制进程权限。
-
案例(SELinux):
# 检查状态sestatus# 修改模式为enforcingsetenforce 1# 永久生效:修改/etc/selinux/configSELINUX=enforcing
-
-
安装入侵检测工具(如AIDE)
-
加固点:监控文件完整性。
-
案例:
# 安装AIDEyum install aide -y # CentOS/RHELapt install aide -y # Debian/Ubuntu# 初始化数据库aide --init# 每日自动检查echo "0 0 * * * /usr/sbin/aide --check" >> /etc/crontab
-
-
部署防暴力破解工具(如fail2ban)
-
加固点:自动封禁多次登录失败的IP。
-
案例:
# 安装fail2banyum install fail2ban -y # CentOS/RHELapt install fail2ban -y # Debian/Ubuntu# 配置SSH防护(/etc/fail2ban/jail.local)[sshd]enabled = truemaxretry = 3 # 允许3次失败尝试bantime = 86400 # 封禁24小时
-
7、其他加固措施
-
限制用户历史命令记录
-
加固点:防止敏感命令泄露。
-
案例:修改
/etc/profile
:# 减少历史命令保存条数export HISTSIZE=50# 不记录特定命令(如密码相关)export HISTIGNORE="passwd:*ssh*:mysql*"
-
-
禁用Ctrl+Alt+Del重启
-
加固点:防止误操作或恶意重启。
-
案例:注释
/etc/systemd/system.conf
中的配置:# 原内容:CtrlAltDelBurstAction=reboot-force# 修改为:#CtrlAltDelBurstAction=reboot-force
-
-
定期更新系统
-
加固点:修复已知漏洞。
-
案例:
# Debian/Ubuntuapt update && apt upgrade -y# CentOS/RHELyum update -y --security
-
8、总结
通过账户加固、服务管理、文件权限控制、内核参数优化、日志审计、安全工具部署等综合措施,可显著提升Linux系统的安全性。实际操作中需结合业务场景调整策略,并通过工具(如Lynis、OpenSCAP)验证加固效果。
三、漏洞修复案例
案例1:Shellshock漏洞(CVE-2014-6271)
-
影响版本:Bash ≤4.3
-
漏洞描述:通过环境变量注入恶意代码,可远程执行任意命令。
-
修复步骤:
# 更新Bashsudo apt-get update && sudo apt-get install --only-upgrade bash # Debian/Ubuntusudo yum update bash -y # RHEL/CentOS
-
验证方法:
env x='() { :;}; echo vulnerable' bash -c "echo test" # 若输出"vulnerable"则未修复。
案例2:Dirty COW漏洞(CVE-2016-5195)
-
影响版本:Linux内核 2.6.22 ≤ version ≤4.8.3
-
漏洞描述:竞争条件漏洞,允许本地用户提权到root。
-
修复步骤:
sudo apt-get update && sudo apt-get upgrade linux-image-$(uname -r) # Debian/Ubuntusudo yum update kernel -y # RHEL/CentOSsudo reboot
-
验证方法: 使用漏洞检测脚本(如
dirtycow-detect
)或检查内核版本是否≥4.8.3。
案例3:Heartbleed漏洞(CVE-2014-0160)
-
影响版本:OpenSSL 1.0.1 ~1.0.1f
-
漏洞描述:TLS心跳扩展漏洞,可泄露服务器内存中的敏感信息。
-
修复步骤:
sudo apt-get update && sudo apt-get install openssl libssl1.0.0 # Debian/Ubuntusudo yum update openssl -y # RHEL/CentOS
-
验证方法: 使用
nmap --script ssl-heartbleed <目标IP>
检测是否修复。
案例4:Sudo提权漏洞(CVE-2021-3156)
-
影响版本:Sudo 1.8.2 ~1.8.31p2
-
漏洞描述:堆溢出漏洞,本地用户无需密码即可获取root权限。
-
修复步骤:
sudo apt-get install sudo -y # Debian/Ubuntu(自动升级到最新)sudo yum update sudo -y # RHEL/CentOS
-
验证方法: 执行
sudoedit -s /
,若返回"sudoedit"错误而非崩溃则已修复。
案例5:Ghost漏洞(CVE-2015-0235)
-
影响版本:glibc ≤2.17
-
漏洞描述:
gethostbyname
函数缓冲区溢出,可导致远程代码执行。 -
修复步骤:
sudo apt-get update && sudo apt-get install libc6 # Debian/Ubuntusudo yum update glibc -y # RHEL/CentOS
-
验证方法: 使用检测脚本
check_ghost.sh
或检查glibc版本≥2.18。
案例6:SSH Weak MAC Algorithms(CVE-2008-5161)
-
影响版本:OpenSSH ≤7.2
-
漏洞描述:支持弱加密算法(如MD5),易受中间人攻击。
-
修复步骤: 编辑
/etc/ssh/sshd_config
,禁用不安全的MAC算法:MACs hmac-sha2-512,hmac-sha2-256
重启服务:
systemctl restart sshd
-
验证方法: 使用
ssh -Q mac
或扫描工具(如nmap --script ssh2-enum-algos
)确认禁用弱算法。
案例7:Polkit权限提升漏洞(CVE-2021-4034)
-
影响版本:polkit ≤0.120
-
漏洞描述:本地用户可通过环境变量注入执行任意代码。
-
修复步骤:
sudo apt-get update && sudo apt-get install policykit-1 -y # Debian/Ubuntusudo yum update polkit -y # RHEL/CentOS
-
验证方法: 执行检测命令
pkexec --version
,确认版本≥0.121。
案例8:Apache HTTP Server漏洞(CVE-2021-41773)
-
影响版本:Apache 2.4.49/2.4.50
-
漏洞描述:路径遍历漏洞,可读取服务器敏感文件。
-
修复步骤:
sudo apt-get install apache2 -y # Debian/Ubuntu(升级到2.4.51+)sudo yum update httpd -y # RHEL/CentOS
-
验证方法: 使用漏洞检测POC或检查Apache版本≥2.4.51。
案例9:Log4j远程代码执行漏洞(CVE-2021-44228)
-
影响版本:Log4j 2.x ≤2.14.1
-
漏洞描述:JNDI注入漏洞,攻击者可通过日志记录触发RCE。
-
修复步骤:
-
升级Log4j到2.17.0+:
# 手动替换JAR文件或通过包管理器更新
-
设置环境变量禁用JNDI:
export LOG4J_FORMAT_MSG_NO_LOOKUPS=true
-
-
验证方法: 使用扫描工具(如
log4j-detector
)确认版本和配置。
案例10:Linux内核Netfilter漏洞(CVE-2024-1086)
-
影响版本:Linux内核 5.14 ~6.6
-
漏洞描述:释放后使用(Use-After-Free)漏洞,可导致本地提权。
-
修复步骤:
sudo apt-get update && sudo apt-get install linux-image-generic # Debian/Ubuntusudo yum update kernel -y # RHEL/CentOSsudo reboot
-
验证方法: 检查内核版本是否升级到修复版本(如6.6.15+)。
总结
以上案例覆盖了从用户态工具(如Bash、Sudo)到内核级漏洞的修复流程,同时包含配置修复(如SSH、Apache)和第三方库升级(如Log4j)。
建议在修复后:
1.通过版本检查或漏洞扫描工具验证。
2.定期订阅CVE公告(如Linux内核邮件列表)。
3.使用自动化工具(如unattended-upgrades
)或漏洞管理平台(如Tenable、Qualys)。