IMDS凭证提供商 - AWS SDKs和工具

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

IMDS凭证提供商

实例元数据服务 (IMDS) 提供有关您的实例的数据,您可以使用这些数据来配置或管理正在运行的实例。有关可用数据的更多信息,请参阅 Amazon EC2 用户指南中的使用实例元数据。Amazon EC2 提供了可供实例使用的本地终端节点,该终端节点可以为实例提供各种信息。如果实例附加了角色,则它可以提供一组对该角色有效的凭证。SDKs可以使用该端点来解析作为其默认凭证提供程序链一部分的证书。默认使用实例元数据服务版本 2 (IMDSv2),IMDS这是使用会话令牌的更安全的版本。如果由于不可重试的情况(HTTP错误代码 403、404、405)而失败,则用作后备。IMDSv1

使用以下方法配置此功能:

AWS_EC2_METADATA_DISABLED - 环境变量

是否尝试使用 Amazon EC2 实例元数据服务 (IMDS) 来获取证书。

默认值:false

有效值:

  • true— 请勿使用IMDS来获取证书。

  • false— IMDS 用于获取证书。

ec2_metadata_v1_disabled-共享 AWS config文件设置
AWS_EC2_METADATA_V1_DISABLED - 环境变量
aws.disableEc2MetadataV1-JVM 系统属性:仅限 Java/Kotlin

如果IMDSv2失败,是否使用实例元数据服务版本 1 (IMDSv1) 作为后备方案。

注意

New SDKs 不支持IMDSv1,因此不支持此设置。有关详细信息,请见表 兼容 AWS SDKs

默认值:false

有效值:

  • true— 请勿IMDSv1用作备用。

  • false— IMDSv1 用作备用。

ec2_metadata_service_endpoint-共享 AWS config文件设置
AWS_EC2_METADATA_SERVICE_ENDPOINT - 环境变量
aws.ec2MetadataServiceEndpoint-JVM 系统属性:仅限 Java/Kotlin

的终端节点IMDS。

默认值:如果 ec2_metadata_service_endpoint_mode 等于 IPv4,则默认端点为 http://169.254.169.254。如果 ec2_metadata_service_endpoint_mode 等于 IPv6,则默认端点为 http://[fd00:ec2::254]

有效值:有效URI。

ec2_metadata_service_endpoint_mode-共享 AWS config文件设置
AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE - 环境变量
aws.ec2MetadataServiceEndpointMode-JVM 系统属性:仅限 Java/Kotlin

的终端节点模式IMDS。

默认值:IPv4

有效值:IPv4IPv6

注意

IMDS证书提供者是其中的一部分。凭证提供者链但是,只有在本系列中的其他几个提供商之后,才会对IMDS证书提供者进行检查。因此,如果您希望您的程序使用此提供者的凭证,则必须从配置中删除其他有效的凭证提供者或使用其他配置文件。或者,与其依赖凭证提供者链来自动发现哪个提供者返回了有效凭证,不如在代码中指定证书提供者的用法。IMDS创建服务客户端时,可直接指定凭证来源。

IMDS证书的安全性

默认情况下,如果未配置有效的证书, AWS SDK则SDK会尝试使用亚马逊EC2实例元数据服务 (IMDS) 来检索 AWS 角色的证书。通过将 AWS_EC2_METADATA_DISABLED 环境变量设置为 true,可以禁用此行为。这样可以防止不必要的网络活动,并增强可能被模仿 Amazon EC2 实例元数据服务的不可信网络的安全性。

注意

AWS SDK无论这些设置如何,配置了有效凭据的客户端都不会使用IMDS来检索凭据。

禁用亚马逊EC2IMDS凭证的使用

如何设置此环境变量取决于所使用的操作系统以及您是否希望更改保持不变。

Linux 和 macOS

使用 Linux 或 macOS 的客户可以使用以下命令设置此环境变量:

$ export AWS_EC2_METADATA_DISABLED=true

如果您希望此设置在多个 shell 会话和系统重启中保持不变,则可以将上述命令添加到您的 shell 配置文件中,例如 .bash_profile.zsh_profile.profile

Windows

使用 Windows 的客户可以使用以下命令设置此环境变量:

$ set AWS_EC2_METADATA_DISABLED=true

如果您希望此设置在多个 shell 会话和系统重启中保持不变,则可以改用以下命令:

$ setx AWS_EC2_METADATA_DISABLED=true
注意

setx 命令不会将该值应用于当前的 shell 会话,因此您需要重新加载或重新打开 shell 才能使更改生效。

兼容 AWS SDKs

以下内容SDKs支持本主题中描述的功能和设置。所有部分例外情况均已注明。 AWS SDK for Java 和 AWS SDK for Kotlin 唯一支持任何JVM系统属性设置。

SDK 支持 备注或更多信息
AWS CLI v2
SDK对于 C++
SDK适用于 Go V2 (1.x)
SDK适用于 Go 1.x (V1) 要使用共享 config 文件设置,必须开启从配置文件加载的功能;请参阅会话
SDK适用于 Java 2.x
SDK适用于 Java 1.x 部分 JVM系统属性:使用com.amazonaws.sdk.disableEc2MetadataV1代替aws.disableEc2MetadataV1aws.ec2MetadataServiceEndpointaws.ec2MetadataServiceEndpointMode不支持。
SDK适用于 JavaScript 3.x
SDK适用于 JavaScript 2.x
SDK对于 Kotlin 来说 不使用IMDSv1后备。
SDK对于。 NET3.x
SDK适用于 PHP 3.x
SDK适用于 Python (Boto3)
SDK适用于 Ruby 3.x
SDK对于 Rust 不使用IMDSv1后备。
用于 PowerShell 您可以使用在代码中显式禁用IMDSv1回退。[Amazon.Util.EC2InstanceMetadata]::EC2MetadataV1Disabled = $true