转换为使用 实例元数据服务版本 2
如果迁移到 IMDSv2,我们建议您使用以下工具和转换途径。
帮助转换为 IMDSv2 的工具
如果您的软件使用 IMDSv1,请使用以下工具帮助重新配置软件,以使用 IMDSv2。
- AWS 软件
-
最新版本的 AWS CLI 和 AWS SDK 均支持 IMDSv2。要使用 IMDSv2,请确保您的 EC2 实例具有最新版本的 CLI 和 SDK。有关更新 CLI 的信息,请参阅 AWS Command Line Interface 用户指南中的安装、更新和卸载 AWS CLI。
所有的 Amazon Linux 2 软件包都支持 IMDSv2。
有关支持 IMDSv2 的最低 AWS 开发工具包版本,请参阅 使用支持的 AWS 开发工具包。
- 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。有关更多信息,请参阅实例指标。 - 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 或 AWS Organizations 服务控制策略(SCP)来控制用户,具体如下所示:
-
除非将实例配置为使用 IMDSv2,否则无法使用 RunInstances API 启动实例。
-
无法使用 ModifyInstanceMetadataOptions API 修改正在运行的实例以重新启用 IMDSv1。
IAM policy 或 SCP 必须包含以下 IAM 条件键:
-
ec2:MetadataHttpEndpoint
-
ec2:MetadataHttpPutResponseHopLimit
-
ec2:MetadataHttpTokens
如果 API 或 CLI 调用中的参数与包含该条件键的策略中指定的状态不一致,则 API 或 CLI 调用将失败并显示
UnauthorizedOperation
响应。此外,您还可以选择额外的保护层以强制从 IMDSv1 更改为 IMDSv2。在与通过 EC2 角色凭证调用的 API 相关的访问管理层上,您可以在 IAM policy 或 AWS Organizations 服务控制策略 (SCP) 中使用新的条件键。具体来说,通过在 IAM policy 中使用值为
ec2:RoleDelivery
的条件键2.0
,使用从 IMDSv1 获取的 EC2 角色凭证进行的 API 调用将会收到UnauthorizedOperation
响应。通过使用 SCP 所需的该条件,可以更广泛地实现相同的效果。这会确保通过 IMDSv1 提供的凭证不能实际用于调用 API,因为任何不符合指定条件的 API 调用将会收到UnauthorizedOperation
错误。有关示例 IAM policies,请参阅 使用实例元数据。有关 SCP 的更多信息,请参阅《AWS Organizations 用户指南》中的 服务控制策略。
-
要求 IMDSv2 的建议途径
在使用上述工具时,我们建议您按照以下途径转换为 IMDSv2。
步骤 1:在开始时
将在 EC2 实例上使用角色凭证的 SDK、CLI 和软件更新为与 IMDSv2 兼容的版本。有关更新 CLI 的信息,请参阅 AWS Command Line Interface 用户指南中的升级到最新版本的 AWS CLI。
然后,使用 IMDSv2 请求更改直接访问实例元数据的软件(换句话说,不使用开发工具包)。您可以使用 IMDS Packet Analyzer
第 2 步:跟踪转换进度
使用 CloudWatch 指标 MetadataNoToken
跟踪您的转换进度。此指标显示对实例上 IMDS 的 IMDSv1 调用次数。有关更多信息,请参阅实例指标。
第 3 步:当 IMDSv1 的使用量为零时
当 CloudWatch 指标 MetadataNoToken
记录的 IMDSv1 使用量为零时,表明您的实例已准备好完全转换到使用 IMDSv2。在此阶段,您可以执行以下操作:
-
新实例
启动新实例时,您可以执行以下操作:
-
Amazon EC2 控制台:在启动实例向导中,将 Metadata accessible(可访问元数据)设置为 Enabled(已启用),将 Metadata version(元数据版本)设置为 V2 only (token required) [仅 V2(必须使用令牌)]。有关更多信息,请参阅在启动时配置实例。
-
AWS CLI:使用 run-instances CLI 命令指定仅使用 IMDSv2。
-
-
现有实例
对于现有实例,您可以执行以下操作:
-
Amazon EC2 控制台:在实例页面上选择实例,然后依次选择操作、实例设置、修改实例元数据选项,对于 IMDSv2,选择必需。有关更多信息,请参阅要求使用 IMDSv2。
-
AWS CLI:使用 modify-instance-metadata-options CLI 命令指定仅使用 IMDSv2。
您可以在正在运行的实例上修改实例元数据选项,并且修改后无需重新启动实例。
-
步骤 4:检查实例是否切换为 IMDSv2
您可以检查是否有任何实例尚未配置为要求使用 IMDSv2,换言之,IMDSv2 仍配置为 optional
。如果仍有实例配置为 optional
,则可通过重复上述步骤 3 来修改实例元数据选项,以将 IMDSv2 配置为 required
。
筛选实例:
-
Amazon EC2 控制台:在实例页面,使用 IMDSv2 = 可选筛选条件来筛选实例。有关筛选的更多信息,请参阅 使用控制台筛选资源。您还可以查看 IMDSv2 对每个实例是必需的还是可选的:在首选项窗口中,打开 IMDSv2,以将 IMDSv2 列添加到实例表中。
-
AWS 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:MetadataHttpTokens
、ec2:MetadataHttpPutResponseHopLimit
和 ec2:MetadataHttpEndpoint
IAM 条件键可用于控制 RunInstances 和 ModifyInstanceMetadataOptions API 及相应 CLI 的使用。如果创建了策略,并且 API 调用中的参数与使用条件键的策略中指定的状态不匹配,API 或 CLI 调用将失败并显示 UnauthorizedOperation
响应。有关示例 IAM policies,请参阅 使用实例元数据。