账户锁定策略由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”字样。











