【问题标题】:SSH fingerprint verification for Amazon AWS EC2 server with ECDSA?使用 ECDSA 对 Amazon AWS EC2 服务器进行 SSH 指纹验证?
【发布时间】:2022-04-06 16:56:37
【问题描述】:

当我创建一个新的 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)? 

如何在登录前验证指纹?

理想情况下,答案基于原始创建控制台日志之外的其他内容——因为日志可能会在系统重新启动后被刷新,或者在生成大量输出的大型系统安装脚本期间,或者连接到具有在创建时未跟踪的密钥的旧系统。

【问题讨论】:

  • 一种方法是使用您自己的具有已知指纹的密钥(请参阅:serverfault.com/a/581458/86472)。如果您控制实例(并计划场景 - 即设置实例),则在启动时获取指纹很容易 - 您想用它做什么由您决定(例如发布到 S3、Route53、Cloudwatch,通过电子邮件发送给他们, ETC。)。最简单的事情之一就是每小时运行一个 cron 作业来更新您实例上的标签(可从控制台查看)

标签: ssh amazon-web-services amazon-ec2 fingerprint ecdsa


【解决方案1】:

Amazon EC2 控制台现在有一个基于 Web 的终端(大概可以保证安全连接)。转到 Instances 页面上的 Actions > Connect > EC2 Instance Connect > Connect。在终端中,使用ssh-keygen 命令显示任意数量的主机密钥算法的指纹。以下示例显示了 Ed25519 主机密钥的 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 脚本)从服务器的初始启动日志中收集主机密钥指纹:


如果您无法通过这种方式收集密钥,您可以通过从私有 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)

如果您没有另一个您知道其指纹的实例,请创建新的临时实例,仅用于收集密钥。首先使用它的初始启动日志找到新临时实例的密钥。从公共网络连接到临时实例。然后通过私有 Amazon 网络从临时实例连接到目标实例来收集目标实例的密钥。之后,您可以丢弃临时实例。


我已经准备好了Guide for connecting to EC2 instance safely using WinSCP

【讨论】:

  • 刚刚使用了这个答案(谢谢!),我的第一次尝试(使用 t2 实例)最终没有用ssh-keyscan 生成任何东西。原来 t2s 启动到 VPC 中,我不得不使用非 t2 实例来访问亚马逊的私有网络。
【解决方案2】:

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

解决方案 1:使用 Amazon EC2 控制面板

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

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

您可以使用aws 命令或ec2-get-console-output 命令。两者都可以从亚马逊下载。

要使用您的 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 的回答。

【讨论】:

  • 但这仅适用于实例的第一次运行,当日志包含密钥生成时。当您重新启动实例时,您再也找不到那里的指纹了。还有什么办法吗?
  • @Martin 好点!理想情况下,Amazon 可以将指纹作为列添加到 EC2 仪表板上。我会为这个问题添加一个赏金来鼓励人们提供帮助。
  • 谢谢你,这是一个巨大的帮助。 AWS 是我设置的第一个环境,因此能够通过 e2c dash 获取密钥就不会那么混乱了。
  • 我的密钥显示在 BEGIN SSH HOST KEY FINGERPRINTS 下,就像在这个答案中一样,但是,在 base64 中。并且它们都不匹配通过ssh 连接时显示的密钥(即使转换为十六进制)。有什么问题?
猜你喜欢
  • 2017-02-08
  • 2021-12-14
  • 2015-10-07
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多