账户锁定策略由pam_faillock.so控制,CentOS 7默认推荐使用该模块;pam_tally2.so已被弃用,两者不可混用,否则导致策略失效或冲突。

账户锁定策略由 pam_tally2.so 还是 pam_faillock.so 控制?
CentOS 7 默认推荐用 pam_faillock.so,但很多旧文档和脚本仍沿用 pam_tally2.so。两者不能混用,否则策略失效或冲突。
相比之下,pam_faillock.so 属于更新一代、也更稳妥的方案:它支持独立保存失败计数,位置在 /var/run/faillock/,而且无论是 SSH 登录还是本地登录,都能按统一规则生效。pam_tally2.so 则依赖 /var/log/tallylog;更麻烦的是,在某些 PAM 配置顺序下,它对 SSH 可能根本不起作用,除非额外显式修改 /etc/pam.d/sshd。
如果你刚装的 CentOS 7(≥7.4)且没动过 PAM,优先用 pam_faillock.so;若已有 pam_tally2.so 规则且运行正常,不建议强行切换。
修改 /etc/pam.d/system-auth 实现全局锁定
锁定策略需同时写入 auth 和 account 段,且顺序关键:失败计数必须在认证前触发,解锁检查必须在认证后验证。
- 在
/etc/pam.d/system-auth文件顶部(必须在第一行附近)插入以下三行:
auth [default=ignore] pam_faillock.so preauth silent deny=5 unlock_time=180 fail_interval=900 auth [default=die] pam_faillock.so authfail deny=5 unlock_time=180 fail_interval=900 account required pam_faillock.so
说明:
deny=5:连续 5 次失败即锁定unlock_time=180:普通用户 180 秒后自动解锁fail_interval=900:只统计最近 15 分钟内的失败次数(避免长期累积误判)authfail行必须紧跟在preauth行之后,中间不能插入其他auth规则- 若要 root 同样被锁,加
even_deny_root参数到两行末尾
SSH 登录也想生效?必须改 /etc/pam.d/sshd
/etc/pam.d/system-auth 的改动默认对 SSH 无效——因为 SSH 走的是自己的 PAM 链,不 include system-auth 的 auth 段(只 include account 和 password 段)。
所以必须单独配置 /etc/pam.d/sshd:
- 在
/etc/pam.d/sshd文件最开头插入与上面完全相同的三行(auth两行 +account一行) - 切勿复制到文件中间或末尾,否则会被跳过
- 改完执行
systemctl restart sshd生效 - 验证方式:用另一台机器反复输错密码,第 5 次后正确密码也无法登录,且
faillock --user xxx显示Failures: 5
常见失效原因和排查命令
策略写了却没反应,大概率是这几处踩坑:
- PAM 行写错位置:比如插在
auth [success=1 default=ignore] pam_unix.so后面,会导致 preauth 被跳过 - 参数拼错:
unlock_time写成unlock-time或漏掉等号,PAM 直接忽略整行 - 没重启服务:改
sshd配置后忘了systemctl restart sshd - 测试用户已锁定但没清空:用
faillock --user username --reset清零再测 - SELinux 阻止写 /var/run/faillock/:临时设为 permissive 模式测试,确认后再调策略
真正起作用的是 faillock 命令输出和 /var/run/faillock/ 下的文件,不是日志里有没有“pam_faillock”字样。