首次通过连接时SSH和键新铸造的数字海洋Droplet虚拟机正在运行FreeBSD(每本教程),我们收到一条消息“无法确定主机 blah-blah 的真实性”。我明白这意味着我的电脑没有存储指纹与之比较。所以我的 SSH 客户端无法知道另一端的 SSH 服务器是否合法。
此时,我们有两个选择:
- 我们可以盲目地继续前进,按照TOFU“首次使用即信任”反安全模型。如果我们成为中间人攻击,我们就落入了他们的圈套。
- 或者我们可以通过其他方式发现服务器的指纹,然后与第一次连接时显示的指纹进行比较。
亚马逊为其 EC2 实例提供了这样一种机制,用于学习新服务器的指纹,这里讨论。
➥ 是否存在这样的机制数字海洋“droplet”虚拟机实例,学习服务器的指纹?
答案1
我知道这是一个老问题,但是我今天遇到了完全相同的问题,并且 OP 对 TOFU 反安全模型的指出是正确的,所以这就是我用来避免 MITM 风险的方法。
通常,正如问题所暗示的那样,真的没有办法无需与服务器管理员交谈即可验证密钥。然而...
...如果你做ssh-keygen -lf
有权访问服务器,您可以通过在公钥或私钥上运行来显示 SSH 密钥的指纹......
...幸运的是,目前 DigitalOcean 提供了一个基于 Web 的控制台,可以直接登录到 droplet,从而让您可以访问相关服务器。要进入控制台:
- 前往您的帐户仪表板。
- 在侧边栏的“管理”标题下,选择“Droplets”。
- 选择您想要验证指纹的液滴。
- 它可能会默认显示“图表”子部分,但您需要选择“访问”子部分。
- 从那里您应该会看到“启动控制台”或“重置根密码”的选项。
现在,由于 DigitalOcean 控制台要求您以 root 身份登录,因此您需要一个 root 密码。因此,如果您像我一样,在最初设置 droplet 时选择使用更安全的 SSH 身份验证,则可以省去一些麻烦,先选择“重置 Root 密码”。一旦 DigitalOcean 向您发送新的 root 密码,请按以下步骤操作:
- 选择“启动控制台”。要登录,用户名是
root
,密码是您设置的密码(或 DigitalOcean 发送给您的重置代码)。提示:控制台确实接受复制粘贴,这对于密码重置代码很有用。此外,对于重置,您将立即被要求确认重置代码并选择新密码,因此请做好准备。 - 进入后,无论
cd
你的 droplet 操作系统存储系统级 SSH 密钥的位置如何(对于我来说,在 Ubuntu 18.04 上,它位于 下/etc/ssh
;我使用了这个答案)。 - 从那里,运行以下 bash 脚本(或类似操作系统的 shell)以查看所有密钥的所有指纹:(
for file in *; do ssh-keygen -lf $file; done;
我将其作为一行代码执行,标点符号如图所示,它对我来说是有效的;不知道它是否是惯用的 bash 脚本。如果它遇到非密钥或受密码保护的私钥文件,它会注意到这一事实并将它们无害地传递下去。它是从这个有用的网站) - 将显示的输出与原始 SSH 真实性质询进行比较。如果不匹配,则说明存在中间人风险,不应接受密钥。
如果有人知道更简单的方法,例如通过 DigitalOcean 通信或仪表板的某些隐藏部分获取指纹信息,请随时发布另一个答案,我会很乐意赞成它。