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

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

如果迁移到 IMDSv2,我们建议您使用以下工具和转换途径。

帮助转换为 IMDSv2 的工具

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

Amazon 软件

最新版本的 Amazon CLI 和 Amazon SDK 均支持 IMDSv2。要使用 IMDSv2,请确保您的 EC2 实例具有最新版本的 CLI 和 SDK。有关更新 CLI 的信息,请参阅 Amazon Command Line Interface 用户指南中的安装、更新和卸载 Amazon CLI

所有的 Amazon Linux 2 和 Amazon Linux 2023 软件包都支持 IMDSv2。在 Amazon Linux 2023 中,默认情况下禁用 IMDSv1。

有关支持 IMDSv2 的最低 Amazon 开发工具包版本,请参阅 使用支持的 Amazon 开发工具包

IMDS Packet Analyzer

IMDS Packet Analyzer 是一个开源工具,用于识别和记录您的实例启动阶段的 IMDSv1 调用。这可以帮助识别在 EC2 实例上调用 IMDSv1 的软件,让您能够准确地确定需要更新的内容,以使您的实例准备好仅使用 IMDSv2。您可以从命令行运行 IMDS Packet Analyzer,也可以将其作为服务安装。有关更多信息,请参阅 GitHub 上的 IMDS Packet Analyzer

CloudWatch

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

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

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

EC2 API 和 CLI 更新

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

对于现有实例,您可以使用 ModifyInstanceMetadataOptions API 以要求使用 IMDSv2。有关更多信息,请参阅为现有实例修改实例元数据选项

为了要求在 Auto Scaling 组启动的所有新实例上使用 IMDSv2,您的 Auto Scaling 组可以使用启动模板或启动配置。当您创建启动模板创建启动配置时,必须配置 MetadataOptions 参数以要求使用 IMDSv2。自动扩缩组将使用新的启动模板或启动配置来启动新实例,但现有实例不受影响。对于自动扩缩组中的现有实例,您可以使用 ModifyInstanceMetadataOptions API 以要求在现有实例上使用 IMDSv2,或者终止实例,自动扩缩组将使用在新的启动模板或启动配置中定义的实例元数据选项设置启动新的替换实例。

使用默认配置 IMDSv2 的 AMI

启动实例时,您可以使用将 ImdsSupport 参数设置为 v2.0 的 AMI 启动该实例,从而自动将其配置为默认使用 IMDSv2(将 HttpTokens 参数设置为 required)。您可以在使用 register-image CLI 命令注册 AMI 时将 ImdsSupport 参数设置为 v2.0,也可以使用 modify-image-attribute CLI 命令修改现有的 AMI。有关更多信息,请参阅配置 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 policy 或 Amazon Organizations 服务控制策略 (SCP) 中使用新的条件键。具体来说,通过在 IAM policy 中使用值为 ec2:RoleDelivery 的条件键 2.0,使用从 IMDSv1 获取的 EC2 角色凭证进行的 API 调用将会收到 UnauthorizedOperation 响应。通过使用 SCP 所需的该条件,可以更广泛地实现相同的效果。这会确保通过 IMDSv1 提供的凭证不能实际用于调用 API,因为任何不符合指定条件的 API 调用将会收到 UnauthorizedOperation 错误。

有关示例 IAM policies,请参阅 使用实例元数据。有关 SCP 的更多信息,请参阅《Amazon Organizations 用户指南》中的 服务控制策略

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

步骤 1:在开始时

将在 EC2 实例上使用角色凭证的 SDK、CLI 和软件更新为与 IMDSv2 兼容的版本。有关更新 CLI 的信息,请参阅 Amazon Command Line Interface 用户指南中的升级到最新版本的 Amazon CLI

然后,使用 IMDSv2 请求更改直接访问实例元数据的软件(换句话说,不使用开发工具包)。您可以使用 IMDS Packet Analyzer 来识别需要更改以使用 IMDSv2 请求的软件。

第 2 步:跟踪转换进度

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

第 3 步:当 IMDSv1 的使用量为零时

当 CloudWatch 指标 MetadataNoToken 记录的 IMDSv1 使用量为零时,表明您的实例已准备好完全转换到使用 IMDSv2。在此阶段,您可以执行以下操作:

  • 账户默认值

    可将 IMDSv2 设置为必需的账户默认值。启动实例时,实例配置会自动设置为账户默认值。

    要设置账户默认值,请执行以下操作:

    • Amazon EC2 控制台:对于 IMDS 默认设置,在 EC2 控制面板上的账户属性数据保护和安全下,将实例元数据服务设置为已启用,并将元数据版本设置为仅 V2(需要令牌)。有关更多信息,请参阅将 IMDSv2 设置为账户默认设置

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

  • 新实例

    启动新实例时,您可以执行以下操作:

    • Amazon EC2 控制台:在启动实例向导中,将 Metadata accessible(可访问元数据)设置为 Enabled(已启用),将 Metadata version(元数据版本)设置为 V2 only (token required) [仅 V2(必须使用令牌)]。有关更多信息,请参阅在启动时配置实例

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

  • 现有实例

    对于现有实例,您可以执行以下操作:

    • Amazon EC2 控制台:在实例页面上选择实例,然后依次选择操作实例设置修改实例元数据选项,对于 IMDSv2,选择必需。有关更多信息,请参阅要求使用 IMDSv2

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

    您可以在正在运行的实例上修改实例元数据选项,并且修改后无需重新启动实例。

步骤 4:检查实例是否切换为 IMDSv2

您可以检查是否有任何实例尚未配置为要求使用 IMDSv2,换言之,IMDSv2 仍配置为 optional。如果仍有实例配置为 optional,则可通过重复上述步骤 3 来修改实例元数据选项,以将 IMDSv2 配置为 required

筛选实例:

  • Amazon EC2 控制台:在实例页面,使用 IMDSv2 = 可选筛选条件来筛选实例。有关筛选的更多信息,请参阅 使用控制台筛选资源。您还可以查看 IMDSv2 对每个实例是必需的还是可选的:在首选项窗口中,打开 IMDSv2,以将 IMDSv2 列添加到实例表中。

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

    aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text

步骤 5:当所有实例已切换为 IMDSv2

ec2:MetadataHttpTokensec2:MetadataHttpPutResponseHopLimitec2:MetadataHttpEndpoint IAM 条件键可用于控制 RunInstancesModifyInstanceMetadataOptions API 及相应 CLI 的使用。如果创建了策略,并且 API 调用中的参数与使用条件键的策略中指定的状态不匹配,API 或 CLI 调用将失败并显示 UnauthorizedOperation 响应。有关示例 IAM policies,请参阅 使用实例元数据

此外,禁用 IMDSv1 后,您可以使用 MetadataNoTokenRejected CloudWatch 指标来跟踪 IMDSv1 调用被尝试和拒绝的次数。如果在禁用 IMDSv1 后,您的软件无法正常运行,并且 MetadataNoTokenRejected 指标记录了 IMDSv1 调用,则可能需要更新此软件才能使用 IMDSv2。