问题现象
升级 OpenSSH 后,sshd 服务能正常启动、端口正常监听、配置文件检测无报错,但远程 SSH 密码认证全部失败,控制台登录正常。
ssh -v 客户端日志显示: Sent password. Incoming packet: SSH2_MSG_USERAUTH_FAILURE Server requested: publickey,password根本原因
执行rpm -e openssh*卸载旧版 RPM 包时,RPM 包管理的不只是二进制文件,还包括它安装时创建的配置文件,其中就有/etc/pam.d/sshd。这个文件是 PAM(可插拔认证模块)的服务定义文件,sshd 在UsePAM yes(默认)的情况下,每次认证都要读取这个文件来决定走哪条认证链路。
源码编译安装(./configure && make && make install)不会重新创建 PAM 配置文件,因为 PAM 配置属于发行版集成层面的内容,不属于 OpenSSH 源码包自身的安装范畴。
结果就是:旧版 RPM 删除了/etc/pam.d/sshd→ 新版 sshd 启动时找不到该文件 → 密码认证这一步因为 PAM 栈失效而必然失败,但 sshd 本身、网络、配置语法检查全部正常,所以表象具有很强的迷惑性。
排查这个问题走的弯路
| 排查方向 | 结果 | 教训 |
|---|---|---|
| 检查端口、防火墙、安全组 | 都正常 | 这类问题先看认证日志比先查网络更高效 |
| 检查 sshd_config 语法 | 无报错 | sshd -t 只检查 sshd 自身配置,不检查 PAM |
| 检查私钥权限、GSSAPI 选项 | 已在更早步骤修复,非本次原因 | 容易和之前的报错混淆,需要每次重新确认现象 |
| 怀疑 UseDNS 超时 | 排除 | 真正卡点在认证阶段而非连接阶段 |
| 怀疑密码本身错误 | 排除(su - root可正常切换) | 控制台能登录、su 能成功,已经能说明密码没问题,该信号被发现得偏晚 |
用sshd -d调试模式 | 直接定位到 PAM 报错 | 这是最快定位此类问题的方法,应该更早使用 |
关键定位手段
真正定位到根因靠的是两步:
cat /etc/pam.d/sshd返回No such file or directory—— 直接暴露文件丢失/usr/sbin/sshd -d调试模式前台运行,能实时打印 PAM 认证链路的详细报错,是排查"端口通、密码对、但登录失败"这类问题最有效的手段,比看/var/log/secure更直接
标准解决方案
bash
# 重建标准 CentOS 7 的 sshd PAM 配置(用 vi 手工编辑,避免 heredoc 复制粘贴导致格式损坏) vi /etc/pam.d/sshd内容:
#%PAM-1.0 auth substack password-auth auth include postlogin account required pam_sepermit.so account required pam_nologin.so account include password-auth password include password-auth session required pam_selinux.so close session required pam_loginuid.so session required pam_selinux.so open env_params session optional pam_keyinit.so force revoke session include password-auth session include postloginbash
systemctl restart sshd通用经验教训(适用于所有"卸载旧 RPM + 编译安装新版"类升级)
- rpm -e 删除的不只是程序本身,还包括它创建的所有配置文件(包括
/etc/ssh/sshd_config、/etc/pam.d/sshd等),这些文件源码编译安装都不会自动补回来,必须人工核对清单。 - 升级前应该完整备份的范围不只是
/etc/ssh/,还应该包括所有可能被 RPM 关联管理的配置目录,比如:
bash
mkdir -p /root/upgrade_backup cp -r /etc/ssh /etc/pam.d/sshd /etc/init.d/sshd /root/upgrade_backup/ 2>/dev/null rpm -ql openssh openssh-server openssh-clients > /root/upgrade_backup/rpm_filelist.txt提前导出rpm -ql文件清单,卸载后逐一核对哪些文件消失了,比事后排查快得多。
- "端口通、密码对、配置语法无报错"不等于认证链路完整,PAM 是独立于 sshd_config 之外的认证层,必须单独验证
/etc/pam.d/sshd是否存在。 - 排查认证类问题时,
sshd -d前台调试模式应该作为第一步而不是最后一步,它能直接打印出 PAM、密钥交换、用户验证每一层的详细信息,比反复猜测配置项更高效。 - heredoc(
cat << EOF)在某些终端/远程工具下粘贴大段文本容易因换行符、特殊字符被截断或拼接错乱,重建系统级配置文件时建议用vi手动编辑并逐行核对,而不是依赖一次性粘贴。