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-automatic

    sudo 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)配置密码复杂度:

    1. 安装 pam_cracklib(Debian/Ubuntu:sudo apt install libpam-cracklib)。
    2. 编辑 /etc/pam.d/common-password,添加规则:
      password requisite pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
      • minlen=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 0

4. 网络安全防护#

网络是攻击的主要入口,需通过防火墙、服务硬化和协议加固构建防护屏障。

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.v4

4.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)减少端口扫描暴露风险
PermitRootLoginno禁止 root 直接登录
PasswordAuthenticationno禁用密码登录,强制密钥认证
PubkeyAuthenticationyes启用公钥认证
AllowUsersalice [email protected]/24限制允许登录的用户和 IP
MaxAuthTries3最多允许 3 次认证失败(防止暴力破解)
ClientAliveInterval3005 分钟无活动则断开连接

4.3.2 密钥认证配置#

  1. 客户端生成密钥对:

    ssh-keygen -t ed25519 -C "[email protected]"  # 生成 Ed25519 密钥(比 RSA 更安全)
  2. 上传公钥到服务器:

    ssh-copy-id -p 2222 alice@server-ip  # 上传公钥至服务器(需替换端口和用户名)
  3. 服务器验证公钥:公钥保存在 ~/.ssh/authorized_keys,权限需为 600:

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  4. 重启 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 /tmp

5.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_login
    重启服务:sudo 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. 安全加固最佳实践总结#

  1. 定期更新:自动化补丁管理,最小化漏洞窗口。
  2. 最小权限:禁用 root 登录,严格控制 sudo 和服务权限。
  3. 默认拒绝:防火墙默认拒绝入站流量,仅开放必要端口。
  4. 密钥认证:SSH 禁用密码登录,使用 Ed25519 密钥。
  5. 审计监控:启用 auditd 和 fail2ban,集中管理日志。
  6. 减少攻击面:卸载无用服务,关闭非必要端口。
  7. 定期扫描:使用 ClamAV、rkhunter 检测恶意软件和后门。
  8. 备份恢复:定期备份关键数据,测试恢复流程。

9. 参考资料#

通过本文的实践,你可以为 Linux 系统构建多层次的安全防护体系。安全是一个持续过程,建议结合威胁情报(如 CVE 数据库)和定期渗透测试,不断优化加固策略。