为新实例配置实例元数据选项 - Amazon Elastic Compute Cloud

为新实例配置实例元数据选项

可为新实例配置以下实例元数据选项。

要求使用 IMDSv2

可以使用以下方法要求在新实例上使用 IMDSv2。

将 IMDSv2 设置为账户默认设置

可以在账户级别为每个 AWS 区域 设置实例元数据服务(IMDS)的默认版本。这意味着在启动实例后,实例元数据版本会自动设置为该账户级别的默认值。但是,您可以在启动实例时或启动实例后手动覆盖该值。有关账户级别设置和手动覆盖会如何影响实例的更多信息,请参阅 实例元数据选项的优先顺序

注意

设置账户级别的默认值不会重置现有的实例。例如,假设您将账户级别的默认值设置为 IMDSv2,则任何设置为 IMDSv1 的现有实例都不会受到影响。如果要更改现有实例的值,则必须手动更改相关实例本身的值。

您可以将实例元数据版本的账户默认值设置为 IMDSv2,这样账户中的所有实例启动时都会需要 IMDSv2,而 IMDSv1 将被禁用。如果应用此账户默认设置,以下是该实例启动时的默认值:

  • 控制台:元数据版本设置为仅 V2(需要令牌),并且元数据响应跃点限制设置为 2

  • AWS CLI:HttpTokens 设置为 required,并且 HttpPutResponseHopLimit 设置为 2

注意

在将账户默认值设置为 IMDSv2 之前,请确保您的实例不依赖 IMDSv1。有关更多信息,请参阅 要求 IMDSv2 的建议途径

Console
将 IMDSv2 设置为指定区域内的账户默认设置
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择 EC2 控制面板

  4. 账户属性下,选择数据保护和安全

  5. 选择 IMDS 默认设置旁边的管理

  6. 管理 IMDS 默认设置页面上,执行以下操作:

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

    2. 对于 Metadata version(元数据版本),选择 V2 only (token required)(仅限 V2(需要令牌))。

    3. 对于元数据响应跃点限制,如果实例将托管容器,请指定 2。否则,请选择无首选项。如果未指定首选项,则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1

    4. 选择更新

AWS CLI
将 IMDSv2 设置为指定区域内的账户默认设置

使用 modify-instance-metadata-defaults 命令,并指定要在其中修改 IMDS 账户级别设置的区域。如果实例将托管容器,则将 --http-tokens 设置为 required,并将 --http-put-response-hop-limit 设置为 2。否则,请指定 -1,表示无首选项。如果指定 -1(无首选项),则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1

aws ec2 modify-instance-metadata-defaults \ --region us-east-1 \ --http-tokens required \ --http-put-response-hop-limit 2

预期输出

{ "Return": true }
查看指定区域的实例元数据选项的默认账户设置

使用 get-instance-metadata-defaults 命令并指定区域。

aws ec2 get-instance-metadata-defaults --region us-east-1

示例输出

{ "AccountLevel": { "HttpTokens": "required", "HttpPutResponseHopLimit": 2 } }
将 IMDSv2 设置为所有区域的账户默认设置

使用 modify-instance-metadata-defaults 命令修改所有区域的 IMDS 账户级别设置。如果实例将托管容器,则将 --http-tokens 设置为 required,并将 --http-put-response-hop-limit 设置为 2。否则,请指定 -1,表示无首选项。如果指定 -1(无首选项),则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1

echo -e "Region \t Modified" ; \ echo -e "-------------- \t ---------" ; \ for region in $( aws ec2 describe-regions \ --region us-east-1 \ --query "Regions[*].[RegionName]" \ --output text ); do (output=$( aws ec2 modify-instance-metadata-defaults \ --region $region \ --http-tokens required \ --http-put-response-hop-limit 2 \ --output text) echo -e "$region \t $output" ); done

预期输出

Region Modified -------------- --------- ap-south-1 True eu-north-1 True eu-west-3 True ...
查看所有区域实例元数据选项的默认账户设置

使用 get-instance-metadata-defaults 命令。

echo -e "Region \t Level Hops HttpTokens" ; \ echo -e "-------------- \t ------------ ---- ----------" ; \ for region in $( aws ec2 describe-regions \ --region us-east-1 \ --query "Regions[*].[RegionName]" \ --output text ); do (output=$( aws ec2 get-instance-metadata-defaults \ --region $region \ --output text) echo -e "$region \t $output" ); done

预期输出

Region Level Hops HttpTokens -------------- ------------ ---- ---------- ap-south-1 ACCOUNTLEVEL 2 required eu-north-1 ACCOUNTLEVEL 2 required eu-west-3 ACCOUNTLEVEL 2 required ...
PowerShell
将 IMDSv2 设置为指定区域内的账户默认设置

使用 Edit-EC2InstanceMetadataDefault 命令,并指定要在其中修改 IMDS 账户级别设置的区域。如果实例将托管容器,则将 -HttpToken 设置为 required,并将 -HttpPutResponseHopLimit 设置为 2。否则,请指定 -1,表示无首选项。如果指定 -1(无首选项),则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1

Edit-EC2InstanceMetadataDefault ` -Region us-east-1 ` -HttpToken required ` -HttpPutResponseHopLimit 2

预期输出

True
查看指定区域的实例元数据选项的默认账户设置

使用 Get-EC2InstanceMetadataDefault 命令并指定区域。

Get-EC2InstanceMetadataDefault -Region us-east-1 | Format-List

示例输出

HttpEndpoint : HttpPutResponseHopLimit : 2 HttpTokens : required InstanceMetadataTags :
将 IMDSv2 设置为所有区域的账户默认设置

使用 Edit-EC2InstanceMetadataDefault Cmdlet 修改所有区域的 IMDS 账户级别设置。如果实例将托管容器,则将 -HttpToken 设置为 required,并将 -HttpPutResponseHopLimit 设置为 2。否则,请指定 -1,表示无首选项。如果指定 -1(无首选项),则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1

(Get-EC2Region).RegionName | ` ForEach-Object { [PSCustomObject]@{ Region = $_ Modified = (Edit-EC2InstanceMetadataDefault ` -Region $_ ` -HttpToken required ` -HttpPutResponseHopLimit 2) } } | ` Format-Table Region, Modified -AutoSize

预期输出

Region Modified ------ -------- ap-south-1 True eu-north-1 True eu-west-3 True ...
查看所有区域实例元数据选项的默认账户设置

使用 Get-EC2InstanceMetadataDefault Cmdlet。

(Get-EC2Region).RegionName | ` ForEach-Object { [PSCustomObject]@{ Region = $_ HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit HttpTokens = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens } } | ` Format-Table -AutoSize

示例输出

Region HttpPutResponseHopLimit HttpTokens ------ ----------------------- ---------- ap-south-1 2 required eu-north-1 2 required eu-west-3 2 required ...

在启动时配置实例

当您 启动实例 时,您可以通过配置以下字段,从而将实例配置为要求使用 IMDSv2:

  • Amazon EC2 控制台:将 Metadata version(元数据版本)设置为 V2 only (token required) [仅 V2(必须使用令牌)]。

  • AWS CLI:将 HttpTokens 设置为 required

当您指定必须使用 IMDSv2 时,还必须将可访问元数据设置为已启用(控制台),或将 HttpEndpoint 设置为 enabled(AWS CLI),以启用实例元数据服务(IMDS)端点。

在容器环境中,需要 IMDSv2 时,我们建议将跃点限制设置为 2。有关更多信息,请参阅 实例元数据访问注意事项

Console
要求在新实例上使用 IMDSv2
  • 在 Amazon EC2 控制台中启动新实例时,展开 Advanced details(高级详细信息),然后执行以下操作:

    • 对于 Metadata accessible(可访问的元数据),选择 Enabled(已启用)。

    • 对于 Metadata version(元数据版本),选择 V2 only (token required)(仅限 V2(需要令牌))。

    • (容器环境)对于元数据响应跃点限制,请选择 2

    有关更多信息,请参阅 高级详细信息

AWS CLI
要求在新实例上使用 IMDSv2

以下 run-instances 示例会启动 c6i.large 设置为 --metadata-optionsHttpTokens=required 实例。在为 HttpTokens 指定值时,还必须将 HttpEndpoint 设置为 enabled。由于元数据检索请求的安全令牌标头设置为 required,这会在请求实例元数据时要求实例使用 IMDSv2。

在容器环境中,需要 IMDSv2 时,我们建议使用 HttpPutResponseHopLimit=2 将跃点限制设置为 2

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --instance-type c6i.large \ ... --metadata-options "HttpEndpoint=enabled,HttpTokens=required,HttpPutResponseHopLimit=2"
PowerShell
要求在新实例上使用 IMDSv2

以下 New-EC2Instance Cmdlet 示例启动了一个 c6i.large 实例,其中 MetadataOptions_HttpEndpoint 设置为 enabledMetadataOptions_HttpTokens 参数设置为 required。在为 HttpTokens 指定值时,还必须将 HttpEndpoint 设置为 enabled。由于元数据检索请求的安全令牌标头设置为 required,这会在请求实例元数据时要求实例使用 IMDSv2。

New-EC2Instance ` -ImageId ami-0abcdef1234567890 ` -InstanceType c6i.large ` -MetadataOptions_HttpEndpoint enabled ` -MetadataOptions_HttpTokens required
AWS CloudFormation

要使用 AWS CloudFormation 指定实例的元数据选项,请参阅 AWS CloudFormation 用户指南中的 亚马逊云科技::EC2::LaunchTemplate MetadataOptions 属性。

配置 AMI

注册新 AMI 或修改现有 AMI 时,可将 imds-support 参数设置为 v2.0。从此 AMI 启动的实例会将 Metadata version(元数据版本)设置为 V2 only (token required) [仅 V2(必须使用令牌)](控制台),或将 HttpTokens 设置为 required(AWS CLI)。借助这些设置,实例将要求在请求实例元数据时使用 IMDSv2。

请注意,如果您将 imds-support 设置为 v2.0,从此 AMI 启动的实例还会将 Metadata response hop limit(元数据响应跃点限制)(控制台)或 http-put-response-hop-limit(AWS CLI)将设置为 2

重要

除非 AMI 软件支持 IMDSv2,否则不要使用该参数。将值设置为 v2.0 后,无法撤消。“重置”AMI 的唯一方法是从底层快照创建新的 AMI。

为 IMDSv2 配置新的 AMI

使用以下方法之一将新 AMI 配置为 IMDSv2。

AWS CLI

下面的 register-image 示例将使用某个 EBS 根卷的指定快照的 AMI 注册为设备 /dev/xvda。为 imds-support 参数指定 v2.0,以便从此 AMI 启动的实例要求在请求实例元数据时使用 IMDSv2。

aws ec2 register-image \ --name my-image \ --root-device-name /dev/xvda \ --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} \ --architecture x86_64 \ --imds-support v2.0
PowerShell

以下 Register-EC2Image Cmdlet 示例使用 EBS 根卷的指定快照作为设备 /dev/xvda 来注册 AMI。为 ImdsSupport 参数指定 v2.0,以便从此 AMI 启动的实例要求在请求实例元数据时使用 IMDSv2。

Register-EC2Image ` -Name 'my-image' ` -RootDeviceName /dev/xvda ` -BlockDeviceMapping ( New-Object ` -TypeName Amazon.EC2.Model.BlockDeviceMapping ` -Property @{ DeviceName = '/dev/xvda'; EBS = (New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice -Property @{ SnapshotId = 'snap-0123456789example' VolumeType = 'gp3' } ) } ) ` -Architecture X86_64 ` -ImdsSupport v2.0
为 IMDSv2 配置现有 AMI

使用以下方法之一配置 IMDSv2 的现有 AMI。

AWS CLI

以下 modify-image-attribute 示例仅为 IMDSv2 修改现有 AMI。为 imds-support 参数指定 v2.0,以便从此 AMI 启动的实例要求在请求实例元数据时使用 IMDSv2。

aws ec2 modify-image-attribute \ --image-id ami-0123456789example \ --imds-support v2.0
PowerShell

以下 Edit-EC2ImageAttribute Cmdlet 示例仅修改 IMDSv2 的现有 AMI。为 imds-support 参数指定 v2.0,以便从此 AMI 启动的实例要求在请求实例元数据时使用 IMDSv2。

Edit-EC2ImageAttribute ` -ImageId ami-0abcdef1234567890 ` -ImdsSupport 'v2.0'

使用 IAM policy

您可以创建 IAM policy 来阻止用户启动新实例,除非他们要求在新实例上使用 IMDSv2。

使用 IAM policy 强制要求在所有新实例上使用 IMDSv2

要确保用户只能启动要求在请求实例元数据时使用 IMDSv2 的实例,您可以指定在启动实例之前要求 IMDSv2 必须满足的条件。有关示例 IAM policy,请参阅 使用实例元数据

启用 IMDS IPv4 和 IPv6 端点

实例上的 IMDS 有两个端点:IPv4 (169.254.169.254) 和 IPv6 ([fd00:ec2::254])。启用 IMDS 时,会自动启用 IPv4 端点。即使将实例启动到仅限 IPv6 的子网中,IPv6 端点仍处于禁用状态。要启用 IPv6 端点,需将其显式启用。启用 IPv6 端点后,IPv4 端点将保持启用状态。

您可以在启动实例时或启动实例之后启用 IPv6 端点。

启用 IPv6 端点的要求

使用以下方法之一启动启用了 IMDS IPv6 端点的实例。

Console
在启动实例时启用 IMDS IPv6 端点
  • 在 Amazon EC2 控制台中 启动实例,并在 Advanced details(高级详细信息)下指定以下参数:

    • 对于元数据 IPv6 端点,选择启用

有关更多信息,请参阅 高级详细信息

AWS CLI
在启动实例时启用 IMDS IPv6 端点

下方 run-instances 示例会启动一个 c6i.large 实例并为 IMDS 启用 IP6 端点。要启用 IPv6 端点,请将 --metadata-options 参数指定为 HttpProtocolIpv6=enabled。在为 HttpProtocolIpv6 指定值时,还必须将 HttpEndpoint 设置为 enabled

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --instance-type c6i.large \ ... --metadata-options "HttpEndpoint=enabled,HttpProtocolIpv6=enabled"
PowerShell
在启动实例时启用 IMDS IPv6 端点

以下 New-EC2Instance Cmdlet 示例启动了一个为 IMDS 启用 IPv6 端点的 c6i.large 实例。要启用 IPv6 端点,请将 MetadataOptions_HttpProtocolIpv6 指定为 enabled。在为 MetadataOptions_HttpProtocolIpv6 指定值时,还必须将 MetadataOptions_HttpEndpoint 设置为 enabled

New-EC2Instance ` -ImageId ami-0abcdef1234567890 ` -InstanceType c6i.large ` -MetadataOptions_HttpEndpoint enabled ` -MetadataOptions_HttpProtocolIpv6 enabled

关闭对实例元数据的访问

您可以通过在启动实例时禁用 IMDS 来关闭对实例元数据的访问。您可以稍后通过重新启用 IMDS 来开启访问权限。有关更多信息,请参阅 开启对实例元数据的访问权限

重要

您可以选择在启动时或启动后禁用 IMDS。如果您在启动时禁用 IMDS,则可能发生以下情况:

  • 您可能不再拥有对实例的 SSH 访问权限。public-keys/0/openssh-key 作为您的实例的 SSH 公钥,将无法访问,因为该密钥通常是从 EC2 实例元数据提供和访问的。

  • EC2 用户数据将不可用,也不会在实例启动时运行。EC2 用户数据托管在 IMDS 上。如果您禁用 IMDS,则实际上关闭了对用户数据的访问。

要访问此功能,您可以在启动后重新启用 IMDS。

Console
要在启动时关闭对实例元数据的访问
  • 在 Amazon EC2 控制台中 启动实例,并在 Advanced details(高级详细信息)下指定以下参数:

    • 对于 Metadata accessible(可访问的元数据),选择 Disabled(已禁用)。

有关更多信息,请参阅 高级详细信息

AWS CLI
要在启动时关闭对实例元数据的访问

启动实例并将 --metadata-options 设置为 HttpEndpoint=disabled

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --instance-type c6i.large \ ... --metadata-options "HttpEndpoint=disabled"
PowerShell
要在启动时关闭对实例元数据的访问

以下 New-EC2Instance Cmdlet 示例启动了将 MetadataOptions_HttpEndpoint 设置为 disabled 的实例。

New-EC2Instance ` -ImageId ami-0abcdef1234567890 ` -InstanceType c6i.large ` -MetadataOptions_HttpEndpoint disabled
AWS CloudFormation

要使用 AWS CloudFormation 指定实例的元数据选项,请参阅 AWS CloudFormation 用户指南中的 亚马逊云科技::EC2::LaunchTemplate MetadataOptions 属性。

允许访问实例元数据中的标签

默认情况下,无法访问实例元数据中的实例标签。对于每个实例,您必须明确允许访问。如果允许访问,则实例标签必须符合特定的字符限制,否则实例启动将失败。有关更多信息,请参阅 允许访问实例元数据中的标签