faillog查不到最近失败登录是因为PAM未启用pam_faillock.so模块;需检查/etc/pam.d/对应文件中是否配置preauth/postauth成对规则,且避免与pam_tally2共存。

faillog 命令查不到最近失败登录?先确认 PAM 是否启用 pam_faillock
Linux 默认不开启登录失败计数,faillog 显示为空或过期数据,不是命令用错了,是底层没记录。核心在 PAM 配置是否加载了 pam_faillock.so —— 它才是实际拦截和计数的模块。
实操建议:
- 检查
/etc/pam.d/common-auth(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS)中是否存在含pam_faillock.so的行,例如:auth [default=bad success=ok user_unknown=ignore] pam_faillock.so preauth silent audit deny=5 unlock_time=900
- 若只有
faillog -a能查到历史(来自/var/log/faillog),但新失败不更新,说明 PAM 未配置 preauth/postauth 配对,必须成对出现才能生效 -
pam_faillock不兼容pam_tally2,共存会导致策略冲突甚至登录卡死,二选一,推荐停用pam_tally2
自定义锁定时间与重试次数:deny、unlock_time、fail_interval 怎么配才不踩坑
参数表面简单,但组合逻辑容易误判。比如设了 deny=3 unlock_time=300,你以为 5 分钟后自动解封,其实若没加 fail_interval,3 次失败只要跨过 900 秒(默认值)就清零计数——等于锁不住。
实操建议:
-
deny=N:连续失败 N 次后锁定,注意是“连续”,非“累计” -
fail_interval=T:必须显式设置,单位秒;若想严格按“5 分钟内输错 3 次就锁”,这里就得设fail_interval=300 -
unlock_time=T:仅对 root 无效(除非加even_deny_root),且若设为 0 表示永久锁定,需手动faillock --reset - 所有参数都写在同一行
pam_faillock.so后面,换行或拆到两行会导致部分参数被忽略
绕过密码策略的常见路径:SSH 密钥、sudo、su 全都得单独堵
只配了 login 或 gdm 的 PAM 策略,对 SSH 密码登录无效——因为 OpenSSH 用的是 /etc/pam.d/sshd。同理,sudo 和 su 也各自走独立 PAM 链,漏一个就等于留个后门。
实操建议:
- SSH 密码登录必须在
/etc/pam.d/sshd中添加auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=900 fail_interval=300(注意是authfail,不是preauth) -
sudo场景下,用户可能跳过登录直接提权,需在/etc/pam.d/sudo加相同auth行(但慎用,避免运维账号被误锁) -
su默认不读 system-auth,要改/etc/pam.d/su或/etc/pam.d/su-l,否则普通用户切 root 不受限制 - 图形界面(GDM、SDDM)策略不自动继承终端策略,必须单独检查对应 PAM 文件
解锁账户后仍无法登录?检查 /var/run/faillock/ 权限与 SELinux 上下文
faillock --reset --user alice 执行成功,但用户下次输对密码还是被拒,大概率是 /var/run/faillock/ 目录权限不对,或者 SELinux 拦截了 PAM 写入。
实操建议:
-
/var/run/faillock/必须属主root:root,权限0755;里面每个用户文件(如alice)权限应为0600,否则 PAM 拒绝读写 - RHEL/CentOS 8+ 默认启用 SELinux,
pam_faillock需要auth_use_nfs类型权限,运行setsebool -P authlogin_nsswitch_use_ldap on不起作用,正确做法是检查ausearch -m avc -ts recent | grep faillock,再用audit2allow生成策略 - systemd-tmpfiles 有时会重置
/var/run/faillock/权限,可加/usr/lib/tmpfiles.d/faillock.conf固定:d /var/run/faillock 0755 root root -
真正麻烦的从来不是配几行 PAM,而是不同服务各走各的链、不同机制各管各的目录、不同安全模块各守各的边界。漏掉任意一环,字典攻击就从“被拦住”变成“被无视”。










