CentOS root被锁定,PAM模块faillock解锁命令
输完密码屏幕一闪,提示“Permission denied”,再试一次直接连提示都没了,心跳瞬间飙高——root被锁了。别急着拔电源,CentOS用PAM的faillock把你关进小黑屋,也能用同一条链子把你放出来,只要敲对命令。

一分钟判断是不是faillock搞的鬼
先别乱翻日志,直接看/var/run/faillock目录。下面如果躺着root文件,基本坐实:连续输错密码触发阈值,账户被硬锁。cat一下,里面有时间戳、TTY、远程IP,证据确凿。文件存在=锁,文件消失=放人,比/var/log/secure翻页快十倍。
faillock参数速查,别背整本man
记不住拼写没关系,常用就三条:
faillock --user root --reset 立刻清零失败计数,锁自动解除
faillock --user root 查看当前失败记录,还剩几次机会一目了然

faillock --user root --lock 手动上锁,测试演练时用的多
敲完reset没有回显就是成功,再ssh root,熟悉的提示符瞬间回来。
现场没root,怎么拿到解锁权限
很多人卡在“账户被锁→只能用root解锁→root被锁”死循环。CentOS留了两条后路:
1. 控制台物理机直接插显示器,single模式进系统,不需要密码就能拿到shell,再执行faillock --reset。
2. 云主机用“救援模式”挂载原盘,chroot进去后同样一条命令;各大云平台叫法不同,入口都在控制台“救援/Recovery”按钮。

两条路共同点:本地操作绕过PAM认证栈,faillock不会拦你。
改配置,别让下次再被锁
锁一次长记性,改完参数就算手滑也不怕。打开/etc/security/faillock.conf,把下面三行调到舒服数值:
deny = 5 连续错五次才锁,给运维留点手滑空间
unlock_time = 900 900秒=15分钟自动解,比打电话叫醒同事快
fail_interval = 900 900秒内累计五次才算,防止暴力遍历
改完保存,立即生效,不需要重启。保险起见再开一终端,主动faillock --user root确认计数归零。
Ansible批量救场脚本
机器一多,逐台敲命令会疯。把下面片段存成unlock_root.yml,一键跑完上百台:
• hosts: all
become: yes
tasks:
• name: check if root is locked
shell: test -f /var/run/faillock/root && echo locked || echo ok
register: lock_status
changed_when: false
• name: reset faillock for root
command: faillock --user root --reset
when: "'locked' in lock_status.stdout"
跑完看ok与changed统计,changed>0说明真有机器被锁,清单自动生成,下次还能复用。
日志留痕,别让黑锅自己背
解锁后顺手把记录写进工单:执行时间、失败来源IP、是否reset。这样下次有人再问“为什么root登不上”,直接甩日志,避免反复排查。faillock动作本身会写authpriv,用ausearch -m USER_AUTH -ts recent能一键拉出时间线,比手工截图靠谱。
常见坑合集
坑1:把deny设成0想关闭功能,结果PAM解析失败,所有用户直接无法登录。正确姿势是注释掉faillock行或把deny改成超大值,千万别写0。
坑2:只改faillock.conf,却没检查/etc/pam.d/system-auth里有没有silent参数,导致失败次数不记录,以为配置失效。保持模块参数一致才能生效。
坑3:云主机开了SELinux,chroot后忘记restorecon,结果重置成功却仍旧无法登录。随手restorecon -Rv /var/run/faillock保平安。
CentOS root被锁定,先瞄/var/run/faillock,确认后一条faillock --user root --reset秒解;改/etc/security/faillock.conf把阈值调到顺手,再用Ansible批量检查,以后就算全员手滑也能淡定喝茶。

