在 Lightsail 上访问和配置实例元数据服务 (IMDS) - Amazon Lightsail

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Lightsail 上访问和配置实例元数据服务 (IMDS)

您可以使用以下其中一种方法,从正在运行的实例中访问实例元数据:

  • 实例元数据服务版本 1 (IMDSv1) – 一种请求/响应方法

  • 实例元数据服务版本 2 (IMDSv2) – 一种面向会话的方法

    重要

    并非 Lightsail 中的所有实例蓝图都支持 imdsv2。使用 MetadataNoToken 实例指标跟踪对使用 IMDSv1 的实例元数据服务的调用次数。有关更多信息,请参阅查看实例指标

默认情况下,您可以使用 IMDSv1 和/或 IMDSv2。实例元数据服务根据以下条件区分 IMDSv1 和 IMDSv2 请求:在任何给定请求中存在的是 PUT 还是 GET 标头(对于 IMDSv2 是唯一的)。有关更多信息,请参阅借助 EC2 实例元数据服务的增强功能,为开放式防火墙、反向代理和 SSRF 漏洞增加深度防御

您可以在每个实例上配置实例元数据服务,以确保本地代码或用户必须使用 IMDSv2。在指定必须使用 IMDSv2 时,IMDSv1 不再起作用。有关更多信息,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的配置实例元数据选项

要检索实例元数据,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的检索实例元数据

注意

此部分中的示例使用实例元数据服务的 IPv4 地址:169.254.169.254。如果要通过 IPv6 地址检索实例的实例元数据,请确保启用并改用 IPv6 地址:fd00:ec2::254。实例元数据服务的 IPv6 地址与 IMDSv2 命令兼容。

实例元数据服务版本 2 的工作原理

IMDSv2 使用面向会话的请求。对于面向会话的请求,您创建一个会话令牌以定义会话持续时间,该时间最少为 1 秒,最多为 6 小时。在指定的持续时间内,您可以将相同的会话令牌用于后续请求。在指定的持续时间到期后,您必须创建新的会话令牌以用于将来的请求。

重要

默认情况下,从亚马逊 Linux 2023 启动的 Lightsail 实例将配置 imdsv2。

以下示例使用 Linux 和 PowerShell shell 脚本以及 IMDSv2 来检索顶级实例元数据项目。这些示例执行以下操作:

  • 使用 PUT 请求创建持续 6 小时(21600 秒)的会话令牌

  • 将会话令牌标头存储在名为 TOKEN(在 Linux 上)或 token(在 Windows 上)的变量中

  • 使用令牌请求顶级元数据项

通过运行以下命令开始:

  • 在 Linux 上:

    • 首先,使用以下命令生成令牌。

      [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
    • 然后,通过令牌使用以下命令生成顶级元数据项。

      [ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
  • 在 Windows 上:

    • 首先,使用以下命令生成令牌。

      PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
    • 然后,通过令牌使用以下命令生成顶级元数据项。

      PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/

创建令牌后,您可以重复使用令牌,直到令牌过期。在以下示例中,每个命令都会获取用于启动实例的蓝图(亚马逊云机器镜像(AMI))的 ID。上一个示例中的令牌可以重复使用。该令牌存储在 $TOKEN(在 Linux 上)或 $token(在 Windows 上)中。

  • 在 Linux 上:

    [ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id
  • 在 Windows 上:

    PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id

在使用 IMDSv2 请求实例元数据时,请求必须包含以下内容:

  • PUT 请求 – 使用 PUT 请求可启动到实例元数据服务的会话。PUT 请求返回一个令牌,该令牌必须包含在对实例元数据服务的后续 GET 请求中。使用 IMDSv2 时,需要具有该令牌才能访问元数据。

  • 令牌 – 将该令牌包含在对实例元数据服务的所有 GET 请求中。如果将令牌使用设置为 required,没有有效令牌或令牌过期的请求将显示 401 - Unauthorized HTTP 错误代码。有关更改令牌使用要求的信息,请参阅《AWS CLI 命令参考update-instance-metadata-options中的。

    • 令牌是实例特定的密钥。令牌在其他实例上无效,如果尝试在生成令牌的实例外部使用,令牌将会被拒绝。

    • PUT 请求必须包含一个标头,它以秒为单位指定令牌的生存时间(TTL)。TTL 最多可以指定为 6 小时(21600 秒)。令牌表示一个逻辑会话。TTL 指定令牌的有效时间长度,因而指定会话的持续时间。

    • 在令牌过期后,要继续访问实例元数据,您必须使用另一个 PUT 请求创建新会话。

    • 您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,在每次需要访问实例元数据服务时生成并立即使用令牌可能更方便。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不是在每次需要请求实例元数据时都编写 PUT 请求。对并发令牌数量没有实际限制,每个令牌均表示自己的会话。不过,IMDSv2 仍然受到正常实例元数据服务连接和限制的制约。有关更多信息,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的查询限制

允许在 IMDSv2 实例元数据请求中使用 HTTP GETHEAD 方法。如果 PUT 请求包含 X-Forwarded-For 标头,则会被拒绝。

默认情况下,PUT 请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1。如果需要更大的跃点数限制,您可以使用 update-instance-metadata-options 命令进行调整。例如,您可能需要使用更大的跃点数限制,以便与实例上运行的容器服务保持向后兼容。有关更多信息,请参阅《AWS CLI 命令参考update-instance-metadata-options中的。

转换为使用 实例元数据服务版本 2

使用实例元数据服务版本 2 (IMDSv2) 为可选项。将继续无期限支持实例元数据服务版本 1 (IMDSv1)。如果您选择迁移以使用 IMDSv2,我们建议您使用以下工具和转换途径。

帮助转换为 IMDSv2 的工具

如果您的软件使用 IMDSv1,请使用以下工具帮助重新配置软件,以使用 IMDSv2。

  • AWS 软件:最新版本的软件开发工具包和 AWS CLI 支持 im AWS dsv2。要使用 imdsv2,请确保您的实例具有最新版本的 AWS 软件开发工具包和。 AWS CLI有关更新的信息 AWS CLI,请参阅《AWS Command Line Interface 用户指南》 AWS CLI中的安装、更新和卸载。所有的 Amazon Linux 2 软件包都支持 IMDSv2。

  • 实例指标:IMDSv2 使用由令牌支持的会话,而 IMDSv1 不使用。MetadataNoToken 实例指标跟踪对使用 IMDSv1 的实例元数据服务的调用次数。通过查看该指标是否为零,您可以确定是否以及何时将所有软件升级为使用 IMDSv2。有关更多信息,请参阅在 Amazon Lightsail 中查看实例指标

  • Lightsail API 操作和 AWS CLI 命令的更新:对于现有实例,您可以使用update-instance-metadata-options AWS CLI 命令(或 UpdateInstanceMetadataOptionsAPI 操作)要求使用 imdsv2。以下命令是一个示例。请务必InstanceName替换为实例的名称,并RegionName使用您的实例 AWS 区域 所在的名称进行替换。

    aws lightsail update-instance-metadata-options --region RegionName --instance-name InstanceName --http-tokens required

要求 IMDSv2 访问的建议途径

在使用上述工具时,我们建议您按照以下途径转换为 IMDSv2:

步骤 1:在开始时

将您的实例上使用角色凭证的软件 AWS 开发工具包 AWS CLI、和软件更新为兼容 IMDSv2 的版本。有关更新的信息 AWS CLI,请参阅AWS Command Line Interface 用户指南》 AWS CLI中的升级到最新版本的。

然后,使用 imdsv2 请求更改直接访问实例元数据(换句话说,不使用 S AWS DK)的软件。

步骤 2:在转换期间

使用实例指标 MetadataNoToken 跟踪您的转换进度。此指标显示对在实例上使用 IMDSv1 的实例元数据服务的调用次数。有关更多信息,请参阅查看实例指标

步骤 3:在所有实例上一切准备就绪时

在实例指标 MetadataNoToken 记录 IMDSv1 使用次数为零时,说明在所有实例上一切准备就绪。在此阶段,您可以通过命令要求使用 imdsv2。update-instance-metadata-options您可以在正在运行的实例上进行这些更改,而无需重新启动实例。

更新现有实例的实例元数据选项只能通过 Lightsail API 或。 AWS CLI它目前在 Lightsail 控制台中不可用。有关更多信息,请参阅update-instance-metadata-options

其他 IMDS 文档

以下 IMDS 文档在《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》和《Amazon Elastic Compute Cloud 用户指南(适用于 Windows 实例)》中提供:

注意

在 Amazon EC2 中,实例蓝图称为亚马逊机器映像(AMI)。