使用ECDSA验证Amazon AWS EC2服务器的SSH指纹?

41
当我创建一个新的Amazon EC2服务器时,我像往常一样使用 ssh 连接到它。
我会看到典型的警告:
$ ssh myserver  
The authenticity of host 'ec2-12-34-567-890.compute-1.amazonaws.com (12.34.567.890)'     can't be established.
ECDSA key fingerprint is 31:66:15:d2:19:41:2b:09:8a:8f:9f:bd:de:c6:ff:07.
Are you sure you want to continue connecting (yes/no)? 

我在登录前如何验证指纹?

最好的方法是基于原始创建控制台日志之外的内容来进行验证,因为日志可能会在系统重新启动、执行大型系统安装脚本生成大量输出时被清除,或者连接到一个旧系统上,该系统的密钥在创建时没有被跟踪。


2
一种方法是使用具有已知指纹的自己的密钥(请参见:http://serverfault.com/a/581458/86472)。如果您控制实例(并计划该场景 - 即设置实例),则很容易在启动时获取指纹 - 然后您想要做什么取决于您(例如发布到S3,Route53,Cloudwatch,将其发送电子邮件等)。最简单的事情之一是每小时运行一个cron作业,以更新实例上的标记(可以从控制台查看)。 - cyberx86
2个回答

35

Amazon EC2控制台现在有一个基于web的终端(可以保证安全连接)。在“实例”页面上,转到操作>连接>EC2实例连接>连接。在终端中,使用ssh-keygen命令来显示任意数量的主机密钥算法的指纹。以下示例显示了Ed25519 hostkey的SHA-256和MD5指纹:

sudo ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key
sudo ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key -E md5

在基于Web的终端介绍之前,之前的回答如下:

正如@joelparkerhenderson的回答所述,您可以从服务器的初始启动日志中收集主机密钥指纹,当主机密钥生成时(由cloud-init脚本):

enter image description here


如果您无法通过此方式收集密钥,可以通过从私有Amazon网络内的另一个受信任的实例连接到目标实例来获取它们,从而使自己免受中间人攻击。

在信任实例(您已知道指纹的实例)的终端上,您可以使用以下命令来收集指纹(172.33.31.199是私有IP):

$ ssh-keyscan 172.33.31.199 > ec2key
$ ssh-keygen -l -f ec2key
256 SHA256:oZHeiMEPLKetRgd3M5Itgwaqr2zJJH93EvSdx5UoHbQ <ip> (ED25519)
2048 SHA256:8zg105EUFFrPFpVzdfTGsgXnxuSpTiQd85k0uNapUio <ip> (RSA)
256 SHA256:L7UXLw0djE5B9W7ZhvrkYVSTZyi1MEQ2dBaRtpkkUGY <ip> (ECDSA)

如果你没有其他实例的指纹信息,可以创建一个新的临时实例,仅用于收集密钥。首先使用新的临时实例的起始启动日志查找密钥。从公共网络连接到临时实例,然后通过私有的亚马逊网络连接到目标实例,以收集其密钥。完成之后,可以放弃临时实例。


我已经准备好了 WinSCP连接到EC2实例的安全指南


1
刚刚使用了这个答案(谢谢!),我的第一次尝试(使用t2实例)最终没有生成任何ssh-keyscan。原来t2实例启动到VPC中,我必须使用非t2实例才能访问Amazon的私有网络。 - Ryan Manes

26

以下是我在创建EC2系统期间使用的两个解决方案。

解决方案1:使用Amazon EC2仪表板

  • 进入https://console.aws.amazon.com
  • 点击“EC2”链接。
  • 在左侧栏中选择“实例”
  • 选择您想要的实例名称
  • 点击选择按钮“操作”,并选择“获取系统日志”(又名“控制台输出”)
  • 在控制台输出中,您应该看到正在生成密钥

解决方案2:使用AWS EC2命令行

您可以使用aws命令或ec2-get-console-output命令。这两个命令都可以从Amazon下载。

要使用您的EC2私有密钥pem文件、证书pem文件、区域和实例:

ec2-get-console-output \
  --private-key pk-ABCDEF1234567890.pem \
  --cert cert-ABCDEF1234567890.pem \
  --region us-east-1c \
  i-e706689a   

输出结果会像这样显示ssh主机密钥指纹:

ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
ec2: 1024 e0:79:1e:ba:2e:3c:71:87:2c:f5:62:2b:0d:1b:6d:7b  root@ip-10-243-118-182 (DSA)
ec2: 256 31:66:15:d2:19:41:2b:09:8a:8f:9f:bd:de:c6:ff:07  root@ip-10-243-118-182 (ECDSA)
ec2: 2048 ce:ec:3b:d3:34:3f:f3:45:76:81:9e:76:7a:d9:f5:e8  root@ip-10-243-118-182 (RSA)
ec2: -----END SSH HOST KEY FINGERPRINTS-----

aws 工具的工作方式类似。

注意:这些解决方案仅在创建时或在您可以获取控制台日志时才适用。对于任何时间都能使用的更广泛的解决方案,请参见 Martin 的答案。


4
但这仅适用于实例的第一次运行,当日志包括密钥生成时。当您重新启动实例时,无法再找到指纹。还有其他的方法吗? - Martin Prikryl
1
@Martin 说得好!理想情况下,亚马逊可以在 EC2 仪表板上添加指纹作为一列。我会在这个问题上添加赏金,以鼓励人们提供帮助。 - joelparkerhenderson
1
谢谢,这真的帮了我很大忙。AWS是我第一次设置的环境,所以能够通过e2c仪表板获取密钥要简单得多。 - ouonomos
1
我的密钥显示在 BEGIN SSH HOST KEY FINGERPRINTS 下面,就像这个答案中一样,但是它们是以 base64 的形式显示的。而且,即使将它们转换为十六进制,也没有一个与通过 ssh 连接时显示的密钥匹配。问题出在哪里? - Snackoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接