共计 1548 个字符,预计需要花费 4 分钟才能阅读完成。
技术背景:PAM 认证机制
Linux 系统的身份认证主要由 PAM(Pluggable Authentication Modules)框架管理。当用户执行 passwd 命令时,系统会依次调用以下模块:

- pam_cracklib:检查密码强度
- pam_unix:处理密码哈希更新
- pam_tally2:失败尝试计数(可能触发锁定)
# 典型 PAM 调用链示例
$ cat /etc/pam.d/system-auth
# 输出包含类似条目:auth required pam_tally2.so deny=5
password required pam_unix.so sha512 shadow
错误成因深度分析
主要触发场景
- 账户锁定状态:连续 5 次(默认值)密码错误触发 pam_tally2 锁定
- 文件权限异常 :
/etc/shadow的权限不是640或属主非 root - SELinux 干扰:安全上下文阻止密码修改操作
- 磁盘空间不足:无法生成临时认证 token
关键日志定位
# 查看认证日志(实时监控)$ tail -f /var/log/secure | grep -i "token"
# 典型错误输出示例:
passwd: pam_unix(passwd:chauthtok): authentication token manipulation error
多维度解决方案
方案 1:单用户模式绕过
- 重启系统并在 GRUB 界面按
e编辑内核参数 - 在
linux16行末尾添加init=/bin/bash - 按 Ctrl+ X 启动后执行:
# 重新挂载文件系统可写 mount -o remount,rw / # 直接修改密码 echo "username:newpassword" | chpasswd
方案 2:修复 PAM 配置
# 备份原配置
cp /etc/pam.d/system-auth{,.bak}
# 注释掉可能冲突的模块(如 pam_tally2)sed -i 's/^auth.*pam_tally2.so/#&/' /etc/pam.d/system-auth
# 重置失败计数器(如已锁定)pam_tally2 --user=username --reset
方案 3:权限修复操作
# 检查关键文件权限
ls -l /etc/shadow /var/log/secure
# 修正 shadow 权限
chmod 640 /etc/shadow
chown root:shadow /etc/shadow
# 如果使用 SELinux
restorecon -v /etc/shadow
方案 4:替代密码修改方法
# 使用 openssl 生成加密密码
PASS="$(openssl passwd -6'newpassword')"
# 直接更新 shadow 文件
sed -i "s|^username:[^:]*|username:$PASS|" /etc/shadow
生产环境避坑指南
- 定期检查项:
ls -Z /etc/shadow确认 SELinux 上下文df -h /var确保有足够空间-
grep pam_tally2 /etc/pam.d/*检查锁定阈值 -
最佳实践:
- 重要操作前备份 PAM 配置
- 使用
passwd -S username查看账户状态 - 测试环境验证密码策略变更
安全加固建议
- 临时方案风险:
- 单用户模式需物理接触服务器
-
直接编辑 shadow 文件可能破坏加密格式
-
长期防护措施:
- 配置
pam_faillock替代旧版 tally2 模块 - 部署集中式身份管理(如 FreeIPA)
- 启用审计日志:
auditctl -w /etc/shadow -p wa
延伸思考
- 如何区分
token manipulation error与authentication failure? - 在 LDAP 集成的环境中,PAM 配置有何不同?
- 容器化环境下如何处理密码修改问题?
提示:更复杂的场景建议参考
man pam.conf和Linux-PAM System Administrator's Guide
正文完
发表至: 未分类
近两天内
