在 Lightsail 上访问和配置实例元数据服务(IMDS)
您可以使用以下其中一种方法,从正在运行的实例中访问实例元数据:
-
实例元数据服务版本 1 (IMDSv1) – 一种请求/响应方法
-
实例元数据服务版本 2 (IMDSv2) – 一种面向会话的方法
重要
并非 Lightsail 中的所有实例蓝图都支持 IMDSv2。使用
MetadataNoToken
实例指标跟踪对使用 IMDSv1 的实例元数据服务的调用次数。有关更多信息,请参阅查看实例指标。
默认情况下,您可以使用 IMDSv1 和/或 IMDSv2。实例元数据服务根据以下条件区分 IMDSv1 和 IMDSv2 请求:在任何给定请求中存在的是 PUT
还是 GET
标头(对于 IMDSv2 是唯一的)。有关更多信息,请参阅借助 EC2 实例元数据服务的增强功能,为开放式防火墙、反向代理和 SSRF 漏洞增加深度防御
您可以在每个实例上配置实例元数据服务,以确保本地代码或用户必须使用 IMDSv2。在指定必须使用 IMDSv2 时,IMDSv1 不再起作用。有关更多信息,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的配置实例元数据选项。
要检索实例元数据,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的检索实例元数据。
注意
此部分中的示例使用实例元数据服务的 IPv4 地址:169.254.169.254
。如果要通过 IPv6 地址检索实例的实例元数据,请确保启用并改用 IPv6 地址:fd00:ec2::254
。实例元数据服务的 IPv6 地址与 IMDSv2 命令兼容。
实例元数据服务版本 2 的工作原理
IMDSv2 使用面向会话的请求。对于面向会话的请求,您创建一个会话令牌以定义会话持续时间,该时间最少为 1 秒,最多为 6 小时。在指定的持续时间内,您可以将相同的会话令牌用于后续请求。在指定的持续时间到期后,您必须创建新的会话令牌以用于将来的请求。
重要
从 Amazon Linux 2023 启动的 Lightsail 实例将默认进行 IMDSv2 配置。
以下示例使用 Linux 和 PowerShell Shell 脚本以及 IMDSv2 来检索顶级实例元数据项。这些示例执行以下操作:
-
使用
PUT
请求创建持续 6 小时(21600 秒)的会话令牌 -
将会话令牌标头存储在名为
TOKEN
(在 Linux 上)或token
(在 Windows 上)的变量中 -
使用令牌请求顶级元数据项
通过运行以下命令开始:
-
在 Linux 上:
-
首先,使用以下命令生成令牌。
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` -
然后,通过令牌使用以下命令生成顶级元数据项。
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
-
-
在 Windows 上:
-
首先,使用以下命令生成令牌。
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
-
然后,通过令牌使用以下命令生成顶级元数据项。
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
-
创建令牌后,您可以重复使用令牌,直到令牌过期。在以下示例中,每个命令都会获取用于启动实例的蓝图(亚马逊云机器镜像(AMI))的 ID。上一个示例中的令牌可以重复使用。该令牌存储在 $TOKEN
(在 Linux 上)或 $token
(在 Windows 上)中。
-
在 Linux 上:
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id -
在 Windows 上:
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
在使用 IMDSv2 请求实例元数据时,请求必须包含以下内容:
-
PUT
请求 – 使用PUT
请求可启动到实例元数据服务的会话。PUT
请求返回一个令牌,该令牌必须包含在对实例元数据服务的后续GET
请求中。使用 IMDSv2 时,需要具有该令牌才能访问元数据。 -
令牌 – 将该令牌包含在对实例元数据服务的所有
GET
请求中。如果将令牌使用设置为required
,没有有效令牌或令牌过期的请求将显示401 - Unauthorized
HTTP 错误代码。有关更改令牌使用要求的信息,请参阅《AWS CLI Command Reference》中的 update-instance-metadata-options。-
令牌是实例特定的密钥。令牌在其他实例上无效,如果尝试在生成令牌的实例外部使用,令牌将会被拒绝。
-
PUT
请求必须包含一个标头,它以秒为单位指定令牌的生存时间(TTL)。TTL 最多可以指定为 6 小时(21600 秒)。令牌表示一个逻辑会话。TTL 指定令牌的有效时间长度,因而指定会话的持续时间。 -
在令牌过期后,要继续访问实例元数据,您必须使用另一个
PUT
请求创建新会话。 -
您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,在每次需要访问实例元数据服务时生成并立即使用令牌可能更方便。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不是在每次需要请求实例元数据时都编写
PUT
请求。对并发令牌数量没有实际限制,每个令牌均表示自己的会话。不过,IMDSv2 仍然受到正常实例元数据服务连接和限制的制约。有关更多信息,请参阅《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》中的查询限制。
-
允许在 IMDSv2 实例元数据请求中使用 HTTP GET
和 HEAD
方法。如果 PUT
请求包含 X-Forwarded-For
标头,则会被拒绝。
默认情况下,PUT
请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1
。如果需要更大的跃点数限制,您可以使用 update-instance-metadata-options
命令进行调整。例如,您可能需要使用更大的跃点数限制,以便与实例上运行的容器服务保持向后兼容。有关更多信息,请参阅《AWS CLI Command Reference》中的 update-instance-metadata-options。
转换为使用 实例元数据服务版本 2
使用实例元数据服务版本 2 (IMDSv2) 为可选项。将继续无期限支持实例元数据服务版本 1 (IMDSv1)。如果您选择迁移以使用 IMDSv2,我们建议您使用以下工具和转换途径。
帮助转换为 IMDSv2 的工具
如果您的软件使用 IMDSv1,请使用以下工具帮助重新配置软件,以使用 IMDSv2。
-
AWS 软件:最新版本的 AWS SDK 和 AWS CLI 支持 IMDSv2。要使用 IMDSv2,请确保您的实例具有最新版本的 AWS SDK 和 AWS CLI。有关更新 AWS CLI 的信息,请参阅《AWS Command Line Interface 用户指南》中的安装、更新和卸载 AWS CLI。所有的 Amazon Linux 2 软件包都支持 IMDSv2。
-
实例指标:IMDSv2 使用由令牌支持的会话,而 IMDSv1 不使用。
MetadataNoToken
实例指标跟踪对使用 IMDSv1 的实例元数据服务的调用次数。通过查看该指标是否为零,您可以确定是否以及何时将所有软件升级为使用 IMDSv2。有关更多信息,请参阅在 Amazon Lightsail 中查看实例指标。 -
Lightsail API 操作和 AWS CLI 命令更新:对于现有实例,您可以使用 update-instance-metadata-options AWS CLI 命令(或 UpdateInstanceMetadataOptions API 操作)以要求使用 IMDSv2。以下命令是一个示例。确保将
InstanceName
替换为您的实例名称,并将RegionName
替换为实例所在的AWS 区域区域。aws lightsail update-instance-metadata-options --region
RegionName
--instance-nameInstanceName
--http-tokens required
要求 IMDSv2 访问的建议途径
在使用上述工具时,我们建议您按照以下途径转换为 IMDSv2:
步骤 1:在开始时
将在实例上使用角色凭证的 AWS SDK、AWS CLI 和软件更新为与 IMDSv2 兼容的版本。有关更新 AWS CLI 的信息,请参阅《AWS Command Line Interface 用户指南》中的升级到最新版本的 AWS CLI。
然后,使用 IMDSv2 请求更改直接访问实例元数据的软件(换句话说,不使用 AWS SDK)。
步骤 2:在转换期间
使用实例指标 MetadataNoToken
跟踪您的转换进度。此指标显示对在实例上使用 IMDSv1 的实例元数据服务的调用次数。有关更多信息,请参阅查看实例指标。
步骤 3:在所有实例上一切准备就绪时
在实例指标 MetadataNoToken
记录 IMDSv1 使用次数为零时,说明在所有实例上一切准备就绪。在此阶段,您可以通过 update-instance-metadata-options 命令要求必须使用 IMDSv2。您可以在正在运行的实例上进行这些更改,而无需重新启动实例。
更新现有实例的实例元数据选项只能通过 Lightsail API 或 AWS CLI 执行。Lightsail 控制台当前不支持此操作。有关更多信息,请参阅 update-instance-metadata-options。
其他 IMDS 文档
以下 IMDS 文档在《Amazon Elastic Compute Cloud 用户指南(适用于 Linux 实例)》和《Amazon Elastic Compute Cloud 用户指南(适用于 Windows 实例)》中提供:
注意
在 Amazon EC2 中,实例蓝图称为亚马逊机器映像(AMI)。
-
对于 Linux 实例:
-
对于 Windows 实例: