应先查看/var/log/secure(rhel系)或/var/log/auth.log(debian系)定位ssh登录失败原因,再检查/etc/pam.d/sshd及system-auth/common-auth配置、模块文件存在性与权限,并可临时设usepam no验证是否为pam问题。

看日志:/var/log/secure 或 /var/log/auth.log 里藏了真实原因
登录失败时,PAM 模块不会弹窗提示“哪个模块挂了”,而是默默记进系统日志。不查日志就瞎改配置,等于蒙眼修电路。
先确认你用的是哪类系统:
- RHEL/CentOS/Fedora → 看
/var/log/secure - Debian/Ubuntu → 看
/var/log/auth.log
然后实时抓取登录尝试:
sudo tail -f /var/log/secure
在另一个终端 ssh 登录一次,观察日志里是否出现类似这些关键线索:
-
pam_listfile(sshd:auth): Refused user root for service sshd→ 被pam_listfile.so拦了,检查白名单/黑名单文件路径和内容 -
pam_unix(sshd:auth): authentication failure→ 密码校验失败,但未必是密码错,可能是pam_unix.so前面被其他模块提前拒绝了 -
unable to dlopen(pam_kwallet.so)→ 模块文件不存在或权限不对,ls /lib64/security/pam_kwallet.so看看有没有 -
User not known to the underlying authentication module→ 用户根本没进/etc/passwd,或者 PAM 配置里漏了pam_unix.so
查配置:/etc/pam.d/sshd 和 /etc/pam.d/system-auth 是主战场
PAM 不是单个配置文件,而是一套按服务拆分的规则集。SSH 登录主要受两个文件控制:
-
/etc/pam.d/sshd:只管 SSH 这一个服务,优先级最高 -
/etc/pam.d/system-auth(RHEL系)或/etc/pam.d/common-auth(Debian系):全局基础认证逻辑,被多个服务 include
常见翻车点:
- 复制粘贴配置时多加了一个空格,导致某行被整行忽略(PAM 对格式敏感,注释必须以
#开头且独占一行) - 把
auth [default=die]写成auth [default=bad],结果本该终止的认证流程继续往下走,掩盖了真正问题 - 在
auth段加了pam_deny.so却没加required或requisite,模块被加载但没生效 - 误删了原本存在的
auth required pam_unix.so,导致密码根本没比对就返回失败
快速验证基础链路是否完整:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
grep -E "^(auth|account) +required +pam_unix\.so" /etc/pam.d/sshd /etc/pam.d/system-auth
验模块:/lib64/security/ 下的 .so 文件不是“存在就行”
PAM 模块得满足三个条件才能正常工作:存在、可读、能被动态链接器识别。
执行这三步检查:
- 确认模块文件真实存在:
ls -l /lib64/security/pam_faillock.so(RHEL 7+)或/lib64/security/pam_tally2.so(旧版) - 检查权限是否为 644:
stat -c "%a %n" /lib64/security/pam_faillock.so,非 644 就chmod 644 - 验证能否被加载:
ldd /lib64/security/pam_faillock.so 2>/dev/null | grep "not found",有输出说明缺依赖库
特别注意:pam_kwallet.so、pam_gnome_keyring.so 这类桌面相关模块,在纯服务器环境通常不该出现在 sshd 配置里——图形模块加载失败会拖慢甚至阻断 SSH 认证。
绕过PAM测试:临时禁用它来定位是不是它的问题
如果你怀疑是 PAM 配置本身导致登录失败,最直接的办法是让 SSH 绕过 PAM,直连系统密码校验。
操作前务必确保你有其他登录方式(比如控制台、串口、云平台VNC),否则可能锁死自己:
- 编辑
/etc/ssh/sshd_config,确认这行没被注释且值为no:UsePAM no - 重启服务:
sudo systemctl restart sshd - 再试一次 SSH 登录
如果这时能登进去,100% 是 PAM 配置的问题;如果还是不行,问题在别处(比如 /etc/shadow 字段、shell 路径、家目录权限)。恢复时记得把 UsePAM 改回 yes 并重启。
真正棘手的不是配置写错,而是多个 PAM 文件之间的调用顺序和控制流叠加后产生的副作用——比如 system-auth 里一个 [success=2] 跳转,刚好跨过了你刚加的调试日志模块。这种时候,宁可删掉一半配置逐行加回来,也别靠猜。










