丢失pem文件时重新获得对Linux Amazon EC2实例的访问的分步说明

如果在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.准备


首先,您需要保存一些信息,以便您不必分心,也不必切换到其他屏幕(特别是因为这样做很不方便)。 所有数据都可以在实例的详细信息中找到(您已经知道如何到达该实例)。 记录以下设置:

  • 实例ID
  • AMI ID
  • EBS编号
  • 根设备
  • 可用区

对于在VPC中运行的实例,请保存VPC ID值。

对于EC2-classic :如果为实例创建了一个弹性IP地址( Elastic IP ),则还必须保存其值。

要保存的实例设置
可点击的图片

要获取块存储标识符( EBS ID ),请单击Root设备的名称。

EBS编号


步骤2.创建一个临时实例


下一步是创建一个实例,您将使用该实例还原原始实例上的密钥。 如果您有另一个正在运行的实例与已还原实例位于同一区域(可用区)中,并且您同时使用相同的AMI或该操作系统上的操作系统版本创建了该实例,则可以跳过此步骤。复制SSH密钥给它。 如果没有这样的实例,请执行以下操作:

  • 转到EC2控制台(在仪表板上或在“ 实例”菜单中),然后单击“ 启动实例”
  • 在AMI( 选择Amazon Machine Image )选择页面上,选择用于创建原始实例的实例(您在第一步中将其写下-AMI ID )。 如果由于某种原因该AMI不可用,则可以从原始实例创建映像并使用它,或者选择可以将还原的实例的根磁盘连接到的AMI类型。
  • 在“ 选择实例类型”页面上,选择最便宜的类型。
  • 在“ 配置实例详细信息”页面上,指定与我们的实例相同的可用区 。 如果它在VPC中运行,请在“ 网络”项中选择相同的VPC,然后在此区域中指定子网。

    配置可用区

    但是,无需更改网络接口设置。
  • 在“ 添加存储”页面上不需要进行任何更改。
  • 在标签页面( 添加标签 )上,为临时实例添加一个名称,以使其易于识别,然后又不浪费时间来协调实例IDEBS ID ,因为在标题上需要确定要使用哪个实例或卷的页面上该值将出现。

    在“添加标签”页面上的名称

  • 单击查看并启动 ,然后启动
  • 最后一步是选择一个现有的密钥对或创建一个新的密钥对。 下载密钥文件(pem),不要忘了备份,这样就不必再次执行所有操作。

    保存密钥对
  • 保存文件后,使用“ 启动实例”按钮启动实例


步骤3.将根磁盘从还原的计算机连接到临时实例


首先,您需要断开磁盘与原始实例的连接,然后将其连接到临时实例。 由于这是根磁盘,因此在断开原始实例之前,必须先将其停止。

  • 转到“ 实例”部分中的EC2控制台,然后选择原始实例(可以由之前记录的实例ID或与创建临时实例时指定的名称不同的名称来确定)。

    实例停止

    操作-实例状态-停止 ”菜单中的下一步。

    注意! 实例停止时,将删除本地存储(Amazon EC2实例存储)上的所有数据。 如果您具有此类卷的数据,请在必要时将其转移到永久存储中,以确保其安全。
  • 实例停止后,转到“ 弹性块存储-卷”部分,然后选择原始实例的根卷。 它可以通过存储的卷ID或基于“ 附件信息”列中的信息来确定,该信息包含实例的名称。

    静音驱动器

    操作”菜单中的“下一步” -分离音量
  • 将此卷连接到临时实例。 为此,请再次选择它,然后在“ 操作”“附加卷”菜单中,在出现的对话框中,指定您的临时实例。

    驱动器连接

    然后单击“ 附加” 。 如果原始实例是通过AWS Marketplace AMI创建的,并且该部分包含AWS Marketplace代码,则您将收到一条错误消息,指出无法将带有代码的部分连接到工作实例。

    将驱动器与AWS Marketplace代码连接时出错

    在这种情况下,请停止我们的临时实例,然后重复步骤以将原始实例的根卷连接到该临时实例。 第二次尝试应该成功。
  • 现在,您应该看到两个驱动器都已连接到临时实例。

    两个驱动器都连接到一个临时实例
  • 如果停止了实例,请运行它:

    • 转到导航栏的“ 实例”部分。
    • 选择一个临时实例
    • 操作-实例状态-开始 ”菜单中的“下一步”。


步骤4.准备用于通过SSH连接到实例的密钥


Linux用户不需要生成任何其他密钥。 您只需要授予对该文件的读取权限:

chmod 400 my-keypair.pem

如果您正在运行Windows,则进行密钥准备
要连接到Linux计算机,我们将使用PuTTY实用程序,因此,如果您未安装它,请下载它。 要使用它通过SSH进行连接,您将需要一个ppk密钥 ,而使用AWS时,将保存pem格式的密钥。 为了获得所需格式的密钥,请执行以下操作:

  • 打开PuTTYgen (与PuTTY一起安装)
  • 在RSA参数中选择2048位

    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地址。

Windows用户的连接说明
  • 启动腻子
  • 主机名字段中,地址的格式为用户名@ ip-address

    配置PuTTY。主机名

  • 转到“ 连接 -SSH-身份验证”部分,然后下载ppk密钥 (用于身份验证的专用密钥文件)
  • 单击打开 ,然后同意信任服务器
  • 如果在创建ppk密钥时指定了密码,请输入密码以确认输入:

     Using username "ubuntu". Authenticating with public key "imported-openssh-key" Passphrase for key "imported-openssh-key": 

  • 您在服务器上。

    成功登录服务器



步骤6.将密钥从临时实例复制到原始实例


挂载连接到临时实例的卷,以便可以访问其文件系统。

挂载分区
例如,如果驱动器名称为/dev/sdf (在您的实例上显示可能不同),请使用以下操作将卷挂载到/mnt/tempvol

  • 确定映射驱动器的分区名称:

    [user ~]$ lsblk

     NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 10G 0 disk └─xvda1 202:1 0 10G 0 part / xvdf 202:80 0 10G 0 disk └─xvdf1 202:81 0 10G 0 part 

    /dev/xvda1/dev/xvdf1是磁盘分区。 /dev/xvdf1没有安装点(MOUNTPOINT),因此这是我们之前连接的磁盘分区。
  • 创建一个临时目录来安装分区:

    [user ~]$ sudo mkdir /mnt/tempvol
  • 将分区挂载到创建的目录中:

    [user ~]$ sudo mount /dev/ xvdf1 /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实例。

Source: https://habr.com/ru/post/zh-CN420297/


All Articles