EC2 通过 boto3 从实例获取 SSH 主机密钥

问题描述 投票:0回答:2

Python 脚本启动一个实例。然后该脚本需要通过 SSH 登录。但要通过 SSH 主机验证,它必须获取在启动期间在实例上生成的主机公钥。

这些键通常会打印在实例的控制台日志中:

-----BEGIN SSH HOST KEY KEYS-----
...
-----END SSH HOST KEY KEYS-----

如何通过boto3 API获取这些信息?我能想到的一种方法是将实例的用户 cloud-init 脚本中的信息写入 s3 存储,然后让 python 脚本读取它。有没有更好的办法?可以从实例内部添加到 ec2 实例的自定义标签吗?

amazon-web-services amazon-ec2
2个回答
1
投票

您无需在每次启动实例时生成新密钥,只需在启动 EC2 实例时“指定现有密钥”即可。这样,它始终可以使用相同的密钥对,并且您的流程大大简化。 顺便说一下,应该

程序很少需要使用 SSH 连接到另一台计算机

。如果您想要在另一台计算机上运行脚本,您可以通过用户数据(用于初始启动)来执行此操作,或使用 AWS Systems Manager 运行命令 - AWS Systems Manager 在现有 Amazon EC2 实例上运行脚本。


0
投票

不幸的是,没有安全且编程的方式来获取新的 EC2 实例的公共主机密钥。每个人所做的都是第一次盲目连接到 EC2 实例,忽略有关未知主机密钥的警告,相信没有中间人,并将主机密钥缓存在 ~/.aws/known_hosts 中以供将来使用。每次重新配置 EC2 实例时都必须执行此操作。

一个简单的安全解决方案是向 EC2 实例添加一个脚本,该脚本在首次启动时运行,并将生成的 SSH 主机公钥“发布”到众所周知且可信的位置(例如,任何人都可以读取的 S3 对象,但只能由 EC2 实例的 IAM 角色写入)。然后,您只需等待 EC2 实例首次启动,然后从 S3 下载 SSH 公共主机密钥并将其添加到客户端的 ~/.ssh/known_hosts 文件中。之后,SSH 将成功连接,并且不会出现主机密钥警告。当然,每次重新部署 EC2 实例时,主机密钥都会更改,并且您必须刷新 ~/.ssh/known_hosts 中的条目。但至少它是安全的。

另一个安全解决方案具有在实例重新部署后仍然存在的稳定主机密钥的优势,即在 EC2 实例启动之前生成一个主机密钥对,并将其传递给 EC2 实例以在首次启动时使用(直接通过用户数据或间接使用 AWS 秘密管理器、S3 等)。然后,您将添加一个在首次启动时运行的脚本,用于设置/替换 EC2 实例中的 SSH 主机密钥。

然后您可以直接将已知且可信的主机密钥添加到客户端的 ~/.ssh/known_hosts 中,并且该密钥将在 EC2 实例重新部署中保持稳定。 管理所有这些并保护敏感主机私钥的保密性非常不方便,并且会带来一系列问题。大多数人只是承认,每次重新部署 EC2 实例时,他们都必须大胆地通过不安全的通道刷新主机密钥。

© www.soinside.com 2019 - 2024. All rights reserved.