本文介绍在普通模式和加固模式下查看实例元数据的区别,并演示如何查看实例元数据。
前提条件
- 实例的网络类型为专有网络VPC。
- 已远程连接实例。
背景信息
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组件初始化配置失败,影响实例的元数据、自定义数据等配置,请慎重选择。

查看实例元数据(普通模式)
在Linux实例中查看实例元数据的Shell命令示例如下所示:
- 查看实例元数据的根目录:1
curl http:
//100.100.100.200/latest/meta-data
- 查看实例ID:1
curl http:
//100.100.100.200/latest/meta-data/instance-id
- 查看活跃中的系统事件: 1
curl http:
//100.100.100.200/latest/maintenance/active-system-events
- 查看实例标识文档: 1
curl http:
//100.100.100.200/latest/dynamic/instance-identity/document
- 查看您传入的实例自定义数据: 1
curl http:
//100.100.100.200/latest/user-data
在Windows实例中查看实例元数据的PowerShell命令示例如下所示:
- 查看实例元数据的根目录:1
Invoke-RestMethod http:
//100.100.100.200/latest/meta-data
- 查看实例ID:1
Invoke-RestMethod http:
//100.100.100.200/latest/meta-data/instance-id
- 查看活跃中的系统事件: 1
Invoke-RestMethod http:
//100.100.100.200/latest/maintenance/active-system-events
- 查看实例标识文档: 1
Invoke-RestMethod http:
//100.100.100.200/latest/dynamic/instance-identity/document
- 查看您传入的实例自定义数据: 1
Invoke-RestMethod http:
//100.100.100.200/latest/user-data
查看实例元数据(加固模式)
加固模式下,实例和实例元数据服务器间建立一个会话,并在查看实例元数据时通过token验证身份,超过有效期后关闭会话并清除token。token具有以下特点:
- 仅适用于一台实例。如果将token文件复制到其它实例使用,会被拒绝访问。
- 必须定义token有效期,范围为1秒~21600秒(6小时)。在有效期内可以重复使用,方便您平衡安全性和用户体验。
- 不接受代理访问,如果创建token的请求中包含
X-Forwarded-For
标头,则拒绝签发token。 - 不限制向实例签发的token数量。
加固模式下查看实例元数据的流程如下所示:
- 使用PUT方法发起创建token请求。必须指定token有效期,标头格式为
X-aliyun-ecs-metadata-token-ttl-seconds:<token有效期>
。 - 实例元数据服务器签发token。
- 查看实例元数据时填入实例元数据服务器endpoint和token标头。token标头格式为
X-aliyun-ecs-metadata-token: $TOKEN
。 - 鉴权通过,实例元数据服务器返回实例元数据信息。
查看实例元数据的命令示例如下:
- Linux实例:12
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实例:12
$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实例:1
curl -H
"X-aliyun-ecs-metadata-token: $TOKEN"
http:
//100.100.100.200/latest/meta-data/instance-id
- Windows实例:1
Invoke-RestMethod -Headers @{
"X-aliyun-ecs-metadata-token"
= $token} -Method GET -Uri http:
//100.100.100.200/latest/meta-data/instance-id
错误示例:
- 有效期为21700秒,超过有效期范围。 1
curl -X PUT
"http://100.100.100.200/latest/api/token"
-H
"X-aliyun-ecs-metadata-token-ttl-seconds: 21700"
- 创建token的请求中存在X-Forwarded-For标头。 1
- 查看实例元数据时指定的token无效。 1
curl -H
"X-aliyun-ecs-metadata-token: aaa"
-v http:
//100.100.100.200/latest/meta-data/