CentOS7升级OpenSSH修复CVE-2017-15906后SSH密钥认证失效求助
遇到这种手动升级OpenSSH后被锁在SSH之外、密钥无法正常工作的情况,大概率是升级过程中破坏了权限、配置或者SELinux上下文,下面是我整理的排查和解决步骤,都是CentOS 7环境下的常见解决方案:
1. 检查SSH密钥文件及目录的权限(最常见原因)
OpenSSH对~/.ssh目录和密钥文件的权限要求非常严格,任何权限过松都会导致密钥登录失败。
首先登录到服务器的物理终端或者备用管理通道(比如VNC),执行以下命令查看权限:
# 查看~/.ssh目录权限 ls -ld ~/.ssh # 查看authorized_keys文件权限 ls -l ~/.ssh/authorized_keys
正常情况下,输出应该满足:
~/.ssh目录权限为drwx------(700)authorized_keys文件权限为-rw-------(600)- 两者的所有者和所属组必须是你的登录用户(不能是root或其他用户)
如果权限不符合,执行以下命令修正:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 替换成你的用户名,比如centos chown -R your_username:your_username ~/.ssh
2. 验证sshd_config配置是否被覆盖
手动升级OpenSSH时,新版本可能会替换默认的sshd_config文件,导致密钥登录相关的配置被关闭。
执行以下命令检查关键配置项:
grep -E "RSAAuthentication|PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config
确保输出包含以下内容:
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
如果某项配置缺失或被设为no,编辑/etc/ssh/sshd_config修正后,重启sshd服务:
systemctl restart sshd
3. 修复SELinux上下文问题
CentOS 7默认启用SELinux,手动升级后~/.ssh目录或密钥文件的SELinux标签可能会丢失或错误,导致sshd进程无法读取密钥。
查看当前SELinux标签:
ls -Z ~/.ssh/authorized_keys
正确的标签应该是system_u:object_r:ssh_home_t:s0,如果标签不符,执行以下命令修复:
restorecon -Rv ~/.ssh
4. 检查OpenSSH 7.6的算法兼容性
OpenSSH 7.6开始默认禁用了一些老旧的密钥算法(比如基于SHA-1的ssh-rsa),如果你的密钥是旧算法生成的,可能会被拒绝。
先查看sshd的实时日志,定位具体错误:
journalctl -u sshd -f
如果日志中出现类似no matching pubkey found或key type not supported的信息,需要在/etc/ssh/sshd_config中添加允许旧算法的配置:
HostKeyAlgorithms +ssh-rsa PubkeyAcceptedKeyTypes +ssh-rsa
添加后重启sshd服务:
systemctl restart sshd
5. 确认sshd服务状态及进程
有时候升级后旧的sshd进程没有完全退出,或者新服务没有正确启动,导致配置不生效。
检查当前运行的sshd进程:
ps aux | grep sshd
如果发现多个sshd进程或旧版本进程,先杀掉所有进程再重启服务:
pkill sshd systemctl start sshd
额外经验教训
以后手动升级OpenSSH这类关键服务时,一定要先保留一个备用的登录通道(比如开启物理终端、VNC会话),避免升级后SSH断开导致无法远程连接。
内容的提问来源于stack exchange,提问作者averysphere

