设置 EC2 Instance Connect - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

设置 EC2 Instance Connect

要使用 EC2 Instance Connect 连接到实例,您需要配置支持使用 Instance Connect 的每个实例(这是对每个实例的一次性要求),并且需要向将要使用 Instance Connect 的每个 IAM 用户授予权限。完成以下设置任务后,您可以使用 EC2 Instance Connect 连接到实例

有关设置 EC2 Instance Connect 的更多信息,请参阅使用 Amazon EC2 实例连接保护堡垒主机

Limitations

  • 您可以在以下受支持的 Linux 分发上安装 EC2 Instance Connect:

    • Amazon Linux 2(任何版本)

    • Ubuntu 16.04 或更高版本

  • 如果为 SSH 身份验证配置了 AuthorizedKeysCommandAuthorizedKeysCommandUser 设置,则 EC2 Instance Connect 安装不会更新它们。因此,您无法使用 Instance Connect。

安装 EC2 Instance Connect 的先决条件

  • 确认满足使用 SSH 连接到实例的一般先决条件。

    有关更多信息,请参阅连接到您的实例的常规先决条件

  • 在您的本地计算机上安装 SSH 客户端。

    您的本地计算机很可能已默认安装 SSH 客户端。您可以通过在命令行键入 ssh 来检查 SSH 客户端。如果您的本地计算机无法识别该命令,您可安装 SSH 客户端。有关在 Linux 或 macOS X 上安装 SSH 客户端的信息,请参阅 http://www.openssh.com。有关在 Windows 10 上安装 SSH 客户端的信息,请参阅 Windows 中的 OpenSSH

  • 在本地计算机上安装 Amazon CLI。

    要配置 IAM 权限,您必须使用 Amazon CLI。有关安装 Amazon CLI 的更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon CLI

  • [Ubuntu] 在实例上安装 Amazon CLI。

    要在 Ubuntu 实例上安装 EC2 Instance Connect,您必须在实例上使用 Amazon CLI。有关安装 Amazon CLI 的更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon CLI

任务 1:配置对实例的网络访问

您必须配置以下网络访问权限,以便用户可以使用 EC2 Instance Connect 连接到您的实例:

  • 如果您的用户将通过互联网访问您的实例,则您的实例必须具有公有 IP 地址。有关更多信息,请参阅公有 IPv4 地址和外部 DNS 主机名

  • 如果您的用户要通过实例的私有 IP 地址访问您的实例,则必须建立与 VPC 的私有网络连接,例如使用 Amazon Direct Connect、Amazon 站点到站点 VPN 或 VPC 对等连接,以便用户能够访问实例的私有 IP 地址。

  • 确保与您实例关联的安全组允许来自您 IP 地址端口 22 或您网络上的传入 SSH 流量。默认情况下,VPC 的默认安全组不允许传入 SSH 流量。默认情况下,由启动向导创建的安全组允许传入的 SSH 流量。有关更多信息,请参阅为您的 Linux 实例授权入站流量

  • (Amazon EC2 控制台基于浏览器的客户端)确保与您实例关联的安全组允许来自此服务的 IP 地址范围的入站 SSH 流量。要识别地址范围,请下载由 Amazon 提供的 JSON 文件并筛选 EC2 Instance Connect 的子网,使用 EC2_INSTANCE_CONNECT 作为服务值。有关下载 JSON 文件和按服务进行筛选的更多信息,请参阅《Amazon Web Services 一般参考》中的 Amazon IP 地址范围

任务 2:(视情况而定)在实例上安装 EC2 Instance Connect

如果您使用以下 AMI 之一启动了您的实例,那么您可以跳过此任务,因为它们预安装了 EC2 Instance Connect:

  • Amazon Linux 2 2.0.20190618 或更高版本

  • Ubuntu 20.04 或更高版本

对于这些 AMI 的早期版本,您必须在每个支持使用 Instance Connect 进行连接的实例上安装 Instance Connect。

安装 Instance Connect 将在实例上配置 SSH 守护程序。对于使用 Amazon Linux 2 和 Ubuntu 启动的实例,安装 Instance Connect 的过程是不同的。

Amazon Linux 2

在使用 Amazon Linux 2 启动的实例上安装 EC2 Instance Connect

  1. 使用 SSH 连接到您的实例。

    可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 Amazon Linux 2,默认用户名是 ec2-user

    例如,如果实例是使用 Amazon Linux 2 启动的,实例的公有 DNS 名称是 ec2-a-b-c-d.us-west-2.compute.amazonaws.com,并且密钥对是 my_ec2_private_key.pem,请使用以下命令通过 SSH 连接到实例:

    $ ssh -i my_ec2_private_key.pem ec2-user@ec2-a-b-c-d.us-west-2.compute.amazonaws.com

    有关连接到实例的更多信息,请参阅使用 SSH 连接到 Linux 实例

  2. 在实例上安装 EC2 Instance Connect 程序包。

    对于 Amazon Linux 2,请使用 yum install 命令。

    [ec2-user ~]$ sudo yum install ec2-instance-connect

    将会在 /opt/aws/bin/ 文件夹中看到四个新脚本:

    eic_curl_authorized_keys eic_harvest_hostkeys eic_parse_authorized_keys eic_run_authorized_keys
  3. (可选)验证是否在实例上成功安装了 Instance Connect。

    可以使用 sudo less 命令检查是否正确更新了 /etc/ssh/sshd_config 文件,如下所示:

    [ec2-user ~]$ sudo less /etc/ssh/sshd_config

    如果 AuthorizedKeysCommand 文件中的 AuthorizedKeysCommandUser/etc/ssh/sshd_config 行包含以下值,则成功安装了 Instance Connect:

    AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f AuthorizedKeysCommandUser ec2-instance-connect
    • AuthorizedKeysCommand 设置 eic_run_authorized_keys 文件以从实例元数据中查找密钥

    • AuthorizedKeysCommandUser 将系统用户设置为 ec2-instance-connect

    注意

    如果以前配置了 AuthorizedKeysCommandAuthorizedKeysCommandUser,则 Instance Connect 安装不会更改这些值,并且您无法使用 Instance Connect。

Ubuntu

在使用 Ubuntu 16.04 或更高版本启动的实例上安装 EC2 Instance Connect

  1. 使用 SSH 连接到您的实例。

    可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 Ubuntu AMI,用户名称是 ubuntu

    如果实例是使用 Ubuntu 启动的,实例的公有 DNS 名称是 ec2-a-b-c-d.us-west-2.compute.amazonaws.com,并且密钥对是 my_ec2_private_key.pem,请使用以下命令通过 SSH 连接到实例:

    $ ssh -i my_ec2_private_key.pem ubuntu@ec2-a-b-c-d.us-west-2.compute.amazonaws.com

    有关连接到实例的更多信息,请参阅使用 SSH 连接到 Linux 实例

  2. (可选)确保您的实例具有最新 Ubuntu AMI。

    对于 Ubuntu,请使用以下命令更新实例上的所有程序包。

    ubuntu:~$ sudo apt-get update
    ubuntu:~$ sudo apt-get upgrade
  3. 在实例上安装 Instance Connect 程序包。

    对于 Ubuntu,使用 sudo apt-get 命令。

    ubuntu:~$ sudo apt-get install ec2-instance-connect

    将会在 /usr/share/ec2-instance-connect/ 文件夹中看到四个新脚本:

    eic_curl_authorized_keys eic_harvest_hostkeys eic_parse_authorized_keys eic_run_authorized_keys
  4. (可选)验证是否在实例上成功安装了 Instance Connect。

    可以使用 sudo less 命令检查是否正确更新了 /lib/systemd/system/ssh.service.d/ec2-instance-connect.conf,如下所示:

    ubuntu:~$ sudo less /lib/systemd/system/ssh.service.d/ec2-instance-connect.conf

    如果 AuthorizedKeysCommand 文件中的 AuthorizedKeysCommandUser/lib/systemd/system/ssh.service.d/ec2-instance-connect.conf 行包含以下值,则成功安装了 Instance Connect:

    AuthorizedKeysCommand /usr/share/ec2-instance-connect/eic_run_authorized_keys %%u %%f AuthorizedKeysCommandUser ec2-instance-connect
    • AuthorizedKeysCommand 设置 eic_run_authorized_keys 文件以从实例元数据中查找密钥

    • AuthorizedKeysCommandUser 将系统用户设置为 ec2-instance-connect

    注意

    如果以前配置了 AuthorizedKeysCommandAuthorizedKeysCommandUser,则 Instance Connect 安装不会更改这些值,并且您无法使用 Instance Connect。

有关 EC2 Instance Connect 程序包的更多信息,请参阅 GitHub 网站上的 aws/aws-ec2-instance-connect-config

任务 3:(可选)安装 EC2 Instance Connect CLI

EC2 Instance ConnectCLI 提供了通过单个命令连接到 EC2 实例的简化体验 mssh instance_id。有关更多信息,请参阅使用 EC2 Instance Connect CLI 进行连接

注意

如果用户仅使用 Amazon EC2 控制台(基于浏览器的客户端)或 SSH 客户端连接到实例,则无需安装 EC2 Instance Connect CLI。

安装 EC2 Instance Connect CLI 程序包

使用 pip 安装 ec2instanceconnectcli 程序包。有关更多信息,请参阅 GitHub 网站上的 aws/aws-ec2-instance-connect-cli,以及 Python Package Index (PyPI) 网站上的 https://pypi.org/project/ec2instanceconnectcli/

$ pip install ec2instanceconnectcli

任务 4:为 EC2 Instance Connect 配置 IAM 权限

如果 IAM 委托人将使用 EC2 Instance Connect 连接到实例,您必须为其授予将公有密钥推送到实例的权限。您可以通过创建 IAM 策略并将策略附加到需要权限的 IAM 委托人来向用户授予权限。有关更多信息,请参阅 Amazon 的操作、资源和条件键EC2 Instance Connect

以下说明介绍如何使用 Amazon CLI 创建策略并将其附加到 IAM 用户。同样的策略可以应用于其他 IAM 委托人,例如 IAM 角色。有关如何使用 Amazon Web Services Management Console 的说明,请参阅 IAM 用户指南中的创建 IAM 策略(控制台)将策略直接附加到用户以添加权限创建 IAM 角色

为 EC2 Instance Connect (Amazon CLI) 授予 IAM 委托人权限

  1. 创建一个 JSON 策略文档,其中包含以下内容:

    • ec2-instance-connect:SendSSHPublicKey 操作。此操作为 IAM 委托人授予将公有密钥推送到实例的权限。使用 ec2-instance-connect:SendSSHPublicKey,考虑限制对特定 EC2 实例的访问。否则,具有此权限的所有 IAM 用户都可以连接到所有 EC2 实例。您还可以通过指定资源 ARN 或使用资源标签作为 条件键来限制访问。

    • ec2:osuser 条件。这指定可以将公有密钥推送到实例的操作系统用户的名称。使用用于启动实例的 AMI 的默认用户名称。对于 Amazon Linux 2,默认用户名称为 ec2-user,对于 Ubuntu,为 ubuntu

    • ec2:DescribeInstances 操作。使用 EC2 Instance Connect CLI 时此操作是必需的,因为包装程序会调用此操作。IAM 委托人可能已经拥有从另一个策略调用此操作的权限。

    下面是示例策略文档。如果您的用户将仅使用 SSH 客户端连接到您的实例,则可以省略 ec2:DescribeInstances 操作的语句。您可以使用通配符 Resource 替换 * 中的指定实例,以授予用户使用 EC2 Instance Connect 访问所有 EC2 实例的权限。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2-instance-connect:SendSSHPublicKey", "Resource": [ "arn:aws:ec2:region:account-id:instance/i-1234567890abcdef0", "arn:aws:ec2:region:account-id:instance/i-0598c7d356eba48d7" ], "Condition": { "StringEquals": { "ec2:osuser": "ami-username" } } }, { "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" } ] }

    上述策略允许访问特定的实例(由其实例 ID 标识)。或者,您也可以使用资源标签控制对实例的访问。基于属性的访问控制是一种授权策略,它根据可附加到用户和 Amazon 资源的标签来定义权限。例如,只有在实例具有包含 tag-key 键和 tag-value 值的资源标签时,以下策略才允许 IAM 用户访问该实例。有关使用标签控制对Amazon资源的访问的更多信息,请参阅 IAM 用户指南中的控制对Amazon资源的访问

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"ec2-instance-connect:SendSSHPublicKey", "Resource": "arn:aws:ec2:region:account-id:instance/*", "Condition":{ "StringEquals":{ "aws:ResourceTag/tag-key":"tag-value" } } }, { "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" } ] }
  2. 使用 create-policy 命令创建新的托管策略,并指定您创建的 JSON 文档以作为新策略的内容。

    $ aws iam create-policy --policy-name my-policy --policy-document file://JSON-file-name
  3. 使用 attach-user-policy 命令将托管策略附加到指定的 IAM 用户。对于 --user-name 参数,请指定 IAM 用户的友好名称(而不是 ARN)。

    $ aws iam attach-user-policy --policy-arn arn:aws:iam::account-id:policy/my-policy --user-name IAM-friendly-name