Linux系统用户认证连环坑:从passwd重试耗尽到ssh登录被拒的排查与修复

张开发
2026/5/3 15:00:05 15 分钟阅读
Linux系统用户认证连环坑:从passwd重试耗尽到ssh登录被拒的排查与修复
1. 密码修改失败的连环陷阱第一次在Linux服务器上遇到passwd: Have exhausted maximum number of retries for service这个报错时我盯着屏幕愣了半天。明明用root权限执行命令密码复杂度也符合要求怎么系统就死活不让改密码了呢这种看似简单的用户认证问题往往藏着PAM可插拔认证模块系统的复杂逻辑。先还原下典型场景新建用户后首次密码设置成功但后续修改时系统直接拒绝。执行passwd或chpasswd命令都会触发同样的错误甚至尝试用--stdin参数直接传入密码也无效。这时候如果莽撞地直接修改/etc/pam.d/system-auth文件可能会引发更严重的连锁反应。关键排查点其实藏在系统日志里。通过journalctl -u sshd或tail -f /var/log/secure可以看到PAM模块的详细验证流程。常见的情况是pam_pwquality.so模块在作祟——这个负责密码策略的组件会检查密码历史记录。我曾遇到过企业合规要求开启密码记忆功能导致系统在/etc/security/opasswd里保存了最近5次密码哈希任何重复使用都会触发这个报错。实操解决方案有两种路径临时方案清空/etc/security/opasswd文件记得先备份但这种方法在合规审计严格的环境会被记入异常操作持久方案调整/etc/pam.d/system-auth中的password requisite pam_pwquality.so配置段添加remember0参数禁用历史检查或者增大retry3的尝试次数# 检查当前密码策略 grep pam_pwquality /etc/pam.d/system-auth # 安全修改配置的推荐方式避免直接编辑 cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak pam-config --add --pwquality --retry52. SSH登录的幽灵拒绝更诡异的情况是本地su切换用户完全正常但同个用户通过SSH登录时明明输入了正确密码系统却返回Permission denied。这种割裂现象往往让新手运维怀疑人生实际上这是SSH的访问控制层在抢答。诊断三板斧应该这样用在客户端用ssh -vvv userhost查看详细握手过程在服务端实时监控tail -f /var/log/auth.logUbuntu或/var/log/secureRHEL检查sshd的AllowUsers/DenyUsers指令这是最容易被忽视的访问控制最近处理的一个案例特别典型某企业的定制镜像在/etc/ssh/sshd_config里写死了AllowUsers admin backup导致所有新建用户都无法登录。更坑的是这个配置项可能出现在Include引入的子配置文件里比如/etc/ssh/sshd_config.d/access.conf。建议用这个命令全面检索# 递归查找所有SSH配置中的访问控制项 grep -rE ^(Allow|Deny)(Users|Groups) /etc/ssh/如果确定是配置问题修改后需要优雅重启SSH服务以避免中断现有连接# 新版本系统 systemctl reload sshd # 旧版本系统 kill -HUP $(pgrep -f sshd -D)3. su切换root的认证谜题当普通用户执行su - root输入正确密码仍报Authentication failure时80%的问题出在PAM的wheel组限制。但剩下20%的情况可能涉及更隐蔽的机制比如SELinux上下文错误或者/etc/login.defs的隐藏配置。深度排查步骤确认/etc/pam.d/su中是否启用了pam_wheel.so# 检查关键配置行 grep wheel /etc/pam.d/su如果存在auth required pam_wheel.so use_uid且未注释意味着只有wheel组成员才能su到root检查/etc/login.defs中的SU_WHEEL_ONLY参数grep ^SU_WHEEL /etc/login.defs这个全局参数会覆盖PAM模块的设置验证目标用户是否在wheel组groups 用户名 getent group wheel最后检查SELinux布尔值getsebool -a | grep su setsebool -P su_exec_autotrans 1对于企业环境我建议采用更安全的权限管理方式通过sudo精细控制而不是放开su权限。比如在/etc/sudoers.d/下创建专属配置# 允许devops组用户执行所有命令无需密码 %devops ALL(ALL) NOPASSWD: ALL # 允许audit组用户仅查看日志文件 %audit ALL(root) /bin/cat /var/log/*4. 系统化排错方法论面对这类认证连环坑需要建立系统化的排查路径。我总结的四层诊断法在实践中非常有效日志层第一时间检查系统认证日志不同发行版的日志路径可能不同# RHEL/CentOS tail -n 50 /var/log/secure # Debian/Ubuntu journalctl -u sshd --since 1 hour agoPAM层使用pam_tally2检查失败计数重置用户尝试次数# 查看失败记录 pam_tally2 --user用户名 # 重置计数器 pam_tally2 --user用户名 --reset文件权限层关键认证文件必须保持正确权限# 标准权限参考 ls -l /etc/passwd /etc/shadow /etc/group -rw-r--r-- 1 root root passwd ---------- 1 root shadow shadow网络限制层检查hosts.deny、firewalld或iptables规则# 快速查看当前防火墙规则 iptables -L -n | grep -E 22|ssh遇到特别顽固的案例时可以启用PAM调试模式获取更详细的信息。临时修改/etc/pam.d/sshd文件在关键模块添加debug参数auth [success1 defaultignore] pam_unix.so debug记住每次修改PAM配置后一定要保留root终端会话或者事先准备好带外管理通道。我有次在远程服务器上误改PAM配置导致所有用户被锁最后只能通过控制台恢复。

更多文章