IMDSSnow Family 设备上的版本 - AWS Snowball Edge 开发者指南

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

IMDSSnow Family 设备上的版本

您可以使用IMDS版本 2 或IMDS版本 1 从正在运行的实例访问实例元数据:

  • 实例元数据服务版本 2 (IMDSv2),一种面向会话的方法

  • 实例元数据服务版本 1 (IMDSv1),一种请求响应方法

根据您的 Snow 软件版本,您可以使用IMDSv1IMDSv2、或两者兼而有之。这还取决于EC2兼容实例中的AMI运行类型。有些则AMIs需要,例如运行 Ubuntu 20.04 的版本。IMDSv2实例元数据服务根据PUTGET标头的存在来区分IMDSv1和IMDSv2请求。IMDSv2同时使用这两个标头。IMDSv1仅使用标GET题。

AWS 鼓励使用IMDSv2而不是IMDSv1因为IMDSv2包括更高的安全性。有关更多信息,请参阅通过增强EC2实例元数据服务,进一步增强针对开放防火墙、反向代理和SSRF漏洞的防御

IMDSv2在 Snow Family 设备上

当您使用IMDSv2请求实例元数据时,请求必须遵循以下规则:

  1. 使用 PUT 请求启动到实例元数据服务的会话。该PUT请求返回一个会话令牌,该令牌必须包含在对实例元数据服务的后续GET请求中。定义会话持续时间的会话令牌。会话持续时间最少可以为 1 秒,最多为 6 小时。在这段时间内,您可以将相同的会话令牌用于后续请求。在这段时间到期后,您必须为将来的请求创建新的会话令牌。使用访问元数据需要使用令牌IMDSv2。

  2. 将该令牌包含在对实例元数据服务的所有 GET 请求中。

    1. 令牌是实例特定的密钥。该令牌在其他EC2兼容实例上无效,如果您尝试在生成令牌的实例之外使用该令牌,则该令牌将被拒绝。

    2. PUT请求必须包含一个标头,该标头指定令牌的生存时间 (TTL),以秒为单位,最多不超过六小时(21,600 秒)。令牌表示一个逻辑会话。TTL指定令牌有效的时间长度,从而指定会话的持续时间。

    3. 在令牌过期后,要继续访问实例元数据,您必须使用另一个 PUT 请求创建新会话。

    4. 您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,在每次需要访问实例元数据服务时生成并立即使用令牌可能更方便。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不必在每次需要请求实例元数据时都编写 PUT 请求。对并发令牌数量没有实际限制,每个令牌表示自己的会话。

HTTPGET并且允许在IMDSv2实例元数据请求中使用HEAD方法。 PUT如果请求包含X-Forwarded-For标头,则会被拒绝。

默认情况下,PUT 请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1。IMDSfor Snow 无法修改PUT响应的跳跃限制。

以下示例使用 Linux shell 脚本和IMDSv2来检索顶级实例元数据项。此示例:

  1. 使用 PUT 请求创建持续 6 小时(21600 秒)的会话令牌。

  2. 将会话令牌标头存储在名为 TOKEN 的变量中。

  3. 使用令牌请求顶级元数据项。

使用两个命令生成EC2兼容令牌。您可以单独运行这些命令,也可以作为一个命令运行。

首先,使用以下命令生成令牌。

注意

X-aws-ec2-metadata-token-ttl-seconds 是必填的标头。如果未包含此标头,您将收到 400 - 缺少参数或参数无效错误代码。

[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/
注意

如果创建令牌时发生错误,则会在变量中存储一条错误消息,而不会生成有效令牌,且命令将不起作用。

您可以存储令牌并组合命令。以下示例将上述两个命令组合在一起,并将会话令牌标头存储在名为 TOKEN 的变量中。

例 组合命令
[ec2-user ~]$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

在创建令牌后,您可以重复使用令牌,直到令牌过期。以下示例命令获取AMI用于启动实例的 ID,并将其存储在上一个示例中$TOKEN创建的中。

例 重复使用令牌
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id

IMDSv1在 Snow Family 设备上

IMDSv1使用请求-响应模型。要请求实例元数据,您需要向实例元数据服务发送 GET 请求。

[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

您的实例元数据可从正在运行的实例中获取,因此您无需使用 Amazon EC2 控制台或 AWS CLI 即可访问它。这在您编写脚本以实现从实例运行时非常有用。例如,您可从实例元数据访问您的实例的本地 IP 地址来以管理与外部应用程序的连接。实例元数据可划分成不同类别。有关每个实例元数据类别的描述,请参阅本指南中的支持的实例元数据和用户数据

要从正在运行的实例中查看所有类别的实例元数据,请使用以下内容 IPv4URI:

http://169.254.169.254/latest/meta-data/

IP 地址是链路本地地址,仅从该实例访问时有效。有关更多信息,请参阅 Wikipedia 上的链路本地地址

所有实例元数据均以文本(HTTP内容类型text/plain)形式返回。

对特定元数据资源的请求会返回相应的值,如果资源不可用,则返回 404- Not Found HTTP 错误代码。

请求常规元数据资源(当以/字符URI结尾时)会返回可用资源列表,如果没有此类资源,则返回 404- Not Found HTTP 错误代码。列表项位于不同的行中,以换行符结尾(ASCII字符代码 10)。

对于使用发出的请求IMDSv1,可能会返回以下HTTP错误代码:

  • 400 ‐ 缺少参数或参数无效PUT 请求无效。

  • 401 ‐ 未授权GET 请求使用的令牌无效。建议的措施是生成新的令牌。

  • 403 ‐ 禁止访问:不允许该请求,或禁用了实例元数据服务。