丢失私有密钥时连接到 Linux 实例 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

丢失私有密钥时连接到 Linux 实例

如果丢失由 EBS 支持的实例的私有密钥,您可以重新获取对您的实例的访问权限。您必须停止实例,分离卷并将其作为数据卷附加到另一个实例,然后使用新的公有密钥修改 authorized_keys 文件,将卷移回原始实例,并重启实例。有关启动、连接和停止实例的更多信息,请参阅 实例生命周期

此过程仅支持具有 EBS 根卷的实例。如果根设备是实例存储卷,则无法使用此过程重新获得对实例的访问权限;您必须拥有私有密钥才能连接到实例。若要确定实例的根设备类型,请打开 Amazon EC2 控制台,选择 Instances,选择实例,然后在详细信息窗格中检查 Root device type 的值。该值为 ebsinstance store

步骤 1:创建新的密钥对

使用 Amazon EC2 控制台或第三方工具创建新的密钥对。如果您要将新密钥对的名称设置为与丢失的私有密钥相同的名称,则必须先删除现有密钥对。有关创建新密钥对的信息,请参阅使用 Amazon EC2 创建密钥对使用第三方工具创建密钥对,并将公有密钥导入 Amazon EC2

步骤 2:获取有关原始实例及其根卷的信息

请记下以下信息,因为您需要它来完成此过程。

Console

获取有关原始实例的信息

  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中选择 Instances (实例),然后选择要连接到的实例。(我们将此称为原始实例。)

  3. Details(详细信息)选项卡上,记下实例 ID 和 AMI ID。

  4. Networking(网络)选项卡上,记下可用区。

  5. Storage(存储)选项卡的 Root device name(根设备名称)下,记下根卷的设备名称(例如 /dev/xvda)。然后,在 Block devices(块存储设备)下,查找此设备的名称并记下卷 ID(例如 vol-0a1234b5678c910de)。

步骤 3:停止原始实例

依次选择实例状态停止实例。如果此选项处于禁用状态,则表示实例已停止,或者其根设备是实例存储卷。

警告

当您停止某个实例时,任何实例存储卷上的数据都将被擦除。要保留实例存储卷中的数据,请确保将其备份到持久性存储中。

步骤 4:启动临时实例

选择 Launch instances(启动实例),然后使用启动向导通过以下选项启动一个临时实例:

  • Choose an AMI (选择一个 AMI) 页面上,选择您启动原始实例时所用的 AMI。如果此 AMI 不可用,您可以创建一个可在已停止的实例中使用的 AMI。有关更多信息,请参阅 创建一个由 Amazon EBS 支持的 Linux AMI

  • Choose an Instance Type (选择一个实例类型) 页上,保留向导为您选择的默认实例类型。

  • Configure Instance Details (配置实例详细信息) 页面上,指定与原始实例相同的可用区。如果您在 VPC 中启动实例,请选择此可用区中的一个子网。

  • Add Tags 页面上,向实例添加标签 Name=Temporary 以指示这是一个临时实例。

  • Review 页面上,选择 Launch。选择您在步骤 1 中创建的密钥对,然后选择 Launch Instances (启动实例)

步骤 5:从原始实例中分离根卷并将其附加到临时实例

  1. 在导航窗格中,选择 Volumes(卷),并选择原始实例的根设备卷(您已在上一步骤中记下它的卷 ID)。选择 Actions (操作)Detach Volume (分离卷),然后选择 Yes, Detach (是,分离)。等待卷的状态变为 available。(您可能需要选择 Refresh (刷新) 图标。)

  2. 如果卷仍保持选中状态,则选择 Actions,然后选择 Attach Volume。选择临时实例的实例 ID,记下在 Device(设备)下指定的设备名称(例如,/dev/sdf),然后选择 Attach(附加)。

    注意

    如果已从 Amazon Web Services Marketplace AMI 启动原始实例,并且卷包含 Amazon Web Services Marketplace 代码,则必须先停止临时实例,然后才能附加卷。

步骤 6:将新的公钥添加到已安装到临时实例的原始卷上的 authorized_keys

  1. 连接到临时实例。

  2. 在临时实例中,挂载附加到实例的卷以访问其文件系统。例如,如果设备名称为 /dev/sdf,请使用以下命令将卷挂载为 /mnt/tempvol

    注意

    您的实例上显示的设备名称可能不同。例如,作为 /dev/sdf 挂载的设备可能在实例上显示为 /dev/xvdf。某些版本的 Red Hat(或其变体,如 CentOS)甚至可能将尾部字母增加 4 个字符,其中 /dev/sdf 成为 /dev/xvdk

    1. 使用 lsblk 命令确定卷是否已分区。

      [ec2-user ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 101G 0 disk └─xvdf1 202:81 0 101G 0 part xvdg 202:96 0 30G 0 disk

      在前一个示例中,/dev/xvda/dev/xvdf 是分区卷,而 /dev/xvdg 不是。如果您的卷已分区,则应在后续步骤中挂载分区 (/dev/xvdf1)),而不是原始设备 (/dev/xvdf)。

    2. 创建临时目录以挂载卷。

      [ec2-user ~]$ sudo mkdir /mnt/tempvol
    3. 使用之前确定的卷名称或设备名称在临时挂载点挂载卷(或分区)。所需命令取决于操作系统的文件系统。

      • Amazon Linux、Ubuntu 和 Debian

        [ec2-user ~]$ sudo mount /dev/xvdf1 /mnt/tempvol
      • Amazon Linux 2、CentOS、SUSE Linux 12 和 RHEL 7.x

        [ec2-user ~]$ sudo mount -o nouuid /dev/xvdf1 /mnt/tempvol
    注意

    如果您收到说明文件系统受损的错误,请运行以下命令以使用 fsck 实用程序检查文件系统并修复任何问题:

    [ec2-user ~]$ sudo fsck /dev/xvdf1
  3. 在临时实例中,借助临时实例 authorized_keys 中的新公有密钥,在已挂载卷上使用以下命令更新 authorized_keys

    重要

    以下示例使用 Amazon Linux 用户名 ec2-user。您可能需要使用其他用户名来替换,例如对于 Ubuntu 实例为 ubuntu

    [ec2-user ~]$ cp .ssh/authorized_keys /mnt/tempvol/home/ec2-user/.ssh/authorized_keys

    如果复制成功,则可以转到下一步骤。

    (可选)如果您没有权限编辑 /mnt/tempvol 中的文件,您必须使用 sudo 更新文件,然后检查文件的权限,以验证您是否能够登录原始实例。请使用以下命令检查文件权限。

    [ec2-user ~]$ sudo ls -l /mnt/tempvol/home/ec2-user/.ssh total 4 -rw------- 1 222 500 398 Sep 13 22:54 authorized_keys

    在这个输出示例中,222 是用户 ID;500 是组 ID。接下来,请使用 sudo 重新运行失败的复制命令。

    [ec2-user ~]$ sudo cp .ssh/authorized_keys /mnt/tempvol/home/ec2-user/.ssh/authorized_keys

    再次运行以下命令以确定权限是否已更改。

    [ec2-user ~]$ sudo ls -l /mnt/tempvol/home/ec2-user/.ssh

    如果用户 ID 和组 ID 已经更改,请使用以下命令进行恢复。

    [ec2-user ~]$ sudo chown 222:500 /mnt/tempvol/home/ec2-user/.ssh/authorized_keys

步骤 7:从临时实例中卸载并分离原始卷,然后将其重新附加到原始实例

  1. 在临时实例中,卸载已附加的卷,以将其重新附加到原始实例。例如,使用以下命令卸载 /mnt/tempvol 处的卷。

    [ec2-user ~]$ sudo umount /mnt/tempvol
  2. 从临时实例中分离卷(您在上一步中卸载了该卷):从 Amazon EC2 控制台,为原始实例选择根设备卷(您在上一步中记下了卷 ID),选择 Actions(操作)、Detach Volume(分离卷),然后选择 Yes, Detach(是,分离)。等待卷的状态变为 available。(您可能需要选择 Refresh (刷新) 图标。)

  3. 将卷重新附加到原始实例:在卷仍保持选中状态时,选择 Actions (操作),然后选择 Attach Volume (附加卷)。选择原始实例的实例 ID,指定您以前在步骤 2 中记下的原始根设备附加的设备名称(/dev/sda1/dev/xvda),然后选择 Attach (附加)

    重要

    如果您不指定与原始附加相同的设备名称,则无法启动原始实例。Amazon EC2 要求根设备卷位于 sda1 或者 /dev/xvda

步骤 8:使用新密钥对连接到原始实例

选择原始实例,然后依次选择实例状态启动实例。在实例进入 running 状态后,您可以使用新密钥对的私有密钥文件连接到该实例。

注意

如果您的新密钥对和相应私有密钥文件的名称不同于原始密钥对的名称,请确保在连接到实例时指定新私有密钥文件的名称。

步骤 9:清除

(可选) 如果您将不再使用临时实例,可以将其终止。选择临时实例,然后依次选择 Instance State(实例状态)和 Terminate instance(终止实例)。