如果在AWS中创建Linux实例时,未创建密钥对(KeyPair)来通过SSH访问它,或者它们丢失了,那么必须执行许多操作才能访问该计算机。 您无法通过AWS控制台将密钥添加到已在运行的实例。 我们可以通过三种方式恢复对实例的SSH访问。
最简单的方法是
使用cloud-init机制配置密钥 (感谢
yusman的提示)。 但是,如果
/home
目录的权限被破坏,或者该发行版不支持cloud-init指令,则无法使用。
第二种方法是从现有实例
创建映像 (Amazon Machine Image),然后基于该实例启动新实例,但使用密钥。 因此,实际上将克隆现有机器,唯一的区别是在最后阶段可以创建新密钥。 对于具有大磁盘的实例,创建映像可能会花费很长时间,并且您将不得不重新配置与该计算机关联的所有服务。 因此,在大多数情况下,此方法将花费更长的时间。
亚马逊的官方文档描述了
另一种方式 。 它允许您恢复访问并最大程度地减少重新配置服务的成本(与第二种方法相比),这些服务与失去访问权限的实例相关。 本文提供了有关它的分步说明。
注意! 此方法仅适用于将块存储(Amazon Elastic Block Store)用作根设备的实例,不适用于本地实例存储(Amazon EC2实例存储)。要查明您使用的根设备类型,请打开Amazon EC2控制台,转到
Instances ,选择一个实例,然后在面板中检查
Root设备类型参数的值以及详细信息。
如果您的计算机具有
EBS ,那么此方法适合您。
步骤1.准备
首先,您需要保存一些信息,以便您不必分心,也不必切换到其他屏幕(特别是因为这样做很不方便)。 所有数据都可以在实例的详细信息中找到(您已经知道如何到达该实例)。 记录以下设置:
对于在
VPC中运行的实例,请保存
VPC ID值。
对于
EC2-classic :如果为实例创建了一个弹性IP地址(
Elastic IP ),则还必须保存其值。
可点击的图片要获取块存储标识符(
EBS ID ),请单击
Root设备的名称。
步骤2.创建一个临时实例
下一步是创建一个实例,您将使用该实例还原原始实例上的密钥。 如果您有另一个正在运行的实例与已还原实例位于同一区域(可用区)中,并且您同时使用相同的AMI或该操作系统上的操作系统版本创建了该实例,则可以跳过此步骤。复制SSH密钥给它。 如果没有这样的实例,请执行以下操作:
- 转到EC2控制台(在仪表板上或在“ 实例”菜单中),然后单击“ 启动实例”
- 在AMI( 选择Amazon Machine Image )选择页面上,选择用于创建原始实例的实例(您在第一步中将其写下-AMI ID )。 如果由于某种原因该AMI不可用,则可以从原始实例创建映像并使用它,或者选择可以将还原的实例的根磁盘连接到的AMI类型。
- 在“ 选择实例类型”页面上,选择最便宜的类型。
- 在“ 配置实例详细信息”页面上,指定与我们的实例相同的可用区 。 如果它在VPC中运行,请在“ 网络”项中选择相同的VPC,然后在此区域中指定子网。
但是,无需更改网络接口设置。
- 在“ 添加存储”页面上不需要进行任何更改。
- 在标签页面( 添加标签 )上,为临时实例添加一个名称,以使其易于识别,然后又不浪费时间来协调实例ID和EBS ID ,因为在标题上需要确定要使用哪个实例或卷的页面上该值将出现。
- 单击查看并启动 ,然后启动
- 最后一步是选择一个现有的密钥对或创建一个新的密钥对。 下载密钥文件(pem),不要忘了备份,这样就不必再次执行所有操作。
- 保存文件后,使用“ 启动实例”按钮启动实例
步骤3.将根磁盘从还原的计算机连接到临时实例
首先,您需要断开磁盘与原始实例的连接,然后将其连接到临时实例。 由于这是根磁盘,因此在断开原始实例之前,必须先将其停止。
- 转到“ 实例”部分中的EC2控制台,然后选择原始实例(可以由之前记录的实例ID或与创建临时实例时指定的名称不同的名称来确定)。
“ 操作-实例状态-停止 ”菜单中的下一步。
注意! 实例停止时,将删除本地存储(Amazon EC2实例存储)上的所有数据。 如果您具有此类卷的数据,请在必要时将其转移到永久存储中,以确保其安全。
- 实例停止后,转到“ 弹性块存储-卷”部分,然后选择原始实例的根卷。 它可以通过存储的卷ID或基于“ 附件信息”列中的信息来确定,该信息包含实例的名称。
“ 操作”菜单中的“下一步” -分离音量 - 将此卷连接到临时实例。 为此,请再次选择它,然后在“ 操作”“附加卷”菜单中,在出现的对话框中,指定您的临时实例。
然后单击“ 附加” 。 如果原始实例是通过AWS Marketplace AMI创建的,并且该部分包含AWS Marketplace代码,则您将收到一条错误消息,指出无法将带有代码的部分连接到工作实例。
在这种情况下,请停止我们的临时实例,然后重复步骤以将原始实例的根卷连接到该临时实例。 第二次尝试应该成功。
- 现在,您应该看到两个驱动器都已连接到临时实例。
- 如果停止了实例,请运行它:
- 转到导航栏的“ 实例”部分。
- 选择一个临时实例
- “ 操作-实例状态-开始 ”菜单中的“下一步”。
步骤4.准备用于通过SSH连接到实例的密钥
Linux用户不需要生成任何其他密钥。 您只需要授予对该文件的读取权限:
chmod 400 my-keypair.pem
如果您正在运行Windows,则进行密钥准备要连接到Linux计算机,我们将使用PuTTY实用程序,因此,如果您未安装它,请
下载它。 要使用它通过SSH进行连接,您将需要一个
ppk密钥 ,而使用AWS时,将
保存pem格式的密钥。 为了获得所需格式的密钥,请执行以下操作:
- 打开PuTTYgen (与PuTTY一起安装)
- 在RSA参数中选择2048位
- 通过单击加载下载已保存的Pem密钥(加载现有的私钥文件)
- 指定密码短语( 密钥密码短语 )并确认( 确认密码短语 )。 这不是必需的,但更安全。 唯一的不同是,使用此键进行连接时,始终会要求您输入此短语以确认输入
- 使用在创建临时实例期间创建密钥对( KeyPair )时指定的名称保存文件(该名称与pem密钥的名称一致)
密钥已准备就绪。
步骤5.通过SSH连接到临时实例
使用键在端口22上连接。 用户名取决于使用哪个AMI创建实例。 您一开始就写下来。 可以使用以下用户名:
- Amazon Linux 2或Amazon Linux AMI-EC2用户
- Centos AMI-centos
- Debian AMI-管理员或root
- Fedora AMI-EC2用户或fedora
- RHEL AMI-EC2用户或root
- SUSE AMI-EC2用户或root
- Ubuntu AMI-Ubuntu
- 对于其余的,如果名称ec2-user和root不起作用,请联系您的AMI供应商
您要连接的主机名是
user@aws-host.amazon.com ,其中
user是上述名称,
aws-host.amazon.com是实例的ip地址,可以在“详细信息”选项卡上找到(您从一开始就保存了参数)。 该参数称为
IPv4公用IP 。 请注意,如果您不使用
Elastic IP ,则每次启动实例时,它将具有一个新的ip地址。
步骤6.将密钥从临时实例复制到原始实例
挂载连接到临时实例的卷,以便可以访问其文件系统。
挂载分区例如,如果驱动器名称为
/dev/sdf
(在您的实例上显示可能不同),请使用以下操作将卷挂载到
/mnt/tempvol
:
将SSH密钥从临时实例复制到已安装的分区。
注意! 使用命令行上提供的用户名。 这是必要的,因为尽管您已经成功连接了标准名称,该名称取决于操作系统(在步骤5中进行了描述),但在AWS Marketplace中的AMI中,登录后可能有所不同。 例如,对于Bitnami认证的AMI WordPress,当通过SSH登录时,Ubuntu的标准登录名是ubuntu
。 但是,登录后的用户名是bitnami
复制键例如,如果用户名是
ubuntu
,请使用以下命令进行复制:
[user ~]$ cp .ssh/authorized_keys /mnt/tempvol/home/ ubuntu /.ssh/authorized_keys
如果您无权编辑
/mnt/tempvol
的文件,请使用
sudo
复制文件并检查权限以确保您可以访问原始实例:
- 检查文件权限:
[user ~]$ sudo ls -l /mnt/tempvol/home/ ubuntu /.ssh/authorized_keys
total 4
-rw------- 1 200 500 392 Aug 15 00:06 authorized_keys
在示例中,200是用户ID,500是组ID。
- 使用
sudo
重新启动密钥复制命令:
[user ~]$ sudo cp .ssh/authorized_keys /mnt/tempvol/home/ ubuntu /.ssh/authorized_keys
- 检查文件的权限是否已更改:
[user ~]$ sudo ls -l /mnt/tempvol/home/ ubuntu /.ssh/authorized_keys
如果权利已更改,请还原它们:
[user ~]$ sudo chown 200 : 500 /mnt/tempvol/home/ ubuntu /.ssh/authorized_keys
卸载该部分:
[user ~]$ sudo umount /mnt/tempvol
步骤7.以通过SSH还原访问权限启动实例
- 在EC2控制台中,选择您连接到临时驱动器的驱动器,然后在菜单中: 操作-分离卷 。 等待磁盘状态变为可用 (您可以使用“ 刷新”按钮更新信息)。
如果该部分包含AWS Marketplace代码,请记住要预先终止实例。
- 对于同一驱动器,请转到“ 操作”菜单-“附加卷”
- 选择原始实例,并指定刚开始记录的根磁盘的名称。
可点击的图片
点击附加
- 运行实例
- 对于EC2-classic :如果为原始实例配置了弹性IP ,则将其与其重新关联:
- 转到导航栏的“ 弹性IP”部分。
- 选择您一开始就写下的弹性IP地址
- 下一步操作-关联地址
- 选择原始实例ID ,然后单击关联
步骤8.访问检查
使用生成的密钥连接到还原的访问实例。
如果新密钥对的名称与前一个不同,请确保使用新的私钥进行连接。步骤9.最后阶段
如果创建新的临时实例以执行所有操作,并且不使用现有实例,则在不再需要它时将其停止:
- 转到导航栏的“ 实例”部分。
- 选择一个临时实例
- 菜单-操作-实例状态-终止
这样,您就可以重新访问Linux Amazon EC2实例。