我在 EBS 支持的 EC2 实例上运行 ubuntu。
为了更改我的实例的安全组,我按照说明进行操作这里将 ebs 卷移动到新实例。然后我将弹性 IP 重新分配给新实例。
现在 ssh 抱怨 rsa 密钥已更改,但我在控制台日志中没有看到任何关于 RSA 密钥生成的提示。为什么会这样?我如何获取“新”主机 RSA 指纹或恢复“旧”指纹?
更新: 下面我详细介绍的过程比必要的要复杂得多。在 ubuntu ec2 服务器上管理 ssh 密钥的最简单方法是在实例启动时使用用户数据指定它们。
以下是我获取新服务器 RSA 指纹的方法:
- 运行新的 EBS 支持的实例,从控制台日志记录新的临时 RSA 指纹。
- 停止新实例
- 从新实例中分离 EBS 卷
- 将旧卷附加到
/dev/sda1
新实例 - 启动附加了旧卷的新实例。正如 Michael Lowman 指出的那样,此时
ssh_host_rsa_key
(悄无声息地)重新生成了。如果我直接跳到步骤 7,我应该会看到来自旧实例的 host_rsa_key。 - 停止新实例
- 分离旧卷
/dev/sda1
并重新附加到/dev/sdb
- 将新实例的原始 EBS 启动卷重新附加到
/dev/sda1
- 启动新实例,通过 SSH 连接(RSA 指纹应与步骤 1 中记录的临时指纹匹配)
- 将新内容
ssh_host_rsa_key.pub
从旧的 EBS 卷(现已安装在/dev/sdb
)复制到我的本地known_hosts
文件中。 - 停止新实例,分离新卷
/dev/sda1
并将其删除。 - 分离旧卷并将其重新附加到
/dev/sda1
。 - 启动新实例
- ssh 不会抱怨主机 RSA 指纹
问题仍然存在:为什么它会改变?
答案1
主机密钥在任何实例首次启动时生成。每次启动时都会运行初始化脚本,以访问机器实例数据。初始化脚本将实例 ID 保存在特定文件中:这样,如果该文件不存在或包含不同的 ID,则运行系统初始化程序。
其中包括生成主机密钥(存储在/etc/ssh/ssh_host_{rsa,dsa}_key
),从元数据下载用户公钥并将其存储在文件中authorized_keys
,设置主机名,以及执行任何其他特定于系统的初始化。
由于决定因素不是硬盘,而是(每个实例唯一的)实例 ID,因此当您启动附加到新实例的 EBS 卷时,这些事情将始终完成。
编辑:
我深入研究了 Ubuntu,并安装了一个 ubuntu ami (3ffb3f56)。我不是 ubuntu 的铁杆粉丝(通常更喜欢 debian),所以这次我比平时更深入地了解了 ubuntu upstart 的 init 序列。你正在看的似乎是/etc/init/cloud*.conf
。这些运行/usr/bin/cloud-init
和朋友,其中有类似这样的行
cloud.sem_and_run("set_defaults", "once-per-instance",
set_defaults,[ cloud ],False)
所有代码都是用 Python 编写的,因此非常易读。基础部分由包提供cloud-init
,脚本的后端由 提供cloud-tools
。您可以查看它如何确定“每个实例一次”并以此方式对其进行欺骗,或者使用其他解决方案解决您的问题。祝您好运!
答案2
(据我所知)EC2 映像最初可通过您与之关联的密钥对访问,而不管机器上设置的密钥如何。考虑一下您启动公共 AMI 的情况 - 您没有访问它的私钥/公钥 - 您生成一个密钥对,将其关联,然后使用密钥对中的私钥。此外,如果您有一个失去访问权限的实例,则在另一个实例上重新加载它通常会让您通过设置新的密钥对来访问它。
因此,可以推断,在启动图像时会根据密钥对设置至少一个密钥(根)。
(附注 - “指纹”通常意味着服务器签名 - 它因每个“虚拟”机器而异,与其他因素无关,并且可以提供一些保证,确保您正在连接到您认为您正在连接的服务器)