本文介绍在普通模式和加固模式下查看实例元数据的区别,并演示如何查看实例元数据。
前提条件
- 实例的网络类型为专有网络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命令示例如下所示:
- 查看实例元数据的根目录:
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数量。
加固模式下查看实例元数据的流程如下所示:
- 使用PUT方法发起创建token请求。必须指定token有效期,标头格式为
X-aliyun-ecs-metadata-token-ttl-seconds:<token有效期>
。 - 实例元数据服务器签发token。
- 查看实例元数据时填入实例元数据服务器endpoint和token标头。token标头格式为
X-aliyun-ecs-metadata-token: $TOKEN
。 - 鉴权通过,实例元数据服务器返回实例元数据信息。
查看实例元数据的命令示例如下:
- 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/