Linux 安全加固详解:从基础到高级实践

Linux 凭借其稳定性、开源性和高度可定制性,成为服务器、嵌入式系统乃至云计算平台的首选操作系统。然而,“开源”不意味着“天生安全”——默认配置的 Linux 系统往往存在诸多安全隐患,例如弱密码策略、不必要的服务暴露、宽松的文件权限等。这些漏洞可能被攻击者利用,导致数据泄露、服务中断甚至系统完全被接管。

Linux 安全加固(Security Hardening)是一系列通过优化配置、限制攻击面、增强访问控制和提升监控能力,将系统安全性提升至“实战级别”的过程。它不是一次性操作,而是持续的、动态的安全实践,需要结合业务场景、威胁情报和行业标准不断调整。

本文将从基础到高级,系统梳理 Linux 安全加固的核心领域,涵盖系统更新、用户管理、权限控制、网络防护、内核安全等关键环节,并提供实用的配置示例和最佳实践,帮助读者构建更健壮的 Linux 安全体系。

目录#

  1. 系统更新与补丁管理
  2. 用户与账户安全
  3. 文件系统与权限控制
  4. SSH 服务安全加固
  5. 防火墙配置与网络防护
  6. 安全审计与日志监控
  7. 内核安全增强
  8. 应用程序安全
  9. 容器安全加固
  10. 数据备份与灾难恢复
  11. 参考资料

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

核心目标:及时修复操作系统和软件中的已知漏洞,消除“零日漏洞”以外的大部分安全风险。

常见实践#

  • 定期手动执行 apt update && apt upgrade(Debian/Ubuntu)或 dnf update(RHEL/CentOS)更新系统。
  • 忽略低优先级更新以避免业务中断。

最佳实践#

  1. 自动化更新:使用工具实现无人值守更新,避免人为疏忽导致补丁延迟。

    • Debian/Ubuntu:安装 unattended-upgrades
      sudo apt install unattended-upgrades
      sudo dpkg-reconfigure -plow unattended-upgrades  # 启用自动更新
      配置文件 /etc/apt/apt.conf.d/50unattended-upgrades 可指定更新源(如仅安全更新)。
    • RHEL/CentOS:使用 dnf-automatic
      sudo dnf install dnf-automatic
      sudo systemctl enable --now dnf-automatic.timer
  2. 分层更新策略:生产环境先在测试环境验证补丁兼容性,再批量部署。

  3. 漏洞扫描:定期使用工具(如 lynis、openvas)检测未修复漏洞。

    sudo apt install lynis  # 安装安全审计工具
    sudo lynis audit system  # 执行系统扫描,输出漏洞报告

2. 用户与账户安全#

核心目标:严格控制用户权限,防止未授权访问和权限滥用。

常见实践#

  • 使用强密码(如包含大小写字母、数字和特殊符号)。
  • 为管理员分配 sudo 权限而非直接使用 root。

最佳实践#

  1. 禁用直接 root 登录:通过 sudo 分配临时权限,减少 root 账户暴露风险。

    • 编辑 /etc/ssh/sshd_config(见 SSH 加固)。
    • 确保 sudo 权限最小化:编辑 /etc/sudoers(需用 visudo 命令),例如仅允许用户 alice 执行 apt:
      alice ALL=(ALL) NOPASSWD: /usr/bin/apt  # 无需密码执行 apt(谨慎使用)
  2. 密码策略强化:通过 PAM(Pluggable Authentication Modules)强制密码复杂度。

    • 安装 pam_pwquality(Debian/Ubuntu 需 libpam-pwquality):
      sudo apt install libpam-pwquality  # Debian/Ubuntu
      sudo dnf install pam-pwquality     # RHEL/CentOS
    • 编辑 /etc/pam.d/common-password(Debian)或 /etc/pam.d/system-auth(RHEL),添加规则:
      password requisite pam_pwquality.so retry=3 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 个特殊符号
  3. 多因素认证(MFA):为关键账户(如 sudo 用户)启用 MFA,即使密码泄露也能阻止登录。

    • 以 Google Authenticator 为例:
      sudo apt install libpam-google-authenticator  # 安装 PAM 模块
      google-authenticator  # 生成密钥,扫码添加到手机 APP,记录紧急恢复码
    • 编辑 /etc/pam.d/sshd,添加 auth required pam_google_authenticator.so,强制 SSH 登录需 MFA。
  4. 清理无效账户:禁用或删除长期未使用的账户(如 ftp、games 等默认系统账户):

    sudo userdel -r old_user  # 删除账户及家目录
    sudo usermod -L expired_user  # 锁定账户(无法登录,但保留数据)

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

核心目标:通过严格的文件权限和属性控制,防止敏感文件被篡改或泄露。

常见实践#

  • 使用 chmod 修改文件权限,如 chmod 600 ~/.ssh/id_rsa。
  • 避免设置 777 等“世界可写”权限。

最佳实践#

  1. 遵循最小权限原则:仅授予用户/进程完成任务所需的最小权限。

    • 检查敏感文件权限(如 /etc/passwd、/etc/shadow):
      ls -l /etc/passwd  # 应为 -rw-r--r--(root 可写,其他只读)
      ls -l /etc/shadow  # 应为 -rw-------(仅 root 可读可写)
    • 查找“世界可写”文件(高风险):
      find / -perm -0002 -type f -print 2>/dev/null  # 忽略错误输出
  2. 文件不可变属性:使用 chattr 锁定关键系统文件,防止意外或恶意修改:

    sudo chattr +i /etc/passwd  # 添加不可变属性(需 root 权限才能解除)
    sudo chattr -i /etc/passwd  # 解除锁定(修改前执行)
  3. 分区挂载安全选项:在 /etc/fstab 中为分区添加安全挂载参数,限制风险:

    • noexec:禁止执行分区内的二进制文件(如 /tmp、/var/tmp)。
    • nosuid:禁止设置 SUID 权限(防止特权提升)。
    • nodev:禁止创建设备文件。
      示例 /etc/fstab 配置:
    /dev/sda5 /tmp ext4 defaults,noexec,nosuid,nodev 0 0

4. SSH 服务安全加固#

核心目标:SSH 是远程管理的主要入口,需通过配置限制攻击面,防止暴力破解和未授权访问。

常见实践#

  • 修改默认 SSH 端口(22)为非标准端口(如 2222)。
  • 禁用密码登录,使用 SSH 密钥认证。

最佳实践#

  1. 关键配置优化:编辑 /etc/ssh/sshd_config,应用以下规则:

    Port 2222                # 变更默认端口(减少扫描风险)
    PermitRootLogin no       # 禁止 root 直接登录
    PasswordAuthentication no  # 禁用密码登录,强制密钥认证
    PubkeyAuthentication yes  # 启用公钥认证
    AllowUsers alice bob     # 仅允许指定用户登录(白名单)
    PermitEmptyPasswords no  # 禁止空密码
    ClientAliveInterval 300  # 5分钟无活动则断开连接

    修改后重启服务:sudo systemctl restart sshd。

  2. 密钥认证强化:

    • 生成高强度密钥(ED25519 算法比 RSA 更安全且性能更好):
      ssh-keygen -t ed25519 -C "server-ssh-key"  # 生成密钥对
    • 限制私钥权限:chmod 600 ~/.ssh/id_ed25519
    • 公钥部署到服务器:ssh-copy-id -p 2222 alice@server_ip
  3. 防御暴力破解:使用 fail2ban 自动封禁多次登录失败的 IP:

    sudo apt install fail2ban  # 安装工具
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local  # 复制默认配置

    编辑 /etc/fail2ban/jail.local,启用 SSH 防护:

    [sshd]
    enabled = true
    port = 2222  # 匹配自定义 SSH 端口
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 3  # 3次失败则封禁
    bantime = 3600  # 封禁 1 小时

    重启服务:sudo systemctl restart fail2ban。

5. 防火墙配置与网络防护#

核心目标:通过防火墙限制网络访问,仅开放必要端口,阻断恶意流量。

常见实践#

  • 使用 ufw(简单)或 firewalld(动态)管理防火墙规则。
  • 允许 SSH(22)、HTTP(80)等必要端口。

最佳实践#

  1. 默认策略为“拒绝所有”:仅显式允许业务必需的端口和协议,最小化攻击面。

    • UFW(Debian/Ubuntu 默认):
      sudo ufw default deny incoming  # 默认拒绝所有入站流量
      sudo ufw default allow outgoing  # 默认允许出站流量(可根据需求收紧)
      sudo ufw allow 2222/tcp  # 允许 SSH(自定义端口)
      sudo ufw allow 443/tcp   # 允许 HTTPS
      sudo ufw enable          # 启用防火墙(重启后生效)
      sudo ufw status verbose  # 查看规则状态
    • Firewalld(RHEL/CentOS 默认):
      sudo firewall-cmd --set-default-zone=drop  # 默认拒绝入站
      sudo firewall-cmd --add-port=2222/tcp --permanent  # 永久开放 SSH
      sudo firewall-cmd --reload  # 应用规则
  2. 状态化规则:仅允许“已建立连接”的出站流量响应(如 HTTP 客户端请求后的服务器响应)。

    • UFW 默认支持状态化规则(通过 iptables 的 --state ESTABLISHED,RELATED)。
  3. 限制源 IP:对管理端口(如 SSH)仅允许特定 IP 段访问(如公司办公网):

    sudo ufw allow from 192.168.1.0/24 to any port 2222/tcp  # 仅允许内网 SSH 登录
  4. 禁用不必要的网络服务:关闭未使用的端口和服务(如 telnet、rpcbind):

    sudo systemctl disable --now rpcbind  # 禁用 RPC 服务
    sudo netstat -tulpn  # 检查监听端口,确认无异常服务

6. 安全审计与日志监控#

核心目标:通过日志记录和审计,及时发现异常行为(如暴力破解、文件篡改),为事后溯源提供依据。

常见实践#

  • 使用 journalctl 查看系统日志,logrotate 管理日志文件大小。

最佳实践#

  1. 集中化日志管理:将多台服务器日志汇总到中央系统(如 ELK Stack、Graylog),便于全局分析。

    • 配置 rsyslog 发送日志到中央服务器:编辑 /etc/rsyslog.conf,添加:
      *.* @@logserver.example.com:514  # 通过 UDP 发送所有日志(@@ 表示 TCP)
  2. 关键文件监控:使用 auditd 记录对敏感文件(如 /etc/passwd、/usr/bin/sudo)的访问和修改:

    sudo apt install auditd  # 安装审计服务
    sudo auditctl -w /etc/passwd -p wa -k passwd_changes  # 添加监控规则(w=写,a=属性变更)

    查看审计日志:

    ausearch -k passwd_changes  # 按关键词查询日志

    永久保存规则:编辑 /etc/audit/rules.d/audit.rules,添加上述 auditctl 命令(不含 auditctl)。

  3. 实时异常检测:使用工具(如 ossec、wazuh)监控日志中的异常模式(如大量失败登录、root 权限切换)。

7. 内核安全增强#

核心目标:通过内核级防护机制,限制进程权限,抵御内核漏洞利用。

常见实践#

  • 禁用不必要的内核模块(如 usb_storage,防止物理接入攻击)。

最佳实践#

  1. 启用内核安全模块:

    • SELinux(RHEL/CentOS 默认):强制访问控制(MAC),限制进程只能访问预定义资源。
      sudo setenforce 1  # 临时启用(重启失效)
      sudo sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config  # 永久启用
      提示:SELinux 规则较复杂,可先在 permissive 模式下调试,避免误拦截业务。
    • AppArmor(Debian/Ubuntu 默认):为特定应用(如 Nginx、Docker)定义安全配置文件,限制其行为。
      sudo aa-status  # 查看已启用的 AppArmor 配置文件
      sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx  # 强制 Nginx 遵循配置
  2. 限制内核模块加载:编辑 /etc/modprobe.d/blacklist.conf,禁用高风险模块:

    blacklist usb_storage  # 禁止 USB 存储设备(物理安全)
    blacklist firewire_core  # 禁止火线接口
  3. 启用地址空间布局随机化(ASLR):防止缓冲区溢出攻击通过固定内存地址定位目标:

    sudo sysctl -w kernel.randomize_va_space=2  # 启用 full ASLR(默认值,确认即可)

8. 应用程序安全#

核心目标:确保运行在 Linux 上的应用(如 Web 服务、数据库)自身安全,避免成为攻击入口。

常见实践#

  • 定期更新应用程序(如 nginx、mysql)到最新安全版本。

最佳实践#

  1. 以非 root 用户运行服务:服务进程若被攻陷,可限制攻击范围(避免直接获取 root 权限)。

    • 示例:修改 Nginx 运行用户(默认 www-data 为低权限用户):
      编辑 /etc/nginx/nginx.conf:
      user nginx-user;  # 自定义低权限用户(需提前创建:useradd -r -s /sbin/nologin nginx-user)

    重启 Nginx:sudo systemctl restart nginx,验证用户:ps aux | grep nginx。

  2. 禁用应用不必要功能:如 Nginx 禁用 autoindex(目录浏览)、MySQL 禁用 LOAD DATA LOCAL INFILE(防止文件读取漏洞)。

  3. 应用漏洞扫描:使用 nikto(Web 服务)、sqlmap(数据库)等工具检测应用层漏洞:

    nikto -h https://example.com  # 扫描 Web 服务器漏洞(如过时组件、配置错误)

9. 容器安全加固#

核心目标:在容器化环境(Docker、Kubernetes)中,隔离容器与主机,防止容器逃逸。

常见实践#

  • 使用官方镜像,避免未知来源的第三方镜像。

最佳实践#

  1. 非 root 容器:容器内进程使用普通用户,而非默认的 root(容器内 root 仍可能通过漏洞提权到主机)。

    • Dockerfile 中指定用户:
      FROM nginx:alpine
      RUN adduser -D appuser  # 创建非 root 用户
      USER appuser  # 切换到普通用户运行
    • 运行时强制非 root:docker run --user 1000:1000 nginx(使用 UID/GID 而非用户名)。
  2. 只读文件系统:容器根目录设为只读,仅挂载必要的可写目录(如日志、临时文件):

    docker run --read-only -v /tmp/logs:/var/log/nginx nginx  # 仅 /var/log/nginx 可写
  3. 限制系统调用:使用 seccomp 过滤容器允许的系统调用(syscall),减少攻击面:

    docker run --security-opt seccomp=default.json nginx  # 应用自定义 seccomp 配置

    default.json 可禁用高风险 syscall(如 mount、ptrace)。

  4. 镜像安全扫描:使用 trivy 检测镜像中的漏洞:

    trivy image nginx:alpine  # 输出镜像内的 OS 漏洞、应用依赖漏洞

10. 数据备份与灾难恢复#

核心目标:确保数据在系统被破坏或勒索软件攻击后,可快速恢复,减少业务中断。

常见实践#

  • 使用 rsync 或 tar 定期备份数据到外部存储。

最佳实践#

  1. 加密备份:防止备份数据泄露(如备份硬盘物理丢失)。

    • 使用 borgbackup(支持加密和增量备份):
      borg init --encryption=repokey /backup/repo  # 创建加密备份仓库
      borg create /backup/repo::$(date +%Y%m%d) /data  # 备份 /data 目录
  2. 定期测试恢复流程:备份的有效性需通过实际恢复验证(如每月进行一次恢复测试)。

  3. 异地备份:将备份数据存储在与生产环境物理隔离的位置(如云存储、异地机房),防止单点灾难(如火灾、地震)。

  4. 制定灾难恢复计划(DRP):文档化恢复步骤、责任人、时间目标(RTO/RPO),并定期演练。

参考资料#

通过以上措施,可显著提升 Linux 系统的抗攻击能力。但安全是“动态过程”,需结合实际业务场景持续优化——定期进行漏洞扫描、渗透测试,并关注最新的安全漏洞和防御技术,才能构建真正“与时俱进”的安全体系。