Linux 系统安全加固指南:从基础到进阶的全面防护实践
Linux 凭借其开源架构、稳定性和可定制性,成为服务器、嵌入式设备乃至云环境的主流操作系统。尽管 Linux 内核设计本身具备较强的安全性(如最小权限原则、内存保护机制),但默认配置并非绝对安全。随着网络攻击手段的复杂化(如勒索软件、APT 攻击、供应链攻击),对 Linux 系统进行主动安全加固已成为运维和开发人员的必备技能。
本文将从基础配置到高级防护,系统梳理 Linux 安全加固的核心环节,涵盖系统更新、用户权限、文件系统、网络防护、恶意软件检测、审计监控等关键领域,并结合实际操作示例,帮助读者构建纵深防御体系。
目录#
1. 系统更新与补丁管理#
核心原则:及时修复系统漏洞是安全的第一道防线。Linux 发行版会定期发布安全补丁,需通过自动化工具确保系统持续更新。
1.1 手动更新与常用命令#
不同发行版的包管理器不同,以下是主流系统的更新命令:
-
Debian/Ubuntu:
# 更新软件包索引 sudo apt update # 升级所有可更新包(包括内核) sudo apt upgrade -y # 清理过时依赖 sudo apt autoremove -y -
RHEL/CentOS/Rocky Linux:
# 更新所有包(包括内核) sudo dnf update -y # 仅更新安全补丁(需启用 EPEL 源) sudo dnf update --security -y -
Arch Linux:
# 同步仓库并升级系统(滚动更新) sudo pacman -Syu --noconfirm
1.2 自动化更新配置#
手动更新易遗漏,建议配置自动化更新:
-
Debian/Ubuntu:使用
unattended-upgrades# 安装工具 sudo apt install unattended-upgrades -y # 启用自动更新(编辑配置文件 /etc/apt/apt.conf.d/50unattended-upgrades) sudo dpkg-reconfigure -plow unattended-upgrades配置示例(仅更新安全补丁):
Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; }; -
RHEL/CentOS:使用
dnf-automaticsudo dnf install dnf-automatic -y # 编辑配置文件 /etc/dnf/automatic.conf,设置 apply_updates = yes sudo systemctl enable --now dnf-automatic.timer
关键实践#
- 最小化更新风险:生产环境建议先在测试机验证补丁兼容性,再批量更新。
- 内核更新后重启:部分漏洞修复需重启内核(如 Spectre/Meltdown 相关补丁),可使用
kexec实现无停机重启。
2. 用户账户与权限安全#
核心原则:遵循“最小权限原则”,严格控制用户权限,避免过度授权。
2.1 账户管理基础#
-
禁用默认无用账户:删除或锁定系统默认的冗余账户(如
games、ftp,若无需使用):sudo userdel -r games # 删除账户及家目录 sudo passwd -l ftp # 锁定账户(无法登录) -
密码策略强化:通过 PAM(Pluggable Authentication Modules)配置密码复杂度:
- 安装
pam_cracklib(Debian/Ubuntu:sudo apt install libpam-cracklib)。 - 编辑
/etc/pam.d/common-password,添加规则:password requisite pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1minlen=12:密码最小长度 12 位。ucredit=-1:至少 1 个大写字母。lcredit=-1:至少 1 个小写字母。dcredit=-1:至少 1 个数字。ocredit=-1:至少 1 个特殊字符。
- 安装
-
密码有效期控制:编辑
/etc/login.defs设置全局策略:PASS_MAX_DAYS 90 # 密码最长使用天数 PASS_MIN_DAYS 7 # 密码修改间隔天数 PASS_WARN_AGE 14 # 密码过期前 14 天警告对特定用户生效:
sudo chage -M 90 username(设置用户username的密码有效期为 90 天)。
2.2 sudo 权限精细化管理#
sudo 允许普通用户执行特权命令,但需严格限制权限范围:
-
编辑 sudoers 文件:必须使用
visudo(自动语法检查,避免权限锁死):sudo visudo -
常用配置示例:
# 允许 alice 无需密码执行所有命令(不推荐,仅示例) alice ALL=(ALL) NOPASSWD: ALL # 允许 bob 仅执行特定命令(如重启服务) bob ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx # 禁止用户执行危险命令(如 rm -rf /) Defaults! /bin/rm !targets=/
2.3 禁用 root 直接登录#
直接使用 root 账户登录风险极高,应通过普通用户 + sudo 提权:
-
禁用 root SSH 登录:编辑
/etc/ssh/sshd_config:PermitRootLogin no # 禁止 root 直接 SSH 登录重启 SSH 服务:
sudo systemctl restart sshd。 -
物理控制台限制:编辑
/etc/securetty,注释掉非必要终端(如tty2-tty6),仅保留tty1。
3. 文件系统与权限控制#
核心原则:通过文件权限、特殊属性和分区挂载选项,限制非授权访问和恶意篡改。
3.1 文件权限基础#
Linux 文件权限通过 r(读,4)、w(写,2)、x(执行,1)控制,分属 所有者、组、其他用户 三类。使用 chmod 修改权限,chown 修改所有者:
-
示例:
chmod 700 /home/alice # 仅所有者可读写执行 chmod 644 /etc/hosts # 所有者读写,组和其他用户只读 chown root:root /bin/ls # 设置 /bin/ls 所有者为 root:root -
危险权限排查:定期检查全局可写文件(易被篡改):
find / -type f -perm -o+w 2>/dev/null # 查找其他用户可写的文件
3.2 特殊权限控制#
-
SetUID/GID:允许用户执行文件时临时获得所有者权限,需严格限制:
find / -perm -4000 2>/dev/null # 查找所有 SetUID 文件(如 /usr/bin/passwd)非必要时移除 SetUID:
chmod u-s /path/to/file。 -
不可变属性:通过
chattr设置文件为不可变(即使 root 也无法修改):chattr +i /etc/passwd # 防止 /etc/passwd 被篡改 chattr -i /etc/passwd # 解除不可变属性(需修改时)
3.3 分区挂载安全选项#
编辑 /etc/fstab,为敏感分区添加挂载选项增强安全性:
| 选项 | 作用 | 推荐分区 |
|---|---|---|
noexec | 禁止执行分区内程序 | /tmp、/var/tmp |
nodev | 禁止识别设备文件 | /tmp、/home |
nosuid | 禁用 SetUID/GID 权限 | /tmp、/var/tmp |
ro | 只读挂载(如需修改需重新挂载为 rw) | /boot |
示例 /etc/fstab 配置:
/dev/sda5 /tmp ext4 defaults,noexec,nodev,nosuid 0 04. 网络安全防护#
网络是攻击的主要入口,需通过防火墙、服务硬化和协议加固构建防护屏障。
4.1 防火墙配置#
Linux 防火墙主流工具包括 iptables(底层)和 ufw/firewalld(前端管理工具)。
4.1.1 UFW(Uncomplicated Firewall)#
适用于 Debian/Ubuntu,简单易用:
sudo ufw default deny incoming # 默认拒绝所有入站流量
sudo ufw default allow outgoing # 默认允许所有出站流量
sudo ufw allow 22/tcp # 允许 SSH 端口(按需修改端口号)
sudo ufw allow 80/tcp # 允许 HTTP(如需)
sudo ufw allow 443/tcp # 允许 HTTPS(如需)
sudo ufw enable # 启用防火墙(开机自启)
sudo ufw status verbose # 查看规则4.1.2 iptables(高级配置)#
适用于复杂场景,直接操作内核 netfilter 模块:
# 清空现有规则
iptables -F
iptables -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接的入站流量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH(22 端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 保存规则(Debian/Ubuntu)
sudo iptables-save > /etc/iptables/rules.v44.2 服务硬化与端口管理#
-
禁用无用服务:通过
systemctl停止并禁用非必要服务:sudo systemctl stop bluetooth # 停止蓝牙服务 sudo systemctl disable bluetooth # 禁止开机自启 -
端口扫描与排查:定期检查开放端口,确认是否为必要服务:
ss -tuln # 查看所有监听端口(t:TCP, u:UDP, l:监听, n:数字端口) # 示例输出:tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
4.3 SSH 安全加固#
SSH 是远程管理的主要入口,需重点防护:
4.3.1 基础配置加固#
编辑 /etc/ssh/sshd_config,修改以下关键参数:
| 参数 | 推荐值 | 作用 |
|---|---|---|
Port | 非默认端口(如 2222) | 减少端口扫描暴露风险 |
PermitRootLogin | no | 禁止 root 直接登录 |
PasswordAuthentication | no | 禁用密码登录,强制密钥认证 |
PubkeyAuthentication | yes | 启用公钥认证 |
AllowUsers | alice [email protected]/24 | 限制允许登录的用户和 IP |
MaxAuthTries | 3 | 最多允许 3 次认证失败(防止暴力破解) |
ClientAliveInterval | 300 | 5 分钟无活动则断开连接 |
4.3.2 密钥认证配置#
-
客户端生成密钥对:
ssh-keygen -t ed25519 -C "[email protected]" # 生成 Ed25519 密钥(比 RSA 更安全) -
上传公钥到服务器:
ssh-copy-id -p 2222 alice@server-ip # 上传公钥至服务器(需替换端口和用户名) -
服务器验证公钥:公钥保存在
~/.ssh/authorized_keys,权限需为600:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys -
重启 SSH 服务:
sudo systemctl restart sshd,测试密钥登录:ssh -p 2222 alice@server-ip。
5. 恶意软件防护#
Linux 并非对恶意软件免疫(如 CryptoMiner、rootkit、勒索软件),需结合工具主动检测。
5.1 防病毒软件:ClamAV#
ClamAV 是开源防病毒引擎,支持命令行扫描:
# 安装(Debian/Ubuntu)
sudo apt install clamav clamav-daemon -y
# 更新病毒库
sudo freshclam
# 扫描 /home 目录(-r 递归,--bell 扫描完成提示音)
sudo clamscan -r --bell /home
# 扫描并自动删除感染文件(谨慎使用)
sudo clamscan -r --remove /tmp5.2 Rootkit 检测:rkhunter#
rkhunter(Rootkit Hunter)扫描系统异常文件和后门:
# 安装(Debian/Ubuntu)
sudo apt install rkhunter -y
# 更新数据库
sudo rkhunter --update
# 全面扫描
sudo rkhunter --checkall扫描结果保存在 /var/log/rkhunter.log,重点关注 [WARNING] 和 [ALERT] 项。
6. 审计与监控#
安全加固需配合审计和监控,及时发现异常行为。
6.1 auditd:系统审计框架#
auditd 记录系统调用、文件访问等关键操作,配置规则 /etc/audit/rules.d/audit.rules:
- 常用审计规则示例:
重启服务:# 监控 /etc/passwd 修改(用户账户变更) -w /etc/passwd -p wa -k passwd_changes # 监控 sudo 执行(权限提升) -w /usr/bin/sudo -p x -k sudo_exec # 监控 SSH 登录(认证事件) -w /var/log/auth.log -p wa -k ssh_loginsudo systemctl restart auditd,查看日志:ausearch -k passwd_changes。
6.2 日志集中管理#
使用 rsyslog 或 journald 收集日志,推荐发送至集中日志服务器(如 ELK Stack)。
- 查看认证日志(SSH 登录、sudo 操作等):
sudo tail -f /var/log/auth.log # Debian/Ubuntu sudo journalctl -u sshd # 查看 SSH 服务日志(systemd 系统)
6.3 入侵检测:fail2ban#
自动封禁频繁失败的登录尝试(如 SSH 暴力破解):
# 安装
sudo apt install fail2ban -y
# 配置(复制默认配置)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑 jail.local,设置 SSH 防护
[sshd]
enabled = true
port = 2222 # 替换为实际 SSH 端口
maxretry = 3 # 3 次失败后封禁
bantime = 3600 # 封禁 1 小时(单位:秒)重启服务:sudo systemctl restart fail2ban,查看封禁列表:sudo fail2ban-client status sshd。
7. 高级安全机制#
7.1 SELinux 与 AppArmor#
两者均为 Linux 强制访问控制(MAC)框架,限制进程权限,防止越权操作。
SELinux(Security-Enhanced Linux)#
Red Hat 系系统默认启用,基于“策略”控制访问:
- 模式切换:
getenforce # 查看当前模式(Enforcing/Permissive/Disabled) setenforce 0 # 临时切换为 Permissive(仅日志记录不阻止) setenforce 1 # 切换为 Enforcing(强制阻止) - 策略管理:通过
semanage和restorecon管理上下文:semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" # 设置目录为 Apache 可访问 restorecon -Rv /var/www/html # 应用上下文
AppArmor(Application Armor)#
Debian/Ubuntu 主流,基于“路径”控制访问,配置更简单:
- 状态查看:
sudo aa-status - 配置示例:为 Nginx 创建配置文件
/etc/apparmor.d/usr.sbin.nginx,限制其仅访问必要文件: 加载配置:/usr/sbin/nginx { # 允许读取配置文件 /etc/nginx/** r, # 允许写入日志 /var/log/nginx/** w, # 拒绝访问其他路径 deny /home/** rw, }sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx。
7.2 容器安全基础#
Docker 等容器技术需额外加固,避免容器逃逸影响主机:
- 使用非 root 用户运行容器:在 Dockerfile 中添加
USER 非root用户ID。 - 限制容器权限:运行时禁用特权模式,添加安全选项:
docker run --read-only --cap-drop=ALL --security-opt=no-new-privileges nginx--read-only:容器文件系统只读。--cap-drop=ALL:删除所有 Linux capabilities(仅保留必要权限)。
- 启用 Docker Content Trust:验证镜像签名,防止使用篡改镜像:
export DOCKER_CONTENT_TRUST=1 # 启用签名验证
8. 安全加固最佳实践总结#
- 定期更新:自动化补丁管理,最小化漏洞窗口。
- 最小权限:禁用 root 登录,严格控制 sudo 和服务权限。
- 默认拒绝:防火墙默认拒绝入站流量,仅开放必要端口。
- 密钥认证:SSH 禁用密码登录,使用 Ed25519 密钥。
- 审计监控:启用 auditd 和 fail2ban,集中管理日志。
- 减少攻击面:卸载无用服务,关闭非必要端口。
- 定期扫描:使用 ClamAV、rkhunter 检测恶意软件和后门。
- 备份恢复:定期备份关键数据,测试恢复流程。
9. 参考资料#
通过本文的实践,你可以为 Linux 系统构建多层次的安全防护体系。安全是一个持续过程,建议结合威胁情报(如 CVE 数据库)和定期渗透测试,不断优化加固策略。