记一次SSH无法密钥登录的故障排查
本文由于某些原因,对其中的“故事性”情节进行了一定的改编或虚构,但技术细节保持真实。
一觉起来,Linux服务器的SSH服务登录不上了。Xshell报“所选的用户密钥未在远程主机上注册”。难道服务器被黑了?
背景
这台服务器曾经是我在维护,去年夏天小江开始和我共同维护。服务器运行Debian操作系统,安装有OpenSSH服务端。由于SSH服务端口在公网暴露,为防止暴力破解密码,我配置禁止了服务器的密码登录方式和root登录,同时配置fail2ban策略阻止对SSH服务的DDoS攻击。
问题发生…?
2月1日,我日常登录服务器检查,顺便翻翻又臭又长的日志,打算看看是否有什么奇怪的情况。正当我像往常一样打开Xshell登录时,却弹出了“所选的用户密钥未在远程主机上注册”的提示。
这通常意味着我的用户名错误,或是使用的密钥对不在服务器对应用户的authorized_keys文件当中。我仔细检查了我选择的密钥对,确实是我长期以来一直在使用的SSH密钥对之一,但再次尝试登录仍然报错。
我的用户名就是我的实名,因此不可能是用户名错。再说,以前从来都是打开Xshell利用保存好的配置直接连接的,绝不可能出现输错信息、选错密钥对这种低级问题。
于是就开始怀疑第二种情况:我用的密钥对不在对应用户的authorized_keys文件当中。这种情况不应当出现,除非服务器被入侵。
复现问题
我立即打电话给小江,询问她是否能够正常登录服务器。在得到肯定的答复后,我请她查看SSH登录记录、系统运行日志等,排查是否有可疑情况。
电话那头小江忙碌了一会,说:“没有发现什么可疑的情况。且,我能够正常登录SSH服务。”
我想了想,“那为啥我登不上?”
“你的账号你问我?不如问问日志。”她没好气的怼我。
“我被锁在外边了,我看个锤子?你赶紧帮我看看。”
对面传来键盘声音,随后她说:“4bbc:93e0这个IPv6是你的地址吗?有error报preauth阶段断开连接。”
我看了下电脑的IP地址,“对的,是这个地址。我再登录一次复现一下。”
“好。”
我再次登录,问题稳定地复现,Xshell仍然弹出“所选的用户密钥未在远程主机上注册”的提示。
电话那头的声音传了过来:“你的密钥对是SHA-1签名的?”
“我不晓得,这个密钥对用了很久,我已经忘记当时创建的参数了,只记得是RSA-4096。”
“不用想了,我猜就是SHA-1签名的。你的密钥对该换了,重新建一个密钥对,签名算法不要选SHA-1,公钥发过来给你录进去。”
寻找原因
我用ssh-keygen生成了一个新的密钥对,我选择生成ed25519密钥对,这样签名方式就会是ed25519而不会是SHA系列:
(注:较新版本的ssh-keygen默认生成的RSA密钥对都不再使用SHA-1,因此也不需要额外指定了)
1 | ****@mzy7-zp224-1002:~$ ssh-keygen -t ed25519 |
随后在小江的帮助下,我终于成功登录了SSH服务。
我迫不及待地打开SSH服务的日志:(截取关键内容)
1 | ****@mzy7-zp224-1002:~$ journalctl -xeu ssh.service |
然后根据上面日志中的“signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms”和电话中提到的“密钥对是SHA-1签名的”进行搜索,终于找到了答案:OpenSSH8.6的发布说明中提到“在SSH协议中,“SSH-rsa”签名方案使用SHA-1哈希算法和rsa公钥算法。OpenSSH将在不久的将来默认禁用此签名方案。”。
我立即查看服务器上OpenSSH的版本:
1 | ****@mzy7-zp224-1002:~$ ssh -V |
什么嘛!原来是升级了OpenSSH!我明明记得上次大维护的时候OpenSSH还是8.x呢!
那么现在,问题的原因就已经明确了:
- 我在很久之前用“默认使用SHA-1签名的SSH密钥对生成器”生成了我的这个密钥对,并一直使用到现在;
- 上次大维护时服务器的OpenSSH版本是8.4,此时OpenSSH仍然允许存在安全风险的SSH-rsa签名方案;
- 服务器上的OpenSSH由于某些原因被升级到了9.2版本,而这个版本不再允许SSH-rsa签名方案;
- 由于我的这一密钥对使用SHA-1签名,此时便被服务器拒绝,问题爆发。
那么OpenSSH为什么被更新了呢?这个问题的答案很明显,不是我干的。
于是我马上打电话向小江确认,得到了肯定的答复:昨天她将服务器的操作系统从Debian11升级到了12,从而导致OpenSSH被升级到9.2版本。
事实上,她在邮件列表通告了这一情况,但我还没有来得及查看。
问题修复
知道了问题的原因,解决方案也就很容易得出了:对所有在用服务器的SSH公钥列表进行检查,废弃使用SHA-1签名方式创建的该密钥对,并切换到ed25519密钥对或是使用SHA-512签名方式的RSA密钥对。
后记
这台暴露在公网的服务器运行OpenSSH8.4已经超过两年,没有被入侵真的是侥幸。。。
