账号是系统的第一道防线。无论服务器用于什么业务,如果登录凭据被泄漏或权限分配不当,后续所有的安全措施都可能被绕过。以下加固方法均来自生产环境中的常见实践,优先关注可操作性。
1. 严格管理 root 账号
root 拥有系统最高权限,应尽量限制其直接使用。
- 禁止 root 远程登录:在
/etc/ssh/sshd_config中设置PermitRootLogin no,然后重启 sshd。如果需要以 root 身份执行命令,应通过普通用户登录后使用sudo或su -提权。 - 限制 root 本地登录:只在控制台、带外管理等物理或等效物理访问场景保留 root 登录,避免在图形界面下使用 root。
- 锁定备用 root 入口:检查
/etc/securetty(如果系统使用),只保留console、tty1等必要的本地终端。
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锁定。 - 移除不必要的组成员:特别是
wheel、sudo、adm等管理组,只保留真正需要提权的用户。定期检查/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. 定期审计账号与权限
- 使用
pwck和grpck检查/etc/passwd与/etc/group的一致性。 - 查找无密码账号:
awk -F: '($2 == "" || $2 == "*" || $2 == "!") {print $1}' /etc/shadow(需要 root),确认这些账号确实不需要登录。 - 查找家目录权限过于宽松的账号:
find /home -maxdepth 1 -type d -perm /o+rwx,普通用户家目录不应让其他用户有写权限。 - 定期生成账号列表,与业务人员核对用户变动,及时回收离职或转岗员工的权限。
账号安全加固没有一劳永逸的方法,它是持续观察、调整的过程。但通过以上几步,可以大幅降低因账号失陷而导致主机被控的风险,并建立起可审计、可追溯的身份管理体系。