丢失私有密钥时连接到 Linux 实例
如果丢失由 EBS 支持的实例的私有密钥,您可以重新获取对您的实例的访问权限。您必须停止实例,分离卷并将其作为数据卷附加到另一个实例,然后使用新的公有密钥修改 authorized_keys
文件,将卷移回原始实例,并重启实例。有关启动、连接和停止实例的更多信息,请参阅 实例生命周期。
对于具有实例存储支持的根卷的实例,不支持此过程。若要确定实例的根设备类型,请打开 Amazon EC2 控制台,选择 Instances,选择实例,然后在详细信息窗格中检查 Root device type 的值。该值为 ebs
或 instance store
。如果根设备是实例存储卷,则无法使用此过程重新获得对实例的访问权限;您必须拥有私有密钥才能连接到实例。
使用不同的密钥对连接由 EBS 支持的实例的步骤
步骤 1:创建新的密钥对
使用 Amazon EC2 控制台或第三方工具创建新的密钥对。如果您要将新密钥对的名称设置为与丢失的私有密钥相同的名称,则必须先删除现有密钥对。有关创建新密钥对的信息,请参阅选项 1:使用 Amazon EC2 创建密钥对或选项 2:将您自己的公有密钥导入到 Amazon EC2。
步骤 2:获取有关原始实例及其根卷的信息
步骤 3:停止原始实例
依次选择实例状态、停止实例。如果此选项处于禁用状态,则表示实例已停止,或者其根设备是实例存储卷。
当您停止某个实例时,任何实例存储卷上的数据都将被擦除。要保留实例存储卷中的数据,请确保将其备份到持久性存储中。
步骤 4:启动临时实例
选择 Launch Instance (启动实例),然后使用启动向导通过以下选项启动一个临时 实例:
-
在 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。创建新的密钥对,将它下载到您计算机中的安全位置,然后选择 Launch Instances。
步骤 5:从原始实例中分离根卷并将其附加到临时实例
-
在导航窗格中,选择 Volumes,并选择原始实例的根设备卷(您已在上一步骤中记下它的卷 ID)。选择 Actions (操作)、Detach Volume (分离卷),然后选择 Yes, Detach (是,分离)。等待卷的状态变为
available
。(您可能需要选择 Refresh 图标。) -
如果卷仍保持选中状态,则选择 Actions,然后选择 Attach Volume。选择临时实例的实例 ID,记下在 Device (设备) 下指定的设备名称 (例如,
/dev/sdf
),然后选择 Attach (附加)。注意 如果已从 AWS Marketplace AMI 启动原始实例,并且卷包含 AWS Marketplace 代码,则必须先停止临时实例,然后才能附加卷。
步骤 6:将新的公钥添加到已安装到临时实例的原始卷上的 authorized_keys
-
连接到临时实例。
-
在临时实例中,挂载附加到实例的卷以访问其文件系统。例如,如果设备名称为
/dev/sdf
,请使用以下命令将卷挂载为/mnt/tempvol
。注意 您的实例上显示的设备名称可能不同。例如,作为
/dev/sdf
挂载的设备可能在实例上显示为/dev/xvdf
。某些版本的 Red Hat(或其变体,如 CentOS)甚至可能将尾部字母增加 4 个字符,其中/dev/sd
成为f
/dev/xvd
。k
-
使用 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
)。 -
创建临时目录以挂载卷。
[ec2-user ~]$
sudo mkdir /mnt/tempvol
-
使用之前确定的卷名称或设备名称在临时挂载点挂载卷(或分区)。所需命令取决于操作系统的文件系统。
-
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
-
-
在临时实例中,借助临时实例
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:从临时实例中卸载并分离原始卷,然后将其重新附加到原始实例
-
在临时实例中,卸载已附加的卷,以将其重新附加到原始实例。例如,使用以下命令卸载
/mnt/tempvol
处的卷。[ec2-user ~]$
sudo umount /mnt/tempvol
-
从临时实例中分离卷(您在上一步中卸载了该卷):从 Amazon EC2 控制台,为原始实例选择根设备卷(您在上一步中记下了卷 ID),选择 Actions (操作)、Detach Volume (分离卷),然后选择 Yes, Detach (是,分离)。等待卷的状态变为
available
。(您可能需要选择 Refresh 图标。) -
将卷重新附加到原始实例:在卷仍保持选中状态时,选择 Actions (操作),然后选择 Attach Volume (附加卷)。选择原始实例的实例 ID,指定您以前在步骤 2 中记下的原始根设备附加的设备名称(
/dev/sda1
或/dev/xvda
),然后选择 Attach (附加)。重要 如果您不指定与原始附加相同的设备名称,则无法启动原始实例。Amazon EC2 要求根设备卷位于
sda1
或/dev/xvda
。
步骤 8:使用新密钥对连接到原始实例
选择原始实例,然后依次选择实例状态、启动实例。在实例进入 running
状态后,您可以使用新密钥对的私有密钥文件连接到该实例。
如果您的新密钥对和相应私有密钥文件的名称不同于原始密钥对的名称,请确保在连接到实例时指定新私有密钥文件的名称。
步骤 9:清除
(可选) 如果您将不再使用临时实例,可以将其终止。选择该临时实例,然后依次选择实例状态、终止实例。