精通 Linux 安全与加固:从基础到高级实践指南

Linux 凭借其开源特性、稳定性和灵活性,已成为服务器、云计算、物联网(IoT)乃至关键基础设施的首选操作系统。然而,“开源”不意味着“天生安全”——任何系统的安全性都取决于配置、补丁管理和用户实践。随着网络攻击手段日益复杂(如勒索软件、APT 攻击、供应链攻击),Linux 系统的安全加固已从“可选项”变为“必选项”。

本文将系统梳理 Linux 安全加固的核心领域,从基础配置到高级防护,结合最佳实践和具体示例,帮助读者构建纵深防御体系。无论你是系统管理员、开发运维工程师(DevOps),还是安全爱好者,都能从中获取实用的加固策略。

目录#

  1. 基础安全基石:系统更新与启动保护

  2. 用户与访问控制:最小权限原则实践

    • 2.1 强密码策略与密码老化
    • 2.2 禁用 root 直接登录与 sudo 精细化配置
    • 2.3 PAM(可插拔认证模块)防护
  3. 网络安全:边界防御与通信加密

    • 3.1 防火墙配置(UFW/Firewalld/iptables)
    • 3.2 SSH 深度加固
    • 3.3 禁用不必要网络服务与端口限制
    • 3.4 VPN 与传输加密
  4. 系统加固:内核、文件系统与权限控制

    • 4.1 文件系统安全(fstab 选项与 tmpfs)
    • 4.2 SUID/GUID 文件清理与权限最小化
    • 4.3 内核安全(sysctl 调优与安全模块)
    • 4.4 AppArmor 与 SELinux:强制访问控制
  5. 应用安全:从安装到沙箱隔离

    • 5.1 软件包验证与可信源配置
    • 5.2 应用沙箱(Firejail/Systemd-nspawn)
    • 5.3 Web 服务器与数据库安全加固
  6. 监控与审计:威胁检测与日志分析

    • 6.1 集中化日志管理(rsyslog/Journald)
    • 6.2 文件完整性监控(AIDE/Tripwire)
    • 6.3 入侵检测(Fail2ban 与 auditd)
  7. 事件响应:从备份到恢复

    • 7.1 备份策略与工具(rsync/BorgBackup)
    • 7.2 事件处置流程(检测→遏制→根除→恢复)
  8. 高级安全主题

    • 8.1 容器安全(Docker 与 Kubernetes)
    • 8.2 双因素认证(2FA)部署
    • 8.3 全盘加密(LUKS/dm-crypt)
  9. 参考资料

1. 基础安全基石:系统更新与启动保护#

1.1 系统更新与补丁管理#

Linux 系统的安全始于及时更新。漏洞修复通常通过系统补丁发布,延迟更新会使系统暴露于已知风险中。

最佳实践:

  • 定期手动更新(适用于关键业务,需测试兼容性)。
  • 配置自动更新(适用于非关键系统,降低运维成本)。

示例操作:

  • Debian/Ubuntu:

    # 手动更新
    sudo apt update && sudo apt upgrade -y
    # 安装自动更新工具
    sudo apt install unattended-upgrades
    # 启用自动更新(编辑配置文件 /etc/apt/apt.conf.d/50unattended-upgrades)
    sudo dpkg-reconfigure -plow unattended-upgrades
  • RHEL/CentOS:

    # 手动更新
    sudo yum update -y  # 或 dnf update -y(CentOS 8+)
    # 配置自动更新
    sudo yum install dnf-automatic -y
    sudo systemctl enable --now dnf-automatic.timer

1.2 安全启动(Secure Boot)与 UEFI 防护#

安全启动是 UEFI 的特性,通过验证启动加载程序的数字签名,防止恶意代码在系统启动时执行。

检查与启用:

  • 进入 BIOS/UEFI 设置,启用“Secure Boot”。
  • 验证状态(需安装 mokutil):
    mokutil --sb-state  # 输出 "SecureBoot enabled" 表示已启用

1.3 BIOS/UEFI 密码设置#

BIOS/UEFI 密码可防止未授权用户修改启动顺序(如通过 USB 设备启动恶意系统)。

操作步骤:

  1. 重启系统,按厂商指定键(如 F2、Del)进入 BIOS/UEFI 设置。
  2. 找到“Security”→“Set Supervisor Password”,设置强密码。
  3. 保存并退出。

2. 用户与访问控制:最小权限原则实践#

2.1 强密码策略与密码老化#

弱密码是常见攻击入口,需通过策略强制复杂度与定期更换。

配置强密码策略:

  • 安装 libpam-pwquality(Debian/Ubuntu)或 pam_pwquality(RHEL/CentOS):
    sudo apt install libpam-pwquality  # Debian/Ubuntu
    sudo yum install pam_pwquality     # RHEL/CentOS
  • 编辑 /etc/security/pwquality.conf:
    minlen = 12          # 最小长度 12 位
    dcredit = -1         # 至少 1 个数字
    ucredit = -1         # 至少 1 个大写字母
    lcredit = -1         # 至少 1 个小写字母
    ocredit = -1         # 至少 1 个特殊字符
    retry = 3            # 最多重试 3 次

密码老化(强制定期更换):

  • 编辑 /etc/login.defs:
    PASS_MAX_DAYS   90   # 最长使用 90 天
    PASS_MIN_DAYS   7    # 最短使用 7 天(防止频繁更换)
    PASS_WARN_AGE   14   # 提前 14 天警告
  • 对现有用户应用策略:
    sudo chage -M 90 -m 7 -W 14 username  # username 替换为实际用户名

2.2 禁用 root 直接登录与 sudo 精细化配置#

直接使用 root 账户增加风险,应通过 sudo 赋予管理员权限,并限制 root 登录。

禁用 root SSH 登录:

  • 编辑 /etc/ssh/sshd_config:
    PermitRootLogin no  # 禁用 root 直接 SSH 登录
  • 重启 SSH 服务:
    sudo systemctl restart sshd  # 或 ssh.service(Debian)

sudo 精细化配置:

  • 使用 visudo 编辑 /etc/sudoers(自动语法检查,防止配置错误导致无法使用 sudo):
    # 允许 user1 执行所有命令(需密码)
    user1  ALL=(ALL:ALL) ALL
     
    # 允许 user2 无需密码执行特定命令(如重启服务)
    user2  ALL=(ALL:ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl status nginx

2.3 PAM(可插拔认证模块)防护#

PAM 控制用户认证流程,可配置登录失败锁定、密码复杂度等规则。

示例:限制登录失败次数:

  • 编辑 /etc/pam.d/common-auth(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS),添加:
    # 5 次失败后锁定 10 分钟(600 秒)
    auth    required    pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=1200
  • 查看失败记录:sudo pam_tally2 --user=username
  • 解锁用户:sudo pam_tally2 --user=username --reset

3. 网络安全:边界防御与通信加密#

3.1 防火墙配置#

防火墙是网络边界的第一道防线,需仅开放必要端口。

UFW(简单防火墙,Debian/Ubuntu 默认)#

sudo ufw status  # 查看状态
sudo ufw default deny incoming  # 默认拒绝入站
sudo ufw default allow outgoing  # 默认允许出站
sudo ufw allow 22/tcp  # 允许 SSH(TCP 22 端口)
sudo ufw allow 443/tcp  # 允许 HTTPS
sudo ufw deny 80/tcp  # 拒绝 HTTP(如需强制 HTTPS)
sudo ufw enable  # 启用防火墙(开机自启)

Firewalld(RHEL/CentOS 默认)#

sudo firewall-cmd --list-all  # 查看当前配置
sudo firewall-cmd --set-default-zone=drop  # 默认拒绝入站
sudo firewall-cmd --add-service=ssh --permanent  # 永久允许 SSH
sudo firewall-cmd --add-port=443/tcp --permanent  # 永久允许 HTTPS
sudo firewall-cmd --reload  # 应用配置

3.2 SSH 深度加固#

SSH 是远程管理的主要入口,需严格限制访问。

编辑 /etc/ssh/sshd_config:

Port 2222  # 更改默认端口(减少扫描攻击)
PermitRootLogin no  # 禁用 root 登录
PasswordAuthentication no  # 禁用密码认证(仅用 SSH 密钥)
PubkeyAuthentication yes  # 启用密钥认证
AuthorizedKeysFile .ssh/authorized_keys  # 密钥文件路径
AllowUsers [email protected]/24  # 仅允许特定用户从特定网段登录
X11Forwarding no  # 禁用 X11 转发(减少攻击面)
TCPKeepAlive yes  # 检测死连接
MaxAuthTries 3  # 最多 3 次认证尝试
ClientAliveInterval 300  # 5 分钟无活动则断开
  • 重启服务:sudo systemctl restart sshd
  • 生成 SSH 密钥(客户端):ssh-keygen -t ed25519(比 RSA 更安全)
  • 复制公钥到服务器:ssh-copy-id -p 2222 user1@server_ip

3.3 禁用不必要网络服务#

通过 systemctl 停止并禁用未使用的服务(如 telnet, ftp, cups 等):

# 查看监听端口
sudo ss -tuln  # 或 netstat -tuln(需安装 net-tools)
 
# 禁用服务(如 FTP)
sudo systemctl stop vsftpd
sudo systemctl disable vsftpd

3.4 VPN 与传输加密#

敏感通信需加密,推荐使用 WireGuard(轻量、高性能 VPN)。

WireGuard 快速部署(服务器端):

sudo apt install wireguard  # 安装
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey  # 生成密钥
# 配置 /etc/wireguard/wg0.conf(示例)
[Interface]
PrivateKey = 服务器私钥
Address = 10.0.0.1/24  # VPN 子网
ListenPort = 51820
 
[Peer]
PublicKey = 客户端公钥
AllowedIPs = 10.0.0.2/32  # 客户端 VPN IP
  • 启动:sudo wg-quick up wg0
  • 设为开机自启:sudo systemctl enable wg-quick@wg0

4. 系统加固:内核、文件系统与权限控制#

4.1 文件系统安全#

通过 fstab 配置挂载选项,限制文件系统权限。

示例 /etc/fstab 配置:

UUID=xxx / ext4 defaults,nosuid,nodev 0 1  # 根分区禁用 SUID/GUID
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0  # /tmp 禁止执行、SUID
/dev/sda5 /var/tmp ext4 defaults,noexec,nosuid,nodev 0 2  # /var/tmp 同上
  • noexec:禁止执行文件
  • nosuid:禁止 SUID/GUID 权限生效
  • nodev:禁止创建设备文件

4.2 SUID/GUID 文件清理#

SUID 文件允许普通用户以文件所有者权限执行(如 passwd),但多余的 SUID 文件是风险点。

查找并清理 SUID/GUID 文件:

# 查找所有 SUID 文件
sudo find / -perm -4000 -ls 2>/dev/null
# 查找所有 GUID 文件
sudo find / -perm -2000 -ls 2>/dev/null
 
# 移除不必要的 SUID 权限(如某工具无需 SUID)
sudo chmod u-s /path/to/unnecessary-suid-file

4.3 内核安全#

通过 sysctl 调整内核参数,增强网络与内存安全。

编辑 /etc/sysctl.conf 或 /etc/sysctl.d/security.conf:

# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
# 启用 SYN Cookie(防御 SYN 洪水攻击)
net.ipv4.tcp_syncookies = 1
 
# 限制 ICMP 洪水(ping 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# 禁止 IP 源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
 
# 启用内存保护(防止栈溢出)
kernel.randomize_va_space = 2  # ASLR(地址空间布局随机化)
  • 应用配置:sudo sysctl -p

4.4 AppArmor 与 SELinux:强制访问控制#

两者均为强制访问控制(MAC)工具,限制进程权限(超越传统 Unix 权限)。

AppArmor(Debian/Ubuntu 默认启用,配置简单)#

  • 查看状态:sudo aa-status
  • 启用配置文件(如针对 Nginx):sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
  • 示例配置片段(/etc/apparmor.d/usr.sbin.nginx):
    /usr/sbin/nginx {
      # 允许读取配置文件
      /etc/nginx/** r,
      # 允许写入日志
      /var/log/nginx/** w,
      # 禁止访问 /home
      /home/** deny,
    }

SELinux(RHEL/CentOS 默认启用,更复杂但功能强)#

  • 查看状态:sestatus(Enforcing 为启用,Permissive 为仅记录不阻止)
  • 临时切换模式:sudo setenforce 0(Permissive)/ 1(Enforcing)
  • 管理策略:使用 semanage(端口标签)、restorecon(恢复文件上下文):
    # 允许 Nginx 监听非标准端口(如 8080)
    sudo semanage port -a -t http_port_t -p tcp 8080

5. 应用安全:从安装到沙箱隔离#

5.1 软件包验证与可信源配置#

仅从官方或可信源安装软件,验证包签名防止篡改。

验证包签名:

  • Debian/Ubuntu:dpkg-sig --verify package.deb
  • RHEL/CentOS:rpm --checksig package.rpm

配置可信源:

  • Debian/Ubuntu:编辑 /etc/apt/sources.list,仅保留官方源(如 deb http://archive.ubuntu.com/ubuntu/ jammy main)。
  • RHEL/CentOS:使用 subscription-manager 管理官方订阅,或添加 EPEL 等可信第三方源。

5.2 应用沙箱#

沙箱限制应用访问范围,即使应用被入侵,影响也仅限于沙箱内。

Firejail(轻量级沙箱)#

sudo apt install firejail  # 安装
firejail firefox  # 沙箱运行 Firefox
firejail --private=/tmp/sandbox chromium  # 使用私有目录运行 Chrome

Systemd-nspawn(系统级容器,隔离更强)#

# 创建容器目录
sudo mkdir -p /var/lib/machines/myapp
# 从镜像初始化(需提前准备 rootfs)
sudo debootstrap jammy /var/lib/machines/myapp http://archive.ubuntu.com/ubuntu/
# 启动容器
sudo systemd-nspawn -D /var/lib/machines/myapp

5.3 Web 服务器与数据库安全加固#

Nginx 加固#

  • 禁用不必要模块:编辑 nginx.conf,注释无需的 load_module。
  • 启用 HTTPS(Let's Encrypt):sudo certbot --nginx -d example.com
  • 添加安全响应头(/etc/nginx/conf.d/security.conf):
    add_header X-Frame-Options "SAMEORIGIN";  # 防止点击劫持
    add_header X-XSS-Protection "1; mode=block";  # XSS 防护
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";  # HSTS(强制 HTTPS)

MySQL 加固#

  • 运行安全脚本:sudo mysql_secure_installation(删除匿名用户、禁用远程 root 登录、设置 root 密码)。
  • 限制网络访问:编辑 my.cnf,设置 bind-address = 127.0.0.1(仅本地访问)。
  • 最小权限用户:为应用创建专用用户,仅授予必要权限:
    CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass123!';
    GRANT SELECT, INSERT ON appdb.* TO 'appuser'@'localhost';

6. 监控与审计:威胁检测与日志分析#

6.1 集中化日志管理#

集中收集日志便于追溯攻击行为。

rsyslog 配置(发送日志到中央服务器)#

  • 编辑 /etc/rsyslog.conf,添加:
    # 发送所有日志到中央服务器(IP:514 UDP)
    *.* @192.168.1.100:514
  • 重启服务:sudo systemctl restart rsyslog

6.2 文件完整性监控(FIM)#

检测关键文件(如 /etc/passwd)是否被篡改。

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  # 对比当前系统与数据库,检测变化

6.3 入侵检测#

Fail2ban(防御暴力破解)#

  • 监控日志中的失败登录尝试,自动封禁恶意 IP。
  • 配置 /etc/fail2ban/jail.local(覆盖默认配置):
    [sshd]
    enabled = true
    port = 2222  # 自定义 SSH 端口
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 3  # 3 次失败后封禁
    bantime = 3600  # 封禁 1 小时(秒)
    ignoreip = 192.168.1.0/24  # 白名单网段(如内网)
  • 启动并设为开机自启:sudo systemctl enable --now fail2ban

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
  • 重启服务:sudo systemctl restart auditd
  • 搜索审计日志:sudo ausearch -k passwd_changes

7. 事件响应:从备份到恢复#

7.1 备份策略与工具#

定期备份是恢复数据的基础,需考虑完整性、加密和异地存储。

rsync(增量备份,适合本地)#

# 备份 /home 到外部硬盘(仅同步变化文件)
sudo rsync -av --delete /home/ /mnt/backup/external_disk/home/

BorgBackup(支持加密、 deduplication,适合远程)#

# 初始化仓库(加密)
borg init --encryption=repokey /mnt/backup/borg_repo
# 创建备份(压缩,添加日期标签)
borg create --compression zstd /mnt/backup/borg_repo::$(date +%Y%m%d) /home/user
# 查看备份列表
borg list /mnt/backup/borg_repo

7.2 事件处置流程#

  1. 检测:通过监控工具(如 Fail2ban 告警、AIDE 异常)发现异常。
  2. 遏制:隔离受影响系统(如断开网络、停止服务)。
  3. 根除:清除恶意文件(如 rm /tmp/malware)、查杀进程(kill -9 PID)、修复漏洞(更新补丁)。
  4. 恢复:从备份恢复数据,验证系统完整性后重新上线。
  5. 复盘:记录事件过程,优化防御措施(如加强防火墙规则)。

8. 高级安全主题#

8.1 容器安全(Docker 与 Kubernetes)#

  • 非 root 用户运行容器:在 Dockerfile 中使用 USER 非 root uid。
  • 限制容器权限:启动时添加 --cap-drop=ALL(移除所有 Linux capabilities)、--read-only(只读文件系统)。
  • Kubernetes 网络策略:使用 NetworkPolicy 限制 Pod 间通信。

8.2 双因素认证(2FA)部署#

为 SSH 添加 2FA,即使密码泄露,攻击者仍需物理设备(如手机)验证码。

配置 pam_google_authenticator:

  1. 安装:sudo apt install libpam-google-authenticator
  2. 为用户生成密钥:google-authenticator(扫码添加到 Google 身份验证器 App)。
  3. 编辑 /etc/pam.d/sshd,添加:auth required pam_google_authenticator.so
  4. 编辑 sshd_config:ChallengeResponseAuthentication yes,重启 sshd。

8.3 全盘加密(LUKS/dm-crypt)#

防止物理设备被盗导致数据泄露(如笔记本、服务器硬盘)。

配置 LUKS 加密:

# 加密分区(/dev/sdb1)
sudo cryptsetup luksFormat /dev/sdb1
# 打开加密卷(映射为 crypt_data)
sudo cryptsetup open /dev/sdb1 crypt_data
# 格式化文件系统
sudo mkfs.ext4 /dev/mapper/crypt_data
# 挂载使用
sudo mount /dev/mapper/crypt_data /mnt/encrypted_data

9. 参考资料#

通过以上步骤,可显著提升 Linux 系统的安全性。安全是持续过程,需定期更新策略、关注漏洞情报(如 CVE 数据库),并结合实际场景调整加固措施。<|FCResponseEnd|># 精通 Linux 安全与加固:从基础到高级实践指南

引言#

Linux 凭借其开源特性、稳定性和灵活性,已成为服务器、云计算、物联网(IoT)乃至关键基础设施的首选操作系统。然而,“开源”不意味着“天生安全”——任何系统的安全性都取决于配置、补丁管理和用户实践。随着网络攻击手段日益复杂(如勒索软件、APT 攻击、供应链攻击),Linux 系统的安全加固已从“可选项”变为“必选项”。

本文将系统梳理 Linux 安全加固的核心领域,从基础配置到高级防护,结合最佳实践和具体示例,帮助读者构建纵深防御体系。无论你是系统管理员、开发运维工程师(DevOps),还是安全爱好者,都能从中获取实用的加固策略。

目录#

  1. 基础安全基石:系统更新与启动保护

    • 1.1 系统更新与补丁管理
    • 1.2 安全启动(Secure Boot)与 UEFI 防护
    • 1.3 BIOS/UEFI 密码设置
  2. 用户与访问控制:最小权限原则实践

    • 2.1 强密码策略与密码老化
    • 2.2 禁用 root 直接登录与 sudo 精细化配置
    • 2.3 PAM(可插拔认证模块)防护
  3. 网络安全:边界防御与通信加密

    • 3.1 防火墙配置(UFW/Firewalld/iptables)
    • 3.2 SSH 深度加固
    • 3.3 禁用不必要网络服务与端口限制
    • 3.4 VPN 与传输加密
  4. 系统加固:内核、文件系统与权限控制

    • 4.1 文件系统安全(fstab 选项与 tmpfs)
    • 4.2 SUID/GUID 文件清理与权限最小化
    • 4.3 内核安全(sysctl 调优与安全模块)
    • 4.4 AppArmor 与 SELinux:强制访问控制
  5. 应用安全:从安装到沙箱隔离

    • 5.1 软件包验证与可信源配置
    • 5.2 应用沙箱(Firejail/Systemd-nspawn)
    • 5.3 Web 服务器与数据库安全加固
  6. 监控与审计:威胁检测与日志分析

    • 6.1 集中化日志管理(rsyslog/Journald)
    • 6.2 文件完整性监控(AIDE/Tripwire)
    • 6.3 入侵检测(Fail2ban 与 auditd)
  7. 事件响应:从备份到恢复

    • 7.1 备份策略与工具(rsync/BorgBackup)
    • 7.2 事件处置流程(检测→遏制→根除→恢复)
  8. 高级安全主题

    • 8.1 容器安全(Docker 与 Kubernetes)
    • 8.2 双因素认证(2FA)部署
    • 8.3 全盘加密(LUKS/dm-crypt)
  9. 参考资料

1. 基础安全基石:系统更新与启动保护#

1.1 系统更新与补丁管理#

Linux 系统的安全始于及时更新。漏洞修复通常通过系统补丁发布,延迟更新会使系统暴露于已知风险中。

最佳实践:

  • 定期手动更新(适用于关键业务,需测试兼容性)。
  • 配置自动更新(适用于非关键系统,降低运维成本)。

示例操作:

  • Debian/Ubuntu:

    # 手动更新
    sudo apt update && sudo apt upgrade -y
    # 安装自动更新工具
    sudo apt install unattended-upgrades
    # 启用自动更新(编辑配置文件 /etc/apt/apt.conf.d/50unattended-upgrades)
    sudo dpkg-reconfigure -plow unattended-upgrades
  • RHEL/CentOS:

    # 手动更新
    sudo yum update -y  # 或 dnf update -y(CentOS 8+)
    # 配置自动更新
    sudo yum install dnf-automatic -y
    sudo systemctl enable --now dnf-automatic.timer

1.2 安全启动(Secure Boot)与 UEFI 防护#

安全启动是 UEFI 的特性,通过验证启动加载程序的数字签名,防止恶意代码在系统启动时执行。

检查与启用:

  • 进入 BIOS/UEFI 设置,启用“Secure Boot”。
  • 验证状态(需安装 mokutil):
    mokutil --sb-state  # 输出 "SecureBoot enabled" 表示已启用

1.3 BIOS/UEFI 密码设置#

BIOS/UEFI 密码可防止未授权用户修改启动顺序(如通过 USB 设备启动恶意系统)。

操作步骤:

  1. 重启系统,按厂商指定键(如 F2、Del)进入 BIOS/UEFI 设置。
  2. 找到“Security”→“Set Supervisor Password”,设置强密码。
  3. 保存并退出。

2. 用户与访问控制:最小权限原则实践#

2.1 强密码策略与密码老化#

弱密码是常见攻击入口,需通过策略强制复杂度与定期更换。

配置强密码策略:

  • 安装 libpam-pwquality(Debian/Ubuntu)或 pam_pwquality(RHEL/CentOS):
    sudo apt install libpam-pwquality  # Debian/Ubuntu
    sudo yum install pam_pwquality     # RHEL/CentOS
  • 编辑 /etc/security/pwquality.conf:
    minlen = 12          # 最小长度 12 位
    dcredit = -1         # 至少 1 个数字
    ucredit = -1         # 至少 1 个大写字母
    lcredit = -1         # 至少 1 个小写字母
    ocredit = -1         # 至少 1 个特殊字符
    retry = 3            # 最多重试 3 次

密码老化(强制定期更换):

  • 编辑 /etc/login.defs:
    PASS_MAX_DAYS   90   # 最长使用 90 天
    PASS_MIN_DAYS   7    # 最短使用 7 天(防止频繁更换)
    PASS_WARN_AGE   14   # 提前 14 天警告
  • 对现有用户应用策略:
    sudo chage -M 90 -m 7 -W 14 username  # username 替换为实际用户名

2.2 禁用 root 直接登录与 sudo 精细化配置#

直接使用 root 账户增加风险,应通过 sudo 赋予管理员权限,并限制 root 登录。

禁用 root SSH 登录:

  • 编辑 /etc/ssh/sshd_config:
    PermitRootLogin no  # 禁用 root 直接 SSH 登录
  • 重启 SSH 服务:
    sudo systemctl restart sshd  # 或 ssh.service(Debian)

sudo 精细化配置:

  • 使用 visudo 编辑 /etc/sudoers(自动语法检查,防止配置错误导致无法使用 sudo):
    # 允许 user1 执行所有命令(需密码)
    user1  ALL=(ALL:ALL) ALL
     
    # 允许 user2 无需密码执行特定命令(如重启服务)
    user2  ALL=(ALL:ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl status nginx

2.3 PAM(可插拔认证模块)防护#

PAM 控制用户认证流程,可配置登录失败锁定、密码复杂度等规则。

示例:限制登录失败次数:

  • 编辑 /etc/pam.d/common-auth(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS),添加:
    # 5 次失败后锁定 10 分钟(600 秒)
    auth    required    pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=1200
  • 查看失败记录:sudo pam_tally2 --user=username
  • 解锁用户:sudo pam_tally2 --user=username --reset

3. 网络安全:边界防御与通信加密#

3.1 防火墙配置#

防火墙是网络边界的第一道防线,需仅开放必要端口。

UFW(简单防火墙,Debian/Ubuntu 默认)#

sudo ufw status  # 查看状态
sudo ufw default deny incoming  # 默认拒绝入站
sudo ufw default allow outgoing  # 默认允许出站
sudo ufw allow 22/tcp  # 允许 SSH(TCP 22 端口)
sudo ufw allow 443/tcp  # 允许 HTTPS
sudo ufw deny 80/tcp  # 拒绝 HTTP(如需强制 HTTPS)
sudo ufw enable  # 启用防火墙(开机自启)

Firewalld(RHEL/CentOS 默认)#

sudo firewall-cmd --list-all  # 查看当前配置
sudo firewall-cmd --set-default-zone=drop  # 默认拒绝入站
sudo firewall-cmd --add-service=ssh --permanent  # 永久允许 SSH
sudo firewall-cmd --add-port=443/tcp --permanent  # 永久允许 HTTPS
sudo firewall-cmd --reload  # 应用配置

3.2 SSH 深度加固#

SSH 是远程管理的主要入口,需严格限制访问。

编辑 /etc/ssh/sshd_config:

Port 2222  # 更改默认端口(减少扫描攻击)
PermitRootLogin no  # 禁用 root 登录
PasswordAuthentication no  # 禁用密码认证(仅用 SSH 密钥)
PubkeyAuthentication yes  # 启用密钥认证
AuthorizedKeysFile .ssh/authorized_keys  # 密钥文件路径
AllowUsers [email protected]/24  # 仅允许特定用户从特定网段登录
X11Forwarding no  # 禁用 X11 转发(减少攻击面)
TCPKeepAlive yes  # 检测死连接
MaxAuthTries 3  # 最多 3 次认证尝试
ClientAliveInterval 300  # 5 分钟无活动则断开
  • 重启服务:sudo systemctl restart sshd
  • 生成 SSH 密钥(客户端):ssh-keygen -t ed25519(比 RSA 更安全)
  • 复制公钥到服务器:ssh-copy-id -p 2222 user1@server_ip

3.3 禁用不必要网络服务#

通过 systemctl 停止并禁用未使用的服务(如 telnet, ftp, cups 等):

# 查看监听端口
sudo ss -tuln  # 或 netstat -tuln(需安装 net-tools)
 
# 禁用服务(如 FTP)
sudo systemctl stop vsftpd
sudo systemctl disable vsftpd

3.4 VPN 与传输加密#

敏感通信需加密,推荐使用 WireGuard(轻量、高性能 VPN)。

WireGuard 快速部署(服务器端):

sudo apt install wireguard  # 安装
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey  # 生成密钥
# 配置 /etc/wireguard/wg0.conf(示例)
[Interface]
PrivateKey = 服务器私钥
Address = 10.0.0.1/24  # VPN 子网
ListenPort = 51820
 
[Peer]
PublicKey = 客户端公钥
AllowedIPs = 10.0.0.2/32  # 客户端 VPN IP
  • 启动:sudo wg-quick up wg0
  • 设为开机自启:sudo systemctl enable wg-quick@wg0

4. 系统加固:内核、文件系统与权限控制#

4.1 文件系统安全#

通过 fstab 配置挂载选项,限制文件系统权限。

示例 /etc/fstab 配置:

UUID=xxx / ext4 defaults,nosuid,nodev 0 1  # 根分区禁用 SUID/GUID
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0  # /tmp 禁止执行、SUID
/dev/sda5 /var/tmp ext4 defaults,noexec,nosuid,nodev 0 2  # /var/tmp 同上
  • noexec:禁止执行文件
  • nosuid:禁止 SUID/GUID 权限生效
  • nodev:禁止创建设备文件

4.2 SUID/GUID 文件清理#

SUID 文件允许普通用户以文件所有者权限执行(如 passwd),但多余的 SUID 文件是风险点。

查找并清理 SUID/GUID 文件:

# 查找所有 SUID 文件
sudo find / -perm -4000 -ls 2>/dev/null
# 查找所有 GUID 文件
sudo find / -perm -2000 -ls 2>/dev/null
 
# 移除不必要的 SUID 权限(如某工具无需 SUID)
sudo chmod u-s /path/to/unnecessary-suid-file

4.3 内核安全#

通过 sysctl 调整内核参数,增强网络与内存安全。

编辑 /etc/sysctl.conf 或 /etc/sysctl.d/security.conf:

# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
# 启用 SYN Cookie(防御 SYN 洪水攻击)
net.ipv4.tcp_syncookies = 1
 
# 限制 ICMP 洪水(ping 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# 禁止 IP 源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
 
# 启用内存保护(防止栈溢出)
kernel.randomize_va_space = 2  # ASLR(地址空间布局随机化)
  • 应用配置:sudo sysctl -p

4.4 AppArmor 与 SELinux:强制访问控制#

两者均为强制访问控制(MAC)工具,限制进程权限(超越传统 Unix 权限)。

AppArmor(Debian/Ubuntu 默认启用,配置简单)#

  • 查看状态:sudo aa-status
  • 启用配置文件(如针对 Nginx):sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
  • 示例配置片段(/etc/apparmor.d/usr.sbin.nginx):
    /usr/sbin/nginx {
      # 允许读取配置文件
      /etc/nginx/** r,
      # 允许写入日志
      /var/log/nginx/** w,
      # 禁止访问 /home
      /home/** deny,
    }

SELinux(RHEL/CentOS 默认启用,更复杂但功能强)#

  • 查看状态:sestatus(Enforcing 为启用,Permissive 为仅记录不阻止)
  • 临时切换模式:sudo setenforce 0(Permissive)/ 1(Enforcing)
  • 管理策略:使用 semanage(端口标签)、restorecon(恢复文件上下文):
    # 允许 Nginx 监听非标准端口(如 8080)
    sudo semanage port -a -t http_port_t -p tcp 8080

5. 应用安全:从安装到沙箱隔离#

5.1 软件包验证与可信源配置#

仅从官方或可信源安装软件,验证包签名防止篡改。

验证包签名:

  • Debian/Ubuntu:dpkg-sig --verify package.deb
  • RHEL/CentOS:rpm --checksig package.rpm

配置可信源:

  • Debian/Ubuntu:编辑 /etc/apt/sources.list,仅保留官方源(如 deb http://archive.ubuntu.com/ubuntu/ jammy main)。
  • RHEL/CentOS:使用 subscription-manager 管理官方订阅,或添加 EPEL 等可信第三方源。

5.2 应用沙箱#

沙箱限制应用访问范围,即使应用被入侵,影响也仅限于沙箱内。

Firejail(轻量级沙箱)#

sudo apt install firejail  # 安装
firejail firefox  # 沙箱运行 Firefox
firejail --private=/tmp/sandbox chromium  # 使用私有目录运行 Chrome

Systemd-nspawn(系统级容器,隔离更强)#

# 创建容器目录
sudo mkdir -p /var/lib/machines/myapp
# 从镜像初始化(需提前准备 rootfs)
sudo debootstrap jammy /var/lib/machines/myapp http://archive.ubuntu.com/ubuntu/
# 启动容器
sudo systemd-nspawn -D /var/lib/machines/myapp

5.3 Web 服务器与数据库安全加固#

Nginx 加固#

  • 禁用不必要模块:编辑 nginx.conf,注释无需的 load_module。
  • 启用 HTTPS(Let's Encrypt):sudo certbot --nginx -d example.com
  • 添加安全响应头(/etc/nginx/conf.d/security.conf):
    add_header X-Frame-Options "SAMEORIGIN";  # 防止点击劫持
    add_header X-XSS-Protection "1; mode=block";  # XSS 防护
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";  # HSTS(强制 HTTPS)

MySQL 加固#

  • 运行安全脚本:sudo mysql_secure_installation(删除匿名用户、禁用远程 root 登录、设置 root 密码)。
  • 限制网络访问:编辑 my.cnf,设置 bind-address = 127.0.0.1(仅本地访问)。
  • 最小权限用户:为应用创建专用用户,仅授予必要权限:
    CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass123!';
    GRANT SELECT, INSERT ON appdb.* TO 'appuser'@'localhost';

6. 监控与审计:威胁检测与日志分析#

6.1 集中化日志管理#

集中收集日志便于追溯攻击行为。

rsyslog 配置(发送日志到中央服务器)#

  • 编辑 /etc/rsyslog.conf,添加:
    # 发送所有日志到中央服务器(IP:514 UDP)
    *.* @192.168.1.100:514
  • 重启服务:sudo systemctl restart rsyslog

6.2 文件完整性监控(FIM)#

检测关键文件(如 /etc/passwd)是否被篡改。

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  # 对比当前系统与数据库,检测变化

6.3 入侵检测#

Fail2ban(防御暴力破解)#

  • 监控日志中的失败登录尝试,自动封禁恶意 IP。
  • 配置 /etc/fail2ban/jail.local(覆盖默认配置):
    [sshd]
    enabled = true
    port = 2222  # 自定义 SSH 端口
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 3  # 3 次失败后封禁
    bantime = 3600  # 封禁 1 小时(秒)
    ignoreip = 192.168.1.0/24  # 白名单网段(如内网)
  • 启动并设为开机自启:sudo systemctl enable --now fail2ban

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
  • 重启服务:sudo systemctl restart auditd
  • 搜索审计日志:sudo ausearch -k passwd_changes

7. 事件响应:从备份到恢复#

7.1 备份策略与工具#

定期备份是恢复数据的基础,需考虑完整性、加密和异地存储。

rsync(增量备份,适合本地)#

# 备份 /home 到外部硬盘(仅同步变化文件)
sudo rsync -av --delete /home/ /mnt/backup/external_disk/home/

BorgBackup(支持加密、 deduplication,适合远程)#

# 初始化仓库(加密)
borg init --encryption=repokey /mnt/backup/borg_repo
# 创建备份(压缩,添加日期标签)
borg create --compression zstd /mnt/backup/borg_repo::$(date +%Y%m%d) /home/user
# 查看备份列表
borg list /mnt/backup/borg_repo

7.2 事件处置流程#

  1. 检测:通过监控工具(如 Fail2ban 告警、AIDE 异常)发现异常。
  2. 遏制:隔离受影响系统(如断开网络、停止服务)。
  3. 根除:清除恶意文件(如 rm /tmp/malware)、查杀进程(kill -9 PID)、修复漏洞(更新补丁)。
  4. 恢复:从备份恢复数据,验证系统完整性后重新上线。
  5. 复盘:记录事件过程,优化防御措施(如加强防火墙规则)。

8. 高级安全主题#

8.1 容器安全(Docker 与 Kubernetes)#

  • 非 root 用户运行容器:在 Dockerfile 中使用 USER 非 root uid。
  • 限制容器权限:启动时添加 --cap-drop=ALL(移除所有 Linux capabilities)、--read-only(只读文件系统)。
  • Kubernetes 网络策略:使用 NetworkPolicy 限制 Pod 间通信。

8.2 双因素认证(2FA)部署#

为 SSH 添加 2FA,即使密码泄露,攻击者仍需物理设备(如手机)验证码。

配置 pam_google_authenticator:

  1. 安装:sudo apt install libpam-google-authenticator
  2. 为用户生成密钥:google-authenticator(扫码添加到 Google 身份验证器 App)。
  3. 编辑 /etc/pam.d/sshd,添加:auth required pam_google_authenticator.so
  4. 编辑 sshd_config:ChallengeResponseAuthentication yes,重启 sshd。

8.3 全盘加密(LUKS/dm-crypt)#

防止物理设备被盗导致数据泄露(如笔记本、服务器硬盘)。

配置 LUKS 加密:

# 加密分区(/dev/sdb1)
sudo cryptsetup luksFormat /dev/sdb1
# 打开加密卷(映射为 crypt_data)
sudo cryptsetup open /dev/sdb1 crypt_data
# 格式化文件系统
sudo mkfs.ext4 /dev/mapper/crypt_data
# 挂载使用
sudo mount /dev/mapper/crypt_data /mnt/encrypted_data

9. 参考资料#

通过以上步骤,可显著提升 Linux 系统的安全性。安全是持续过程,需定期更新策略、关注漏洞情报(如 CVE 数据库),并结合实际场景调整加固措施。