转换为使用 实例元数据服务版本 2 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

如果要将实例配置为仅接受实例元数据服务版本 2(IMDSv2)调用,我们建议您使用以下工具和转换途径。

转换为 IMDSv2 的工具

以下工具可以帮助您识别、监控和管理软件从 imdsv1 到 imdsv2 的转换。有关如何使用这些工具的说明,请参阅要求 IMDSv2 的建议途径

Amazon 软件

最新版本的 Amazon CLI 和 Amazon SDK 均支持 IMDSv2。要使用 IMDSv2,请更新 EC2 实例以使用最新版本。有关支持 IMDSv2 的最低 Amazon 开发工具包版本,请参阅 使用支持的 Amazon 开发工具包

所有的 Amazon Linux 2 和 Amazon Linux 2023 软件包都支持 IMDSv2。Amazon Linux 2023 默认禁用 IMDSv1。

IMDS Packet Analyzer

IMDS Packet Analyzer 是一个开源工具,用于识别和记录您的实例启动阶段和运行时阶段的 IMDSv1 调用。通过分析这些日志,您可以精确地识别对您的实例进行 imdsv1 调用的软件,并确定需要更新哪些内容以仅在您的实例上支持 IMDSv2。您可以从命令行运行 IMDS Packet Analyzer,也可以将其作为服务安装。有关更多信息,请参阅 GitHub 上的 Amazon ImdsPacketAnalyzer

CloudWatch

CloudWatch 提供以下两个指标来监控实例:

MetadataNoToken:IMDSv2 使用由令牌支持的会话,而 IMDSv1 不使用。MetadataNoToken 指标跟踪对使用 IMDSv1 的实例元数据服务(IMDS)的调用次数。通过查看该指标是否为零,您可以确定是否以及何时将所有软件升级为使用 IMDSv2。

MetadataNoTokenRejected:禁用 IMDSv1 后,您可以使用 MetadataNoTokenRejected 指标来跟踪 IMDSv1 调用被尝试和拒绝的次数。通过跟踪该指标,您可以确定您的软件是否需要更新以使用 IMDSv2。

有关更多信息,请参阅 实例指标

启动 API

新实例:使用 RunInstances API 启动要求使用 IMDSv2 的新实例。有关更多信息,请参阅 为新实例配置实例元数据选项

现有实例:使用 ModifyInstanceMetadataOptions API 要求在现有实例上使用 IMDSv2。有关更多信息,请参阅 为现有实例修改实例元数据选项

Amazon EC2 Auto Scaling 组启动的新实例:为了要求在 Amazon EC2 Auto Scaling 组启动的所有新实例上使用 IMDSv2,您的 Amazon EC2 Auto Scaling 组可以使用启动模板或启动配置。当您创建启动模板创建启动配置时,必须配置 MetadataOptions 参数以要求使用 IMDSv2。Amazon EC2 Auto Scaling 组将使用新的启动模板或启动配置来启动新实例,但现有实例不受影响。

Amazon EC2 Auto Scaling 组中的现有实例:使用 ModifyInstanceMetadataOptions API 以要求在现有实例上使用 IMDSv2,或者终止实例,Amazon EC2 Auto Scaling 组将使用在新的启动模板或启动配置中定义的实例元数据选项设置启动新的替换实例。

AMI

ImdsSupport 参数设置为 v2.0 的 AMI 将启动默认需要 imdsv2 的实例。Amazon Linux 2023 配置了 ImdsSupport = v2.0

新 AMI:创建新 AMI 时,使用 register-image CLI 命令将 v2.0 参数设置为 ImdsSupport

现有 AMI:修改现有 AMI 时,使用 modify-image-attribute CLI 命令将 ImdsSupport 参数设置为 v2.0

有关更多信息,请参阅 配置 AMI

IAM policy 和 SCP

您可以使用 IAM policy 或 Amazon Organizations 服务控制策略(SCP)来控制用户,具体如下所示:

IAM policy 或 SCP 必须包含以下 IAM 条件键:

  • ec2:MetadataHttpEndpoint

  • ec2:MetadataHttpPutResponseHopLimit

  • ec2:MetadataHttpTokens

如果 API 或 CLI 调用中的参数与包含该条件键的策略中指定的状态不一致,则 API 或 CLI 调用将失败并显示 UnauthorizedOperation 响应。

此外,您还可以选择额外的保护层以强制从 IMDSv1 更改为 IMDSv2。在与通过 EC2 角色凭证调用的 API 相关的访问管理层上,您可以在 IAM 策略或 Amazon Organizations 服务控制策略(SCP)中使用条件键。具体来说,通过在 IAM policy 中使用值为 ec2:RoleDelivery 的条件键 2.0,使用从 IMDSv1 获取的 EC2 角色凭证进行的 API 调用将会收到 UnauthorizedOperation 响应。通过使用 SCP 所需的该条件,可以更广泛地实现相同的效果。这会确保通过 IMDSv1 提供的凭证不能实际用于调用 API,因为任何不符合指定条件的 API 调用将会收到 UnauthorizedOperation 错误。

有关示例 IAM policies,请参阅 使用实例元数据。有关 SCP 的更多信息,请参阅《Amazon Organizations User Guide》中的 Service control policies

声明性策略

使用声明性策略(Amazon Organizations 的一项功能)可以集中设置并强制执行 IMDSv2,使其成为整个组织的默认 IMDS 版本。有关策略示例,请参阅《Amazon Organizations 用户指南》中的支持的声明性策略部分中的实例元数据默认值选项卡。

步骤1:识别 IMDSv2=optional 的实例,并审核 imdsV1 使用情况

要评测 IMDSv2 迁移范围,请识别配置为允许 IMDSv1 或 IMDSv2 的实例,并审核 imdsv1 调用。

  1. 识别配置为允许 IMDSv1 或 IMDSv2 的实例:

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

    2. 在导航窗格中,选择 Instances (实例)

    3. 要仅查看配置为允许 IMDSv1 或 IMDSv2 的实例,请添加筛选条件 IMDSv2 = optional

    4. 或者,要查看 IMDSv2 对于所有实例是 optional 还是 required,请打开首选项窗口(齿轮图标),打开 IMDSv2,然后选择确认。这会将 IMDSv2 列添加到实例表中。

    Amazon CLI

    使用 describe-instances 命令并按 metadata-options.http-tokens = optional 进行筛选,如下所示:

    aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
  2. 审核每个实例上的 IMDSv1 调用:

    使用 CloudWatch 指标 MetadataNoToken。此指标显示对实例上 IMDS 的 IMDSv1 调用次数。有关更多信息,请参阅实例指标

  3. 识别您的实例上进行 IMDSv1 调用的软件:

    使用开源 IMDS Packet Analyzer 在实例启动阶段和运行时操作期间识别和记录 IMDSv1调用。使用此信息确定要更新的软件,以使您的实例准备好仅使用 IMDSv2。您可以从命令行运行 IMDS Packet Analyzer,也可以将其作为服务安装。

步骤 2:将软件更新为 IMDSv2

将在您的实例上使用角色凭证的所有 SDK、CLI 和软件更新为与 IMDSv2 兼容的版本。有关更新 CLI 的更多信息,请参阅《Amazon Command Line Interface 用户指南》中的安装或更新最新版本的 Amazon CLI

步骤 3:在实例上要求 IMDSv2

在通过 MetadataNoToken 指标确认零个 IMDSv1 调用后,请将现有实例配置为需要 IMDSv2。此外,将所有新实例配置为需要 IMDSv2。换句话说,在所有现有实例和新实例上禁用 IMDSv1。

  1. 将现有实例配置为需要 IMDSv2:

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

    2. 在导航窗格中,选择 Instances (实例)

    3. 选择实例。

    4. 依次选择操作实例设置修改实例元数据选项

    5. 对于IMDSv2,选择必需

    6. 选择保存

    Amazon CLI

    使用 modify-instance-metadata-options CLI 命令指定仅使用 IMDSv2。

    注意

    您可以在正在运行的实例上修改此设置。此更改立即生效,无需重启实例。

    有关更多信息,请参阅 要求使用 IMDSv2

  2. 禁用 IMDSv1 后监控是否存在问题:

    1. 使用 CloudWatch 指标 MetadataNoTokenRejected 跟踪 IMDSv1 调用尝试次数以及被拒绝的次数。

    2. 如果 MetadataNoTokenRejected 指标记录了遇到软件问题的实例上的 IMDSv1 调用,则表明该软件需要更新才能使用 IMDSv2。

  3. 将新实例配置为需要 IMDSv2:

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

    2. 按照以下步骤启动实例

    3. 展开高级详细信息,对于元数据版本,选择仅 V2(需要令牌)

    4. Summary(摘要)面板中查看实例配置,然后选择 Launch instance(启动实例)。

      有关更多信息,请参阅 在启动时配置实例

    Amazon CLI

    Amazon CLI:使用 run-instances 命令并指定需要使用 IMDSv2。

步骤 4:将 IMDSv2=required 设置为默认值

您可以将 IMDSv2=required 设置为账户或组织级别的默认配置。这确保所有新启动的实例都自动配置为需要 IMDSv2。

  1. 设置账户级别默认值:

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

    2. 在 EC2 控制面板上,在账户属性下,选择数据保护和安全

    3. IMDS 默认值下,选择“管理”。

    4. 对于实例元数据服务,选择启用

    5. 对于元数据版本,选择仅 V2(需要令牌)

    6. 选择更新

    Amazon CLI

    使用 modify-instance-metadata-defaults CLI 命令并指定 --http-tokens required--http-put-response-hop-limit 2

    有关更多信息,请参阅 将 IMDSv2 设置为账户默认设置

  2. 或者,使用声明性策略设置组织级别默认值:

    使用声明性策略将 IMDSv2 的组织默认值为 required。有关策略示例,请参阅《Amazon Organizations 用户指南》中的支持的声明性策略部分中的实例元数据默认值选项卡。

步骤 5:强制实例要求 IMDSv2

使用以下 IAM 或 SCP 条件键强制使用 IMDSv2:

  • ec2:MetadataHttpTokens

  • ec2:MetadataHttpPutResponseHopLimit

  • ec2:MetadataHttpEndpoint

这些条件键控制 RunInstancesModifyInstanceMetadataOptions API 及相应 CLI 的使用。如果创建了策略,并且 API 调用中的参数与使用条件键的策略中指定的状态不匹配,API 或 CLI 调用将失败并显示 UnauthorizedOperation 响应。

有关示例 IAM policies,请参阅 使用实例元数据