人人都会AI编程

23.1 账号安全加固

更新时间:2026-07-12

账号是系统的第一道防线。无论服务器用于什么业务,如果登录凭据被泄漏或权限分配不当,后续所有的安全措施都可能被绕过。以下加固方法均来自生产环境中的常见实践,优先关注可操作性。

1. 严格管理 root 账号
root 拥有系统最高权限,应尽量限制其直接使用。

  • 禁止 root 远程登录:在 /etc/ssh/sshd_config 中设置 PermitRootLogin no,然后重启 sshd。如果需要以 root 身份执行命令,应通过普通用户登录后使用 sudosu - 提权。
  • 限制 root 本地登录:只在控制台、带外管理等物理或等效物理访问场景保留 root 登录,避免在图形界面下使用 root。
  • 锁定备用 root 入口:检查 /etc/securetty(如果系统使用),只保留 consoletty1 等必要的本地终端。

2. 强制使用强密码策略
使用 PAM 模块和登录程序配置来实现密码复杂度要求。

  • /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS)中启用 pam_pwquality.so 模块,设置:
  password requisite pam_pwquality.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
  

这要求密码长度至少 12 位,包含大小写字母、数字和特殊字符,且至少有 3 个字符与旧密码不同。

  • /etc/login.defs 中设定密码过期策略:
  PASS_MAX_DAYS   90
  PASS_MIN_DAYS   7
  PASS_WARN_AGE   14
  

强制用户每 90 天修改密码,最短使用 7 天以防频繁回滚,提前 14 天开始警告。

3. 推行 SSH 密钥认证,禁用密码登录
密钥认证远比密码安全,且能防止暴力猜测。

  • 在服务器上生成密钥对:ssh-keygen -t ed25519 -C "your_email@example.com"
  • 将公钥复制到目标服务器:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
  • 验证密钥登录成功后,在 /etc/ssh/sshd_config 中禁用密码登录:
  PasswordAuthentication no
  ChallengeResponseAuthentication no
  

重启 sshd。此后只能通过密钥或已配置的其他安全方式登录。

  • 对于仍有密码登录需求的老旧设备或账户,可以考虑使用 fail2ban 来阻拦暴力破解。

4. 清理多余账号和默认用户

  • 删除或锁定不需要的用户:系统安装后可能遗留游戏、打印等账号(如 games、lp、news),使用 userdel 删除,或用 passwd -l 锁定。
  • 移除不必要的组成员:特别是 wheelsudoadm 等管理组,只保留真正需要提权的用户。定期检查 /etc/group/etc/sudoers
  • 确保每个账号都有唯一用途:不要多人共享一个账号,可为每个人创建独立账号并用组管理权限。

5. 合理配置 sudo 权限
最小化授予 sudo 特权,并记录所有操作。

  • 使用 visudo 编辑 /etc/sudoers,按用户或组精确赋予命令权限,例如:
  %webadmins ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/less /var/log/nginx/*
  

避免简单的 ALL=(ALL) ALL,除非绝对必要。

  • 开启 sudo 会话日志:
  Defaults logfile=/var/log/sudo.log
  Defaults !syslog
  

或者配合 session required pam_tty_audit.so 记录按键操作(需权衡隐私和磁盘开销)。

  • 设置超时:Defaults timestamp_timeout=5 表示五分钟后需重新验证密码。

6. 账号锁定与登录失败处理

  • 设置登录失败锁定:在 PAM 配置中使用 pam_faillock.so(RHEL7+)或 pam_tally2.so(老版本),连续 5 次失败锁定账户 30 分钟:
  auth required pam_faillock.so preauth silent deny=5 unlock_time=1800
  auth required pam_faillock.so authfail deny=5 unlock_time=1800
  account required pam_faillock.so
  
  • 检查 /var/log/btmp 中的失败登录记录(使用 lastb 命令),异常高频尝试应立即排查。

7. 启用多因素认证(可选)
对于高度敏感的系统,可以在 SSH 登录时增加 TOTP 或 FIDO U2F 认证。

  • 安装 Google Authenticator 模块:google-authenticator 生成密钥并扫描二维码。
  • 在 PAM 中添加 auth required pam_google_authenticator.so,与密码或密钥配合使用。

8. 定期审计账号与权限

  • 使用 pwckgrpck 检查 /etc/passwd/etc/group 的一致性。
  • 查找无密码账号:awk -F: '($2 == "" || $2 == "*" || $2 == "!") {print $1}' /etc/shadow(需要 root),确认这些账号确实不需要登录。
  • 查找家目录权限过于宽松的账号:find /home -maxdepth 1 -type d -perm /o+rwx,普通用户家目录不应让其他用户有写权限。
  • 定期生成账号列表,与业务人员核对用户变动,及时回收离职或转岗员工的权限。

账号安全加固没有一劳永逸的方法,它是持续观察、调整的过程。但通过以上几步,可以大幅降低因账号失陷而导致主机被控的风险,并建立起可审计、可追溯的身份管理体系。