关键在于确保UsePAM yes启用并重启sshd,再将pam_faillock.so正确插入auth preauth/authfail和account阶段,且各服务PAM配置文件(如password-auth或common-auth)须统一设置deny、unlock_time及even_deny_root等参数。

要让 SSH 登录失败真正触发 pam_faillock 的账户锁定,关键不是“配置 UsePAM”,而是确保 UsePAM yes 已启用,并在此前提下正确串联 SSH 认证流程与系统级 PAM 策略。很多问题其实出在 PAM 配置层级错位或模块顺序错误,而非 UsePAM 本身未开。
确认 UsePAM 已启用且生效
SSH 服务必须主动调用 PAM 模块,否则 faillock 完全不参与认证过程。检查并确保:
-
/etc/ssh/sshd_config中存在且未被注释的行:UsePAM yes - 修改后必须执行
sudo systemctl restart sshd(reload 不可靠,尤其涉及 PAM 变更) - 验证是否生效:运行
sshd -T | grep usepam,输出应为 usepam yes
把 faillock 插入正确的 PAM 链路位置
SSH 自身不直接写 faillock 规则,它通过 PAM 配置文件(如 /etc/pam.d/sshd 或被其 include 的 password-auth)加载模块。重点在于 auth 和 account 两个阶段的配合:
- auth preauth:在任何密码校验前检查用户是否已被锁定(读取 /var/run/faillock 下记录)
- auth authfail:仅当 pam_unix 认证失败时才递增计数器(避免误锁)
- account required:在认证通过后、会话建立前,再次检查锁定状态(防绕过)
典型安全写法(以 /etc/pam.d/password-auth 为例,推荐统一在此配置):
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600
account required pam_faillock.so
区分登录方式,避免策略失效
PAM 配置是按服务隔离的。只改 sshd 文件,本地 console(/etc/pam.d/login)仍不受限;只改 system-auth,某些发行版的 sshd 可能不引用它。稳妥做法:
- CentOS/RHEL:优先修改
/etc/pam.d/password-auth,因sshd默认包含它 - Ubuntu/Debian:修改
/etc/pam.d/common-auth和/etc/pam.d/common-account - 如需 root 也被锁定,所有相关行必须加 even_deny_root 参数
验证与排错要点
配置后务必实测,不要仅依赖语法检查:
- 用错误密码连续登录 3 次(按 deny=3 设置),第 4 次应立即拒绝,且
faillock --user username显示计数 - 锁定期间即使输入正确密码,也应提示“Authentication failure”而非密码错——这是 preauth 生效的标志
- 日志查
/var/log/auth.log或/var/log/secure,搜索 “pam_faillock” 确认模块被调用 - 若无法登录,保留一个已连接的 root 会话,快速回滚配置文件(务必提前备份)

















