我在 Ubuntu 12.04 测试服务器上使用 Puppet 推出了新版本/etc/ssh/sshd_config
。配置与之前的配置完全相同,只是删除了以下行:
HostKey /etc/ssh/ssh_host_ecdsa_key
我注意到,从那时起,我在尝试连接到盒子时遇到了很多类似但不同的错误,例如:“%主机名%已经改变,并且对应 IP 地址的密钥%IP地址% 保持不变。”
我猜想这是因为我的电脑之前默认使用 ECDSA 密钥,而现在不可用。所以我重新添加了该行sshd_config
并重新启动了 SSH。
它并没有完全解决问题,从那时起我就不断遇到问题。我可以多次顺利连接到服务器,甚至可能连续几天。然后突然间我开始收到错误,提示主机密钥已更改,服务器停止接受我的公钥进行身份验证。
似乎总是这样,一旦我摆弄它一会儿并从不同位置连接,我就会突然能够再次使用我的公钥连接,并且不再收到有关可能的中间人攻击的错误。
几天前,我尝试重新生成所有 3 个主机密钥(删除它们并运行dpkg-reconfigure openssh-server
重新生成它们的程序)。正如预期的那样,我必须删除旧密钥并接受新密钥才能连接。我以为当时可能已经解决了,但现在问题又出现了。
自从我上次重新生成主机密钥以来,没有任何内容被修改/etc/ssh/
——那么,什么可能导致我经常无法连接,我的公钥不起作用,然后最终接受新密钥并且一切在一段时间内再次开始正常工作?
当事情不正常时(当我收到有关主机密钥更改的错误时,然后服务器停止接受我的公钥),不会向服务器写入任何内容/var/log/auth.log
。这让我想到,也许它有时会以某种方式击中另一台机器,但我也不知道这是怎么可能的,因为 DNS 条目是正确的,并且总是返回相同的 IP 地址。
答案1
您收到该消息的常见原因有三种。
按概率大致排序,它们分别是:
您自己更改了主机密钥,但未在客户端计算机上清除或更新它们。
这是最常见的情况。对密钥文件进行校验,并绝对确保它们没有更改。您已将 SSH 配置更改为显示(或请求)与以前不同的密钥类型。
例如,您以前想要 RSA 或 DSA 密钥,现在使用 ECDSA —— 这是“密钥更改”。
如果是这种情况,请验证并接受新密钥(或者如果这不是您想要的,请撤消更改)。
(听起来您处于情况 #2 —— 撤消更改,重新启动 sshd,并验证一切是否按预期工作。如果您没有在任何地方接受新密钥,撤消更改应该会使错误消失。)有人在做一些恶意的事情
SSH 警告的中间人攻击已经露出了它的真面目。有人正在积极尝试拦截您的通信以窃取您的私钥或做一些您几乎肯定不希望他们做的事情。
如果你已经排除了 1,并且你确定你没有做 2,那么你应该假设 3,直到你能证明不是这样。这意味着不登录.——当用户忽略巨大的警告横幅并将密钥交给攻击者时,世界上所有的 SSH 安全措施都无济于事。
调查你和你的服务器之间的通道,在你尝试登录时检查服务器的连接日志(从已知良好的终端)等——这里有太多的方法可以执行攻击,我无法列举所有可能的对策和检测策略,但信息技术安全肯定会有一些想法。
答案2
如果可能/为了测试/调试:
- 使用 IP 而不是主机名(只是为了确保)
- 网络上是否存在多台具有相同 IP 的机器(DHCP 提供的 IP 被另一台具有固定 IP 的主机使用)?
- 如果机器使用 DHCP,它们的 IP 可能会随机更改(启动顺序等),也许您现在正尝试连接到不同的主机 - 启用密码验证并查看您的着陆位置。
- 在客户端上 cat /home/username/.ssh/known_hosts 查找具有重复密钥但具有不同 ips/主机名的行
例如:
192.168.56.3 ecdsa-sha2-nistp256 AAAAE2...fPfFAyoGSVAvs=
192.168.56.4 ecdsa-sha2-nistp256 AAAAE2...fPfFAyoGSVAvs=