本文介绍在普通模式和加固模式下查看实例元数据的区别,并演示如何查看实例元数据。

前提条件

背景信息

您可以通过访问endpoint查看实例元数据,endpoint格式为http://100.100.100.200/latest/[metadata]。请将其中的[metadata]替换为具体的实例元数据项,更多信息,请参见实例元数据项
访问endpoint时支持普通模式和加固模式,对比如下表所示。
对比项 普通模式 加固模式
交互方式 请求/响应 会话
安全校验 同VPC内源IP地址校验 基于token鉴权
查看方法 通过命令直接访问endpoint 通过命令访问endpoint,请求中必须包含token标头

普通模式下,每次查看实例元数据时都需要建立新连接,且校验方式简单,请求完毕即释放连接。如果实例元数据服务器遭受攻击泄露RAM角色等敏感数据,会威胁到您的数据和资产。

SSRF(Server-Side Request Forgery)是指攻击者利用服务器漏洞,篡改获取资源的请求发给服务端,进而利用服务端访问其所在内网资源的攻击方式。由于查看实例元数据时,服务端通过URL方式分享数据内容,因此可能被恶意篡改用于攻击从外网无法访问的内部系统。加固模式下,实例基于token鉴权查看实例元数据,相比普通模式对SSRF攻击有更好的防范效果。在自建网络防火墙应用、自建反向代理应用、自建提供转码下载服务的Web应用等场景中,建议您利用加固模式查看实例元数据,防范SSRF攻击,提高应用安全性。

您需要在创建实例时指定实例元数据访问模式:
  • 普通模式(兼容加固模式):实例创建完成后,支持通过普通模式或者加固模式查看实例元数据。
  • 仅加固模式:实例创建完成后,仅支持通过加固模式查看实例元数据。
    警告 选择仅加固模式会导致cloud-init组件初始化配置失败,影响实例的元数据、自定义数据等配置,请慎重选择。
metadata-mode

查看实例元数据(普通模式)

在Linux实例中查看实例元数据的Shell命令示例如下所示:
  • 查看实例元数据的根目录:
    curl http://100.100.100.200/latest/meta-data
  • 查看实例ID:
    curl http://100.100.100.200/latest/meta-data/instance-id
  • 查看活跃中的系统事件:
    curl http://100.100.100.200/latest/maintenance/active-system-events
  • 查看实例标识文档:
    curl http://100.100.100.200/latest/dynamic/instance-identity/document
  • 查看您传入的实例自定义数据:
    curl http://100.100.100.200/latest/user-data
在Windows实例中查看实例元数据的PowerShell命令示例如下所示:
  • 查看实例元数据的根目录:
    Invoke-RestMethod http://100.100.100.200/latest/meta-data
  • 查看实例ID:
    Invoke-RestMethod http://100.100.100.200/latest/meta-data/instance-id
  • 查看活跃中的系统事件:
    Invoke-RestMethod http://100.100.100.200/latest/maintenance/active-system-events
  • 查看实例标识文档:
    Invoke-RestMethod http://100.100.100.200/latest/dynamic/instance-identity/document
  • 查看您传入的实例自定义数据:
    Invoke-RestMethod http://100.100.100.200/latest/user-data

查看实例元数据(加固模式)

加固模式下,实例和实例元数据服务器间建立一个会话,并在查看实例元数据时通过token验证身份,超过有效期后关闭会话并清除token。token具有以下特点:
  • 仅适用于一台实例。如果将token文件复制到其它实例使用,会被拒绝访问。
  • 必须定义token有效期,范围为1秒~21600秒(6小时)。在有效期内可以重复使用,方便您平衡安全性和用户体验。
  • 不接受代理访问,如果创建token的请求中包含X-Forwarded-For标头,则拒绝签发token。
  • 不限制向实例签发的token数量。
加固模式下查看实例元数据的流程如下所示:
  1. 使用PUT方法发起创建token请求。必须指定token有效期,标头格式为X-aliyun-ecs-metadata-token-ttl-seconds:<token有效期>
  2. 实例元数据服务器签发token。
  3. 查看实例元数据时填入实例元数据服务器endpoint和token标头。token标头格式为X-aliyun-ecs-metadata-token: $TOKEN
  4. 鉴权通过,实例元数据服务器返回实例元数据信息。
查看实例元数据的命令示例如下:
  • Linux实例:
    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21600"` \
    && curl -H "X-aliyun-ecs-metadata-token: $TOKEN"  http://100.100.100.200/latest/meta-data/instance-id
  • Windows实例:
    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://100.100.100.200/latest/api/token
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/instance-id
示例说明如下所示:
  • 通过PUT方法创建一个有效期为21600秒(6小时)的token。
  • 使用变量TOKEN存储token。
  • 查看实例元数据中的实例ID,并在请求中填入了token变量名称$TOKEN
在token有效期内可以重复使用token,使用已有token的示例命令如下所示:
  • Linux实例:
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN"  http://100.100.100.200/latest/meta-data/instance-id
  • Windows实例:
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/instance-id
错误示例:
  • 有效期为21700秒,超过有效期范围。
    curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21700"
  • 创建token的请求中存在X-Forwarded-For标头。
    curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-Forwarded-For: www.ba****.com"
  • 查看实例元数据时指定的token无效。
    curl -H "X-aliyun-ecs-metadata-token: aaa" -v http://100.100.100.200/latest/meta-data/