Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Amazon EC2 密钥对

Amazon EC2 使用公有密钥密码术加密和解密登录信息。公有密钥密码术使用公有密钥加密某个数据 (如一个密码),然后收件人可以使用私有密钥解密数据。公有和私有密钥被称为密钥对

要登录您的实例,您必须创建一个密钥对,并在启动实例时指定密钥对的名称,然后使用私有密钥连接实例。在 Linux 实例中,公有密钥内容将放在 ~/.ssh/authorized_keys 内的一个条目中。此操作在启动时完成,使您能够使用私有密钥安全地访问实例,而不是使用密码。

创建密钥对

您可以使用 Amazon EC2 创建密钥对。有关更多信息,请参阅 使用 Amazon EC2 创建密钥对

或者,您也可以使用第三方工具,然后将公有密钥导入 Amazon EC2。有关更多信息,请参阅 将您自己的公有密钥导入 Amazon EC2

每个密钥对需要一个名称。切记选择一个容易记住的名称。Amazon EC2 会将公有密钥与您指定的密钥名称相关联。

Amazon EC2 只会存储公有密钥,您需要存储私有密钥。拥有您的私有密钥的任何人都可以解密您的登录信息,因此将您的私有密钥保存在一个安全的位置非常重要。

Amazon EC2 使用的密钥是 2048-bit SSH-2 RSA 密钥。对于每个区域,您可以拥有多达 5000 个密钥对。

启动并连接到您的实例

当您启动实例时,您应该指定计划用于连接到该实例的密钥对的名称。如果在启动实例时未指定现有密钥对的名称,您将无法连接到该实例。连接到该实例时,您必须指定与在启动该实例时指定的密钥对相应的私有密钥。

注意

Amazon EC2 不保存私有密钥副本;因此,如果您丢失私有密钥,将无法恢复。如果丢失由实例存储支持的实例的私有密钥,您将无法访问该实例;您应该终止该实例并使用新的密钥对启动另一个实例。如果丢失由 EBS 支持的 Linux 实例的私有密钥,您可以重新获取对实例的访问权限。有关更多信息,请参阅 丢失私有密钥时连接到 Linux 实例

多个用户的密钥对

如果您有几个需要访问单个实例的用户,则可以向实例添加用户账户。有关更多信息,请参阅 在 Linux 实例上管理用户账户。您可以为每个用户创建一个密钥对,并将每个密钥对中的公有密钥信息添加到您实例上的每个用户的 .ssh/authorized_keys 文件。然后,您可以将私有密钥文件分配给您的用户。这样一来,您不必将用于根账户的同一个私有密钥文件分配给多个用户。

使用 Amazon EC2 创建密钥对

您可以使用 Amazon EC2 控制台或命令行创建密钥对。创建密钥对之后,您可以在启动实例时指定它。 您还可以向运行的实例添加密钥对以便使其他用户可以连接到该实例。有关更多信息,请参阅添加或替换实例的密钥对

使用 Amazon EC2 控制台创建密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

    注意

    导航窗格位于 Amazon EC2 控制台的左侧。如果您看不到窗格,它可能被最小化了;请选择箭头展开该窗格。

  3. 选择 Create Key Pair

  4. Create Key Pair 对话框的 Key pair name 字段中输入新密钥对的名称,然后选择 Create

  5. 您的浏览器会自动下载私有密钥文件。基本文件名是您为密钥对指定的名称,文件扩展名为 .pem。将私有密钥文件保存在安全位置。

    重要

    这是您保存私有密钥文件的唯一机会。当您启动实例时,您将需要提供密钥对的名称;当您每次连接到实例时,您将需要提供相应的私有密钥。

  6. 如果您将在 Mac 或 Linux 计算机上使用 SSH 客户端连接到您的 Linux 实例,请使用以下命令设置您私有密钥文件的权限,以确保只有您可以读取它。

    Copy
    chmod 400 my-key-pair.pem

使用命令行创建密钥对

您可以使用以下任一命令。有关这些命令行界面的更多信息,请参阅 访问 Amazon EC2

将您自己的公有密钥导入 Amazon EC2

如果不使用 Amazon EC2 创建密钥对,您可以使用第三方工具创建一个 RSA 密钥对,然后将公有密钥导入 Amazon EC2。举例来说,您可以使用 ssh-keygen (通过标准 OpenSSH 安装提供的工具) 创建密钥对。或者,您可以使用 Java、Ruby、Python 和许多其他提供标准库的编程语言来创建 RSA 密钥对。

Amazon EC2 接受以下格式:

  • OpenSSH 公有密钥格式 (格式为 ~/.ssh/authorized_keys)

  • Base64 编码的 DER 格式

  • 如在RFC4716指定的 SSH 公有密钥文件格式

Amazon EC2 不接受 DSA 密钥。请确保您的密钥生成器被设置为创建 RSA 密钥。

支持的长度:1024、2048 和 4096。

要使用第三方工具创建密钥对

  1. 使用您选择的第三方工具生成密钥对。

  2. 将公有密钥保存至本地文件。例如,~/.ssh/my-key-pair.pub (Linux) 或 C:\keys\my-key-pair.pub (Windows)。此文件的文件扩展名并不重要。

  3. 将私有密钥保存至另一个扩展名为 .pem 的本地文件。例如,~/.ssh/my-key-pair.pem (Linux) 或 C:\keys\my-key-pair.pem (Windows)。将私有密钥文件保存在安全位置。当您启动实例时,您将需要提供密钥对的名称;当您每次连接到实例时,您将需要提供相应的私有密钥。

使用 Amazon EC2 控制台通过以下步骤导入密钥对。

导入公有密钥

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择 Import Key Pair

  4. Import Key Pair 对话框中,选择 Browse,然后选择之前保存的公有密钥文件。在 Key pair name 字段中为新的密钥对键入一个名称,然后选择 Import

使用命令行导入公有密钥

您可以使用以下任一命令。有关这些命令行界面的更多信息,请参阅 访问 Amazon EC2

在成功导入公有密钥文件后,您可以按照以下说明使用 Amazon EC2 控制台验证密钥对是否成功导入。

验证密钥对是否已导入

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 从导航栏中,选择您在其中创建密钥对的区域。

  3. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  4. 验证您导入的密钥对是否在密钥对的显示列表中。

使用命令行查看密钥对

您可以使用以下任一命令。有关这些命令行界面的更多信息,请参阅 访问 Amazon EC2

在 Linux 上检索密钥对的公有密钥

在本地 Linux 或 Mac 计算机上,可使用 ssh-keygen 命令检索密钥对的公有密钥。

从计算机检索公有密钥

  1. 在您已下载私有密钥的计算机上使用 ssh-keygen 命令:

    Copy
    ssh-keygen -y
  2. 在提示输入密钥所在的文件时,请指定您的 .pem 文件的路径,例如:

    Copy
    /path_to_key_pair/my-key-pair.pem
  3. 该命令将返回公有密钥:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
    hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
    lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
    qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
    BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE

    如果此命令失败,请运行以下命令以确保更改对您的密钥对文件的权限,以便只有您才能查看该文件:

    Copy
    chmod 400 my-key-pair.pem

在 Windows 上检索密钥对的公有密钥

在本地 Windows 计算机上,您可以使用 PuTTYgen 获取密钥对的公有密钥。

启动 PuTTYgen,选择 Load,然后选择 .ppk.pem 文件。PuTTYgen 会显示公有密钥。

从实例检索密钥对的公有密钥

您在启动实例时指定的公有密钥也可以通过实例元数据使用。要查看您在启动实例时指定的公有密钥,请从您的实例中使用以下命令:

Copy
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE my-key-pair

如果您更改用于连接到实例的密钥对,我们将不会更新实例元数据以显示新的公有密钥;您看到的仍是当您启动实例时在实例元数据中为密钥对指定的公有密钥。

有关更多信息,请参阅 检索实例元数据

或者,在 Linux/ 实例中,公有密钥内容放在 ~/.ssh/authorized_keys 内的条目中。您可以在编辑器中打开此文件。以下是名为 my-key-pair 的密钥对的示例条目。它包括后跟密钥对名称的公有密钥。例如:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE my-key-pair

验证您的密钥对指纹

在 Amazon EC2 控制台的 Key Pairs (密钥对) 页面上,Fingerprint (指纹) 列显示从您的密钥对生成的指纹。AWS 根据密钥对是由 AWS 还是第三方工具生成以不同方式计算指纹。如果您是使用 AWS 创建的密钥对,则会使用 SHA-1 哈希函数计算指纹。如果您使用第三方工具创建了密钥对并将公有密钥上传到 AWS,或者如果您从一个现有的 AWS 创建的私有密钥生成了一个新的公有密钥并将其上传到 AWS,则会使用 MD5 哈希函数计算指纹。

您可以使用 Key Pairs (密钥对) 页面上显示的指纹验证您本地计算机上的私有密钥是否与 AWS 中存储的公有密钥匹配。

如果您使用 AWS 创建了密钥对,那么您可以使用 OpenSSL 工具从私有密钥文件生成指纹:

Copy
$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

如果您使用第三方工具创建了密钥对并将公有密钥上传到 AWS,则可以使用 OpenSSL 工具从您本地计算机上的私有密钥文件生成指纹。

Copy
$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

输出应与控制台中显示的指纹匹配。

删除您的密钥对

当您删除密钥对时,仅删除 Amazon EC2 的公有密钥副本。删除密钥对不影响您计算机上的私有密钥或是已使用该密钥对启动的任何实例上的公有密钥。您不能使用已删除的密钥对启动新实例,不过,只要您仍然有私有密钥 (.pem) 文件,就可以继续连接到使用已删除的密钥对启动的任何实例。

注意

如果您使用的是 Auto Scaling 组 (例如,在 Elastic Beanstalk 环境中),请确保您要删除的密钥对未在启动配置中指定。Auto Scaling 检测到运行不正常的实例时会启动替代实例;但是,如果找不到密钥对,实例将启动失败。

您可以使用 Amazon EC2 控制台或命令行删除密钥对。

使用控制台删除密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择密钥对,然后选择 Delete

  4. 系统提示时,请选择 Yes

使用命令行删除密钥对

您可以使用以下任一命令。有关这些命令行界面的更多信息,请参阅 访问 Amazon EC2

注意

如果您从一个实例创建了一个 Linux AMI,然后在不同区域或账户中使用该 AMI 启动一个新实例,则新实例将包含来自原始实例的公有密钥。这允许您使用与原始实例相同的私有密钥连接到新实例。您可以使用任意文本编辑器从 .ssh/authorized_keys 文件中删除此公有密钥的条目,从而从实例中删除此公有密钥。有关管理您的实例用户和使用特定密钥对提供远程访问的更多信息,请参阅在 Linux 实例上管理用户账户

添加或替换实例的密钥对

您可以更改用于访问实例默认系统账户的密钥对。例如,如果组织中用户需要使用单独的密钥对访问系统用户账户,您可以向实例中添加一个密钥对。或者,如果某人有 .pem 文件的副本,而您想要防止他们访问实例 (例如在他们已离开组织的情况下),您可以将其替换为新密钥对。

注意

这些程序用于修改默认用户账户的密钥对,例如 ec2-user。有关向实例添加用户账户的更多信息,请参阅 在 Linux 实例上管理用户账户

在开始前,使用 Amazon EC2 控制台第三方工具创建新的密钥对。

添加或替换密钥对

  1. 从新密钥对检索公有密钥。有关更多信息,请参阅 在 Linux 上检索密钥对的公有密钥在 Windows 上检索密钥对的公有密钥

  2. 使用现有的私有密钥文件连接到实例。

  3. 使用您选择的文本编辑器,在实例上打开 .ssh/authorized_keys 文件。将新密钥对的公有密钥信息粘贴到现有公有密钥信息下。保存文件。

  4. 从实例断开,并测试能否使用新的私有密钥文件连接到实例。

  5. (可选) 如果您要替换现有密钥对,请连接到实例并从 .ssh/authorized_keys 文件中删除原始密钥对的公有密钥信息。

注意

如果您使用的是 Auto Scaling 组 (例如,在 Elastic Beanstalk 环境中),请确保您要替换的密钥对未在启动配置中指定。Auto Scaling 检测到运行不正常的实例时会启动替代实例;但是,如果找不到密钥对,实例将启动失败。

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

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

对于实例存储支持的实例。若要确定实例的根设备类型,请打开 Amazon EC2 控制台,选择 Instances,选择实例,然后在详细信息窗格中检查 Root device type 的值。该值为 ebsinstance store。如果根设备是实例存储卷,则必须拥有私有密钥才能连接到实例。

先决条件

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

使用另一密钥对连接由 EBS 支持的实例

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

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

  3. 保存您完成此过程将需要的以下信息。

    • 记下原始实例的实例 ID、AMI ID 和可用区。

    • 根设备字段中,请记下根卷的设备名称 (例如 /dev/sda1/dev/xvda)。选择链接并在 EBS ID 字段中输入卷 ID (vol-xxxxxxxxxxxxxxxxx)。

    • [EC2-Classic] 如果原始实例拥有关联的弹性 IP 地址,请记下详细信息窗格的 Elastic IP 字段中显示的弹性 IP 地址。

  4. 依次选择 ActionsInstance StateStop。如果 Stop (停止) 处于禁用状态,则表示要么实例已停止,要么其根设备是一个实例存储卷。

    警告

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

  5. 选择 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

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

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

    注意

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

  8. 连接到临时实例。

  9. 在临时实例中,安装连接到实例的卷,以访问其文件系统。例如,如果设备名称为 /dev/sdf,请使用以下命令将卷安装为 /mnt/tempvol

    注意

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

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

      Copy
      [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. 创建临时目录以安装卷。

      Copy
      [ec2-user ~]$ sudo mkdir /mnt/tempvol
    3. 使用之前确定的卷名称或设备名称在临时安装点安装卷 (或分区)。

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

    重要

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

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

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

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

    Copy
    [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 重新运行失败的复制命令:

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

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

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

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

    Copy
    [ec2-user ~]$ sudo chown 222:500 /mnt/tempvol/home/ec2-user/.ssh/authorized_keys
  11. 在临时实例中,卸载已连接的卷,以将其重新连接至原始实例。例如,使用以下命令卸载 /mnt/tempvol 处的卷:

    Copy
    [ec2-user ~]$ sudo umount /mnt/tempvol
  12. 在 Amazon EC2 控制台中,选择您已记下卷 ID 的卷,选择 Actions,然后选择 Detach Volume。等待卷的状态变为 available。(您可能需要选择 Refresh 图标。)

  13. 如果卷仍保持选中状态,则选择操作,然后选择 Attach Volume。选择原始实例的实例 ID,将设备名称指定为您之前在附加原始根设备时记录的名称 (/dev/sda1/dev/xvda),然后选择 Yes, Attach

    重要

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

  14. 选择原始实例,选择 Actions,选择 Instance State,然后选择 Start。在实例进入 running 状态后,您可以使用新密钥对的私有密钥文件连接到该实例。

    注意

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

  15. [EC2-Classic] 如果原始实例在停止前拥有相关联的弹性 IP 地址,您必须按照以下说明重新将其与该实例关联起来:

    1. 在导航窗格中,选择 Elastic IPs

    2. 选择您在此程序开始时记下的弹性 IP 地址。

    3. 选择 Actions,然后选择 Associate address

    4. 选择原始实例的 ID,然后选择 Associate

  16. (可选) 如果您将不再使用临时实例,可以将其终止。选择临时实例,选择 Actions,选择 Instance State,然后选择 Terminate