必须用 pam_faillock.so,因 pam_tally2.so 在 RHEL 8+/CentOS 8+、Debian 12+、Ubuntu 22.04+ 已被彻底移除,硬写会导致所有 PAM 登录失败。
必须用 pam_faillock.so,pam_tally2.so 在 RHEL 8+/CentOS 8+、Debian 12+、Ubuntu 22.04+ 已被彻底移除,硬写进去会直接导致所有 PAM 登录失败(包括 root SSH 和本地 tty)。
为什么改了 /etc/pam.d/password-auth 还不生效
常见错误是把配置加在了错误的位置或错误的 PAM 栈类型里。系统登录路径不同,调用的 PAM 配置文件也不同:
- SSH 登录走
/etc/pam.d/sshd→ 它通过auth [default=ignore] pam_faillock.so preauth ...引用password-auth - 本地 tty(Ctrl+Alt+F2)走
/etc/pam.d/login→ 同样引用password-auth - 图形界面(GDM/LightDM)走各自模块(如
/etc/pam.d/gdm-password),也需确保引用password-auth
所以只改 password-auth 是对的,但必须加在它的 auth 段最开头 —— 否则后续认证已成功,preauth 阶段就不起作用了。验证是否加载成功:执行 faillock --user testuser,若报 No such file or directory,说明模块根本没被触发。
pam_faillock.so 的两行配置顺序不能颠倒
必须严格按以下顺序插入到 /etc/pam.d/password-auth 的 auth 段顶部(紧贴 #%PAM-1.0 下方):
auth [default=ignore] pam_faillock.so preauth silent audit deny=3 unlock_time=300 auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=300
第一行是“预检”:不打断流程,只记失败;第二行是“终判”:一旦上一行记录了失败,且本次又输错,就立刻拒绝并锁定。如果顺序反了,或漏掉 preauth / authfail 标志,会导致计数失效或用户永远无法再登录。
关键参数说明:
Pixelhunter
AI智能调整图片尺寸
-
deny=3:连续失败 3 次后锁定(注意:是“连续”,非“累计”;超过fail_interval默认 900 秒未再失败,计数自动清零) -
unlock_time=300:5 分钟后自动解锁;设为0则永久锁定,只能由管理员手动faillock --user xxx --reset - 不加
even_deny_root时,root用户完全不受限;加了但没配root_unlock_time,root锁定后将无法 SSH 或 tty 登录,只剩单用户模式可救
查看和清理失败记录只能用 faillock 命令
faillock 是唯一受支持的状态管理工具,pam_tally2 --user xxx 在新系统中会报错或返回空结果。
- 查某用户当前状态:
faillock --user alice(输出含时间戳、源 IP、失败次数) - 清空指定用户记录:
faillock --user alice --reset - 清空所有用户记录(慎用!运维事故高发操作):
faillock --reset
注意:faillock 只统计经 PAM 认证的登录(ssh、su、login、图形界面),不记录 passwd 命令改密、API 调用或直接写 /etc/shadow 的行为 —— 这不是 bug,是设计如此。
测试前必须备份 + 避开远程终端直接保存
编辑 /etc/pam.d/password-auth 前务必执行:
cp /etc/pam.d/password-auth{,.bak}
更关键的是:不要在唯一的 SSH 会话里 vim 打开、修改、:wq 保存退出 —— 一旦配置出错,连接立即断开且无法重连。正确做法:
- 本地开一个 tty(Ctrl+Alt+F2),用 root 登录备用
- 或先开第二个 SSH 会话保持连接,只在第一个里改配置
- 改完后,用另一普通用户(非 root)在新 SSH 连接里测试登录失败逻辑
真正容易被忽略的点是:很多团队以为“限制了 SSH 就够了”,结果发现本地 tty 或 GDM 登录仍可暴力尝试 —— 因为它们依赖同一份 password-auth,但只有你确认它被所有入口正确引用,才算真正生效。