Linux 系统加固:从基础到进阶的全方位安全实践

Linux 凭借其开源、稳定和高度可定制的特性,广泛应用于服务器、嵌入式设备和云环境。然而,默认安装的 Linux 系统往往并非为“安全优先”设计——它们可能启用了不必要的服务、保留了默认账户、开放了风险端口,这些都可能成为攻击者的突破口。系统加固(OS Hardening) 是通过一系列技术手段和配置优化,减少系统攻击面、提升安全防护能力的过程。其核心目标是:最小化权限暴露、强化访问控制、确保数据完整性,并建立有效的监控机制。

本文将从基础到进阶,详细介绍 Linux 系统加固的关键领域、最佳实践及实操案例,帮助系统管理员和安全工程师构建更安全的 Linux 环境。

目录#

  1. 系统更新与补丁管理
  2. 用户账户与权限管理
  3. 文件系统安全与权限控制
  4. 网络安全加固
  5. 服务与进程管理
  6. 内核安全强化
  7. 日志审计与监控
  8. 高级加固:容器与虚拟化环境
  9. 总结与最佳实践
  10. 参考资料

1. 系统更新与补丁管理#

系统漏洞是攻击者最常用的入侵途径之一,及时更新系统和应用软件是加固的第一道防线。

1.1 常见实践#

  • 手动更新:通过包管理器(如 apt、yum、dnf)定期执行更新命令。
    # Debian/Ubuntu
    sudo apt update && sudo apt upgrade -y
     
    # RHEL/CentOS/Rocky Linux
    sudo dnf update -y  # 或 yum update -y
  • 检查安全更新:使用工具筛选仅安全相关的补丁。
    # Debian/Ubuntu:列出安全更新
    sudo apt list --upgradable | grep -i security
     
    # RHEL/CentOS:启用 security 仓库后检查
    sudo dnf check-update --security

1.2 最佳实践#

  • 自动更新:配置自动化工具(如 unattended-upgrades、dnf-automatic)确保关键安全补丁无需人工干预即可应用。

    # Debian/Ubuntu 安装并配置 unattended-upgrades
    sudo apt install unattended-upgrades
    sudo dpkg-reconfigure -plow unattended-upgrades  # 交互式启用自动更新

    配置文件路径:/etc/apt/apt.conf.d/50unattended-upgrades,可设置更新频率、黑名单(如避免自动更新内核)。

  • 补丁测试:在生产环境更新前,先在 staging 环境测试补丁兼容性,避免业务中断。

  • 漏洞扫描:定期使用工具(如 lynis、rkhunter)扫描系统漏洞,确保未遗漏高危补丁。

    # 安装 lynis(系统审计工具)
    sudo apt install lynis  # 或手动下载:https://cisofy.com/lynis/
    sudo lynis audit system  # 执行系统审计,输出漏洞和加固建议

2. 用户账户与权限管理#

用户账户是系统访问的入口,权限失控可能直接导致数据泄露或系统被接管。

2.1 账户清理与最小权限#

  • 删除冗余账户:禁用或删除默认账户(如 games、news)、过期账户及未使用账户。

    # 查看所有账户
    cat /etc/passwd | grep -v nologin | grep -v false
     
    # 锁定账户(保留数据)
    sudo passwd -l <用户名>
     
    # 删除账户(彻底移除)
    sudo userdel -r <用户名>  # -r 同时删除家目录
  • 禁用 root 直接登录:通过 SSH 或物理终端直接登录 root 账户风险极高,应仅允许通过 sudo 提权。

    # 编辑 SSH 配置文件
    sudo vim /etc/ssh/sshd_config

    设置 PermitRootLogin no,然后重启 SSH 服务:

    sudo systemctl restart sshd

2.2 密码策略与认证强化#

  • 密码复杂度:通过 PAM(Pluggable Authentication Modules)配置密码长度、复杂度和有效期。 编辑 /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL),添加 pam_pwquality 模块:

    password    requisite     pam_pwquality.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 中设置密码最大有效期(如 90 天):

    PASS_MAX_DAYS   90
    PASS_MIN_DAYS   7    # 两次修改间隔至少7天
    PASS_WARN_AGE   14   # 过期前14天警告
  • SSH 密钥认证:禁用密码登录,强制使用 SSH 密钥(更安全,避免暴力破解)。

    # 客户端生成密钥对
    ssh-keygen -t ed25519 -C "[email protected]"  # 推荐 ed25519 算法(比 RSA 更安全)
     
    # 上传公钥到服务器
    ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

    服务器端配置 /etc/ssh/sshd_config:

    PasswordAuthentication no  # 禁用密码登录
    PubkeyAuthentication yes   # 启用密钥登录
    AuthorizedKeysFile .ssh/authorized_keys  # 公钥存放路径
  • 双因素认证(2FA):通过 pam_google_authenticator 为 SSH 或 sudo 添加二次验证。

    # 安装模块
    sudo apt install libpam-google-authenticator  # Debian/Ubuntu
    sudo dnf install google-authenticator-libpam  # RHEL
     
    # 为用户配置 2FA(每个用户需单独执行)
    google-authenticator  # 生成密钥,扫描二维码到认证APP(如Google Authenticator)

    编辑 /etc/pam.d/sshd,添加:

    auth required pam_google_authenticator.so

2.3 sudo 权限控制#

  • 最小化 sudo 用户:仅授权必要用户使用 sudo,避免过度权限。
    # 添加用户到 sudo 组(Debian/Ubuntu)
    sudo usermod -aG sudo <用户名>
     
    # RHEL/CentOS:添加到 wheel 组(需确保 /etc/sudoers 中 wheel 组有权限)
    sudo usermod -aG wheel <用户名>
  • 限制 sudo 命令:通过 /etc/sudoers(或 /etc/sudoers.d/ 目录)细化用户可执行的命令,避免 sudo su - 获取完整 root 权限。
    # 示例:允许 user1 仅执行 /usr/bin/systemctl restart nginx
    user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
    编辑时需使用 visudo 命令(自动检查语法错误,避免锁死 sudo)。

3. 文件系统安全与权限控制#

文件系统权限和属性直接影响数据保密性和完整性,需严格限制敏感文件的访问范围。

3.1 基础权限配置#

  • 敏感文件权限:确保关键系统文件权限最小化(如 /etc/passwd、/etc/shadow、/root)。

    # /etc/passwd(用户信息):仅 root 可写,其他用户可读
    sudo chmod 644 /etc/passwd
     
    # /etc/shadow(密码哈希):仅 root 可读/写
    sudo chmod 600 /etc/shadow
     
    # /root 目录:仅 root 可访问
    sudo chmod 700 /root
  • 删除世界可写文件:定期扫描并修复权限过松的文件(如 chmod o+w)。

    # 查找世界可写文件(排除 /proc 和 /sys 虚拟文件系统)
    sudo find / -path /proc -prune -o -path /sys -prune -o -perm -0002 -print

3.2 文件系统属性与挂载选项#

  • 不可变文件:通过 chattr 设置关键配置文件为不可变(防止篡改,需 root 权限解除)。

    # 设置 /etc/resolv.conf(DNS配置)为不可变
    sudo chattr +i /etc/resolv.conf
     
    # 解除不可变属性(需修改时)
    sudo chattr -i /etc/resolv.conf
  • 挂载选项加固:在 /etc/fstab 中为分区添加安全挂载选项,限制执行、SUID 权限等。

    # 示例:/tmp(临时文件)禁用执行、SUID、设备节点
    tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
     
    # /home(用户目录)禁止 SUID/GUID
    /dev/sda3 /home ext4 defaults,nosuid,nodev 0 0

    常用选项:

    • noexec:禁止执行文件
    • nosuid:禁止 SUID/GID 位生效(防止特权提升)
    • nodev:禁止创建设备节点
    • ro:只读挂载(如 /boot)

3.3 强制访问控制(MAC):SELinux 与 AppArmor#

  • SELinux(Security-Enhanced Linux):Red Hat 系系统默认启用的 MAC 系统,通过“策略”限制进程权限(如禁止 Apache 读写 /tmp 外的文件)。

    • 确保 SELinux 处于 enforcing 模式(而非 permissive 或 disabled):
      sudo setenforce 1  # 临时生效
      sudo vim /etc/selinux/config  # 永久生效:SELINUX=enforcing
    • 审计 SELinux 拒绝事件:sudo ausearch -m AVC,USER_AVC -ts recent。
  • AppArmor:Debian/Ubuntu 常用的 MAC 系统,通过“配置文件”定义进程访问规则(如限制 Nginx 仅访问 /var/www)。

    • 启用并加载 AppArmor 配置:
      sudo systemctl enable --now apparmor
      sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx  # 对 Nginx 启用强制模式

4. 网络安全加固#

网络是系统暴露在外的主要接口,需限制端口开放范围、过滤恶意流量。

4.1 防火墙配置#

  • 默认拒绝策略:防火墙遵循“最小权限”原则,仅开放必要端口(如 SSH 22、HTTP 80),默认拒绝所有其他入站流量。
    • ufw(简单防火墙,Debian/Ubuntu 默认):
      sudo ufw default deny incoming  # 默认拒绝入站
      sudo ufw default allow outgoing  # 默认允许出站
      sudo ufw allow 22/tcp  # 允许 SSH(仅 TCP)
      sudo ufw allow 443/tcp  # 允许 HTTPS
      sudo ufw enable  # 启用防火墙(开机自启)
      sudo ufw status numbered  # 查看规则
    • firewalld(RHEL/CentOS 默认):
      sudo firewall-cmd --set-default-zone=drop  # 默认拒绝入站
      sudo firewall-cmd --add-port=22/tcp --permanent  # 永久开放 SSH
      sudo firewall-cmd --reload  # 应用规则
    • iptables(底层工具,适用于复杂规则):
      # 默认拒绝入站,允许回环和已建立连接
      sudo iptables -P INPUT DROP
      sudo iptables -A INPUT -i lo -j ACCEPT
      sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # 允许 SSH

4.2 网络服务与端口限制#

  • 禁用不必要端口:通过 ss 或 netstat 检查监听端口,关闭未使用的服务。

    # 查看所有监听端口(TCP/UDP)
    sudo ss -tuln

    例如,若发现 rpcbind(端口 111)未使用,立即禁用:

    sudo systemctl disable --now rpcbind
  • SSH 安全强化:

    • 修改默认端口(22)为非标准端口(如 2222),减少扫描风险:
      sudo vim /etc/ssh/sshd_config
      Port 2222  # 添加此行(删除默认 Port 22)
      sudo systemctl restart sshd
    • 限制来源 IP:通过 AllowUsers 或 AllowGroups 仅允许指定 IP 登录。
      # /etc/ssh/sshd_config
      AllowUsers [email protected]/24  # 仅允许 192.168.1.0 网段的 user1 登录

4.3 TCP/IP 协议栈加固#

通过内核参数(sysctl)优化网络协议栈,防御 DDoS、SYN Flood 等攻击。 编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf,添加以下配置:

# 启用 SYN Cookie(防御 SYN Flood)
net.ipv4.tcp_syncookies = 1
 
# 限制 SYN 半连接队列大小
net.ipv4.tcp_max_syn_backlog = 2048
 
# 禁用 ICMP 重定向(防止中间人攻击)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
 
# 禁用 IP 转发(非路由服务器)
net.ipv4.ip_forward = 0
 
# 限制每个 IP 的连接数(防 DoS)
net.ipv4.tcp_max_tw_buckets = 5000

应用配置:sudo sysctl -p。

5. 服务与进程管理#

禁用不必要的服务可减少攻击面,同时通过进程隔离限制漏洞影响范围。

5.1 禁用冗余服务#

  • 列出并禁用自启动服务:通过 systemctl 检查运行中的服务,禁用未使用的服务(如 cups、bluetooth、telnet)。
    # 列出所有自启动服务
    sudo systemctl list-unit-files --type=service --state=enabled
     
    # 禁用服务(立即停止并禁止开机自启)
    sudo systemctl disable --now cups

5.2 进程隔离与限制#

  • systemd 服务加固:通过服务单元文件(.service)添加安全选项,限制进程权限。 编辑服务文件(如 /etc/systemd/system/nginx.service),在 [Service] 段添加:

    [Service]
    PrivateTmp=yes           # 为进程分配独立的 /tmp 目录
    ProtectSystem=strict     # 只读挂载 /usr、/boot、/etc(除 /etc/resolv.conf 等)
    ProtectHome=yes          # 保护 /home 目录(不可写)
    NoNewPrivileges=yes      # 禁止提升权限(如通过 SUID)
    CapDrop=ALL              # 移除所有 Linux  capabilities(仅保留必要的)
    RestrictAddressFamilies=AF_INET AF_INET6  # 限制网络协议族(仅 IPv4/IPv6)

    重新加载并重启服务:

    sudo systemctl daemon-reload
    sudo systemctl restart nginx
  • 检查服务安全等级:使用 systemd-analyze security 评估服务加固效果。

    sudo systemd-analyze security nginx  # 输出安全评分(0=最安全,10=最危险)

6. 内核安全强化#

内核是系统的核心,通过内核参数、模块控制和安全机制加固可防御底层漏洞。

6.1 内核参数优化#

除了网络相关参数(见 4.3 节),还需配置以下内核安全选项:

# /etc/sysctl.d/99-security.conf
kernel.randomize_va_space=2  # 启用地址空间随机化(ASLR,防缓冲区溢出)
kernel.exec-shield=1         # 启用执行保护(防代码注入)
kernel.sysrq=0               # 禁用 SysRq 键(防止物理终端强制重启)
fs.protected_hardlinks=1     # 保护硬链接(防止通过硬链接提权)
fs.protected_symlinks=1      # 保护符号链接(防止权限绕过)

6.2 内核模块控制#

  • 禁用危险模块:通过 /etc/modprobe.d/blacklist.conf 黑名单禁用不必要或高危模块(如 usb_storage、firewire、pcspkr)。

    blacklist usb_storage  # 禁用 USB 存储(防物理接入盗取数据)
    blacklist firewire-core
  • 限制模块加载:通过 sysctl 禁止非 root 用户加载模块。

    kernel.modules_disable=1  # 禁止所有模块加载(需提前加载必要模块)

6.3 内核安全机制#

  • 启用内核审计:通过 auditd 监控内核事件(如模块加载、系统调用)。

    sudo apt install auditd  # 安装审计服务
    sudo systemctl enable --now auditd

    添加审计规则(/etc/audit/rules.d/audit.rules):

    -w /etc/passwd -p wa -k identity  # 监控 /etc/passwd 写入/属性变更
    -w /sbin/insmod -p x -k modules   # 监控模块加载命令

    重启 auditd 并查看日志:sudo ausearch -k identity。

  • 启用内核漏洞缓解技术:确保 CPU 和内核支持并启用 KASLR(内核地址空间随机化)、SMEP( Supervisor Mode Execution Prevention)、SMAP(Supervisor Mode Access Prevention)等机制。可通过 dmesg 或 /proc/cpuinfo 检查:

    dmesg | grep -i kaslr  # 检查 KASLR 是否启用
    grep -E 'smep|smap' /proc/cpuinfo  # 检查 CPU 是否支持 SMEP/SMAP

7. 日志审计与监控#

日志是检测入侵和故障排查的关键,需确保日志完整、不可篡改,并及时告警异常行为。

7.1 日志配置与保护#

  • 集中化日志管理:使用 rsyslog 或 systemd-journald 将日志发送至中央服务器(如 ELK Stack、Graylog),避免日志被本地篡改。 编辑 /etc/rsyslog.conf,添加远程日志服务器配置:

    *.* @@logs.example.com:514  # 通过 TCP 发送所有日志到远程服务器
  • 日志文件保护:设置日志文件权限为只读(除 root 和日志进程外),并通过 chattr 防止删除。

    sudo chmod 600 /var/log/auth.log  # 认证日志(记录 SSH 登录等)
    sudo chattr +a /var/log/auth.log  # 设置为 append-only(仅可追加,不可删除)

7.2 关键日志监控#

  • 监控认证日志:重点关注 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL)中的异常登录(如多次失败、非常规时间登录)。

    # 查看最近 10 条 SSH 登录记录
    sudo grep "Accepted publickey" /var/log/auth.log | tail -10
     
    # 检测 SSH 暴力破解尝试(多次失败登录)
    sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head
  • 文件完整性监控(FIM):通过 aide 或 tripwire 监控关键文件变更(如 /etc/passwd、/bin/bash)。

    # 安装 aide
    sudo apt install aide
    sudo aideinit  # 生成初始基线(存于 /var/lib/aide/aide.db.new.gz)
    sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz  # 替换为正式基线
    sudo aide --check  # 对比当前系统与基线,检测变更

7.3 自动化告警#

  • 配置日志告警:通过 logwatch 或自定义脚本(如结合 grep + mail),当检测到异常时发送邮件告警。
    # 安装 logwatch
    sudo apt install logwatch
    sudo vim /etc/logwatch/conf/logwatch.conf
    设置 MailTo = [email protected],每日自动发送日志摘要。

8. 高级加固:容器与虚拟化环境#

随着容器技术普及,需针对 Docker、Kubernetes 等环境进行额外加固。

8.1 Docker 容器加固#

  • 使用非 root 用户运行容器:在 Dockerfile 中通过 USER 指定低权限用户,避免容器内进程直接以 root 运行。

    FROM nginx:alpine
    RUN adduser -D appuser
    USER appuser  # 切换为非 root 用户
  • 限制容器权限:通过 --read-only、--cap-drop、--security-opt 等参数限制容器资源和权限。

    # 只读文件系统 + 移除所有 capabilities + 禁用特权模式
    docker run --read-only --cap-drop=ALL --user=1000:1000 --security-opt=no-new-privileges nginx
  • 使用 seccomp 配置文件:限制容器可调用的系统调用(syscall)。

    # 使用默认 seccomp 配置(禁止危险 syscall)
    docker run --security-opt seccomp=default.json nginx

8.2 Kubernetes 安全#

  • Pod 安全上下文:在 Pod 定义中通过 securityContext 限制容器权限。

    apiVersion: v1
    kind: Pod
    metadata:
      name: secure-pod
    spec:
      securityContext:
        runAsNonRoot: true  # 禁止 root 运行
        runAsUser: 1000     # 指定 UID
        fsGroup: 1000       # 文件系统组 ID
      containers:
      - name: app
        image: nginx
        securityContext:
          allowPrivilegeEscalation: false  # 禁止权限提升
          capabilities:
            drop: ["ALL"]  # 移除所有 capabilities
  • 网络策略:通过 NetworkPolicy 限制 Pod 间通信,仅允许必要流量。

9. 总结与最佳实践#

Linux 系统加固是一个持续过程,需结合“最小权限”“纵深防御”原则,从多个层面构建安全体系:

  1. 定期更新与漏洞扫描:自动化补丁管理,使用 lynis、aide 等工具定期审计。
  2. 严格的身份认证:禁用 root 登录、强制 SSH 密钥 + 2FA、复杂密码策略。
  3. 最小化攻击面:禁用冗余服务、限制开放端口、加固文件系统权限。
  4. 进程与资源隔离:通过 systemd、容器安全选项限制进程权限。
  5. 完善的日志监控:集中化日志、实时告警异常行为(如暴力破解、文件篡改)。

关键原则:没有“一劳永逸”的加固方案,需定期参考最新安全标准(如 CIS 基准)、监控漏洞情报,并结合业务场景调整策略。

10. 参考资料#

通过以上步骤,可显著提升 Linux 系统的抗攻击能力。安全是动态的,建议结合实际业务需求,持续优化加固策略。