我在EBS支持的EC2实例上运行Ubuntu。
为了更改我的实例的安全组,我按照这里的说明将ebs卷移动到一个新的实例。 然后我把我的弹性IP重新分配给新的实例。
现在ssh抱怨rsa密钥已经改变,但是在控制台日志中我没有看到RSA密钥生成的提及。 为什么这样做? 如何获得“新”主机RSA指纹或恢复“旧”指纹?
更新:下面详细介绍的步骤比必要的更多。 pipe理ubuntu ec2服务器上ssh密钥的最简单方法是在实例启动时用用户数据指定它们 。
以下是我如何获得新的服务器RSA指纹:
/dev/sda1 ssh_host_rsa_key被(无声)重新生成。 如果我直接跳到第7步,我应该看到旧实例的host_rsa_key。 /dev/sda1分离旧卷并重新连接到/dev/sdb /dev/sda1 /dev/sdb )中的新ssh_host_rsa_key.pub复制到我的本地known_hosts文件中。 /dev/sda1分离新卷并将其删除。 /dev/sda1 。 问题仍然存在:为什么会改变?
主机密钥是在任何实例的第一次启动时生成的。 初始化脚本在访问机器实例数据的每次启动时运行。 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其他因素如何,它都会根据“虚拟”机器而变化,并且可以保证您连接到您认为正在连接的服务器)