为新实例配置实例元数据选项
您可以配置以下实例元数据选项。
可以使用以下方法要求在实例上使用 IMDSv2。
将 IMDSv2 设置为账户默认设置
可以在账户级别为每个 AWS 区域 设置默认实例元数据版本。启动实例后,实例元数据版本会自动设置为账户级别的值。
若您从未更改过账户级别的默认设置,则不会指示任何首选项。
您可以将实例元数据版本的账户默认设置设置为 IMDSv2,这样账户中的所有新实例启动时,都会需要 IMDSv2(换言之,IMDSv1 已禁用)。如果应用此账户默认设置,以下是该实例启动时的默认值:
在将元数据版本的账户默认设置设置为仅 V2(需要令牌)之前,请确保所有实例都没有进行 IMDSv1 调用。MetadataNoToken
CloudWatch 指标会跟踪 IMDSv1 调用。当 MetadataNoToken
记录的 IMDSv1 使用量为零时,表明实例已准备好完全转换到使用 IMDSv2。
可以在启动时更改实例配置中的值。有关更多信息,请参阅 设置实例元数据版本。
- Console
-
将 IMDSv2 设置为指定区域内的账户默认设置
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
要更改 AWS 区域,请使用页面右上角的区域选择器。
-
在导航窗格中,选择 EC2 控制面板。
-
在账户属性下,选择数据保护和安全。
-
选择 IMDS 默认设置旁边的管理。
-
在管理 IMDS 默认设置页面上,执行以下操作:
-
对于实例元数据服务,选择启用。
-
对于 Metadata version(元数据版本),选择 V2 only (token required)(仅限 V2(需要令牌))。
-
对于元数据响应跃点限制,如果实例将托管容器,请指定 2。否则,请选择无首选项。如果未指定首选项,则启动时,如果 AMI 需要 IMDSv2,则该值默认为 2;否则默认为 1。
-
选择更新。
- 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:
当您指定必须使用 IMDSv2 时,还必须将可访问元数据设置为已启用(控制台),或将 HttpEndpoint
设置为 enabled
(AWS CLI),以启用实例元数据服务(IMDS)端点。
- New console
-
- Old console
-
有关更多信息,请参阅步骤 3:配置实例详细信息。
- AWS CLI
-
要求在新实例上使用 IMDSv2
以下 run-instances 示例会启动 c6i.large
设置为 --metadata-options
的 HttpTokens=required
实例。在为 HttpTokens
指定值时,还必须将 HttpEndpoint
设置为 enabled
。由于元数据检索请求的安全令牌标头设置为 required
,这会在请求实例元数据时要求实例使用 IMDSv2。
aws ec2 run-instances \
--image-id ami-0abcdef1234567890
\
--instance-type c6i.large
\
...
--metadata-options "HttpEndpoint=enabled,HttpTokens=required"
- PowerShell
-
要求在新实例上使用 IMDSv2
以下 New-EC2Instance Cmdlet 示例启动了一个 c6i.large
实例,其中 MetadataOptions_HttpEndpoint
设置为 enabled
、MetadataOptions_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 时,可将 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。
Import-Module AWS.Tools.EC2 # Required for Amazon.EC2.Model object creation.
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 来阻止用户启动新实例,除非他们要求在新实例上使用 IMDSv2。
使用 IAM policy 强制要求在所有新实例上使用 IMDSv2
要确保用户只能启动要求在请求实例元数据时使用 IMDSv2 的实例,您可以指定在启动实例之前要求 IMDSv2 必须满足的条件。有关示例 IAM policy,请参阅 使用实例元数据。
默认禁用 IPv6 端点。即使在仅 IPv6 子网中启动实例,也是如此。可以选择在启动实例时启用 IPv6 端点。
IMDS 的 IPv6 端点只能在基于 AWS Nitro System 构建的实例上访问。
使用以下方法之一启动为 IMDS 启用 IPv6 端点的实例。
- New console
-
有关更多信息,请参阅 高级详细信息。
- AWS CLI
-
下方 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
-
以下 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,则可能发生以下情况:
要访问此功能,您可以在启动后重新启用 IMDS。
- New console
-
有关更多信息,请参阅 高级详细信息。
- Old console
-
有关更多信息,请参阅 步骤 3:配置实例详细信息。
- 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 用户指南中的 AWS::EC2::LaunchTemplate MetadataOptions 属性。