将EBS和EIP移动到新实例后,RSA指纹发生了变化

我在EBS支持的EC2实例上运行Ubuntu。

为了更改我的实例的安全组,我按照这里的说明将ebs卷移动到一个新的实例。 然后我把我的弹性IP重新分配给新的实例。

现在ssh抱怨rsa密钥已经改变,但是在控制台日志中我没有看到RSA密钥生成的提及。 为什么这样做? 如何获得“新”主机RSA指纹或恢复“旧”指纹?

更新:下面详细介绍的步骤比必要的更多。 pipe理ubuntu ec2服务器上ssh密钥的最简单方法是在实例启动时用用户数据指定它们 。

以下是我如何获得新的服务器RSA指纹:

  1. 运行新的EBS支持的实例,从控制台日志logging新的临时RSA指纹。
  2. 停止新的实例
  3. 从新实例中分离出EBS卷
  4. 将旧卷附加到新实例上的/dev/sda1
  5. 启动与旧卷连接的新实例。 就像Michael Lowman指出的那样, ssh_host_rsa_key被(无声)重新生成。 如果我直接跳到第7步,我应该看到旧实例的host_rsa_key。
  6. 停止新的实例
  7. /dev/sda1分离旧卷并重新连接到/dev/sdb
  8. 将新实例的原始EBS启动卷重新附加到/dev/sda1
  9. 启动新的实例,通过SSH连接(RSA指纹应该与步骤1中logging的临时指纹相匹配)
  10. 将旧的EBS卷(现在安装在/dev/sdb )中的新ssh_host_rsa_key.pub复制到我的本地known_hosts文件中。
  11. 停止新实例,从/dev/sda1分离新卷并将其删除。
  12. 分离并重新将旧卷连接到/dev/sda1
  13. 调出新的实例
  14. ssh不会抱怨主机的RSA指纹

问题仍然存在:为什么会改变?

主机密钥是在任何实例的第一次启动时生成的。 初始化脚本在访问机器实例数据的每次启动时运行。 initscript将实例ID保存在一个特定的文件中:这样,如果文件不存在或包含不同的ID,系统初始化的东西就会运行。

这包括生成主机密钥(存储在/etc/ssh/ssh_host_{rsa,dsa}_key ),从元数据下载用户公钥并将其存储在authorized_keys文件中,设置主机名并执行任何其他系统特定初始化。

由于决定因素不是硬盘,而是(对每个实例唯一的)实例ID,所以当您启动连接到新实例的EBS卷时,将始终执行这些操作。

编辑

我特意深入研究了Ubuntu,安装了一个ubuntu ami(3ffb3f56)。 我不是一个大的Ubuntu的人(通常更喜欢debian),所以这是比我通常去的Ubuntu的新贵的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 。 你可以看看它是如何确定“一次一个实例”并以这种方式欺骗,或者用其他解决scheme解决你的问题。 祝你好运!

(据我所知,)EC2图像最初可以通过与您关联的密钥对访问,无论机器上的密钥设置如何。 考虑一下你启动一个公共AMI的场景 – 你没有私钥/公钥来访问它 – 你生成一个密钥对,关联它,并使用密钥对中的私钥。 此外,如果您有一个实例在您失去访问权限,重新加载在另一个实例通常会让您通过设置一个新的密钥对访问它。

因此,有理由认为,在图像启动时至less有一个密钥(root)是基于密钥对设置的。

(一个侧面说明 – “指纹”通常是指服务器签名 – 不pipe其他因素如何,它都会根据“虚拟”机器而变化,并且可以保证您连接到您认为正在连接的服务器)