在云原生环境中,禁止硬编码长期 AccessKey/SecretKey 已成为基本安全要求。主流云厂商都提供了实例元数据服务(Instance Metadata Service, IMDS),让运行在云服务器内部的应用可以动态获取临时凭证(Token / 临时 AccessKey)。
这些接口通常通过实例内部可访问的专用地址或域名提供服务。应用在配置实例角色、托管身份或服务账号后,可以获取短期凭证,减少长期密钥的分发和保存。
需要区分两类 token:IMDSv2 的会话 token 用于访问元数据服务;从元数据服务取得的临时凭证或 OAuth access token,用于访问云 API。两者用途和有效期不同。
1. 为什么需要元数据服务?
传统做法把长期密钥写在代码、环境变量或配置文件里,一旦泄露后果严重。
元数据服务的核心优势:
- 临时凭证:通常有效期几小时,自动轮换
- 零密钥存储:应用无需保存长期密钥
- 身份关联:实例绑定角色或身份,但取出的临时凭证泄露后仍可能被用于实例之外,不能把身份关联当成使用位置限制
- 最小权限:通过绑定的角色/身份控制权限范围
2. 各主流云厂商对比
| 云厂商 | 元数据地址 | 元数据访问机制 | 推荐模式 | 临时凭证获取路径 |
|---|---|---|---|---|
| AWS | 169.254.169.254 | IMDSv2(先 PUT 拿 session token) | 强制 IMDSv2 | /latest/meta-data/iam/security-credentials/<role> |
| Azure | 169.254.169.254 | 必须带 Metadata: true | Managed Identity | /metadata/identity/oauth2/token |
| GCP | metadata.google.internal | 必须带 Metadata-Flavor: Google | Service Account + ADC | /computeMetadata/v1/instance/service-accounts/default/token |
| 阿里云 | 100.100.100.200 | 加固模式(先 PUT 拿 token) | 仅加固模式 | /latest/meta-data/ram/security-credentials/<role> |
| 华为云 | 169.254.169.254 | V2 加固(先 PUT 拿 token) | 仅 V2 | /openstack/latest/securitykey |
| 腾讯云 | metadata.tencentyun.com | 传统模式(直接 GET) | 绑定 CAM 角色 | /latest/meta-data/cam/security-credentials/<role> |
3. 具体 API 调用示例
以下命令用于在自己管理的对应云服务器内部检查身份配置;执行前应已绑定角色、托管身份、服务账号或委托。返回内容包含敏感凭证,不应写入日志或提交到代码仓库。
3.1 AWS(推荐 IMDSv2)
# 1. 获取 session token(TTL 最长 21600 秒)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 2. 查看绑定的角色名
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 3. 获取临时凭证
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME
返回包含 AccessKeyId、SecretAccessKey、Token、Expiration。
3.2 Azure(Managed Identity)
curl -H "Metadata: true" \
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"
返回 Bearer Token。多身份时可加 client_id 或 msi_res_id 参数。
3.3 GCP
curl -H "Metadata-Flavor: Google" \
"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
返回:
{
"access_token": "ya29....",
"expires_in": 3599,
"token_type": "Bearer"
}
推荐使用 Application Default Credentials (ADC),官方 SDK 会自动处理。
3.4 阿里云(推荐加固模式)
# 1. 获取临时 token
TOKEN=$(curl -X PUT "http://100.100.100.200/latest/api/token" \
-H "X-aliyun-ecs-metadata-token-ttl-seconds:21600")
# 2. 获取 RAM 角色临时凭证
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" \
http://100.100.100.200/latest/meta-data/ram/security-credentials/ROLE_NAME
3.5 华为云(V2 加固模式)
TOKEN=$(curl -X PUT "http://169.254.169.254/meta-data/latest/api/token" \
-H "X-Metadata-Token-Ttl-Seconds:21600")
curl -H "X-Metadata-Token: $TOKEN" \
http://169.254.169.254/openstack/latest/securitykey
该接口返回委托的临时 AK/SK 和安全令牌,需先为 ECS 配置相应委托。meta_data.json 返回实例信息,不是临时凭证接口。参见华为云元数据文档。
3.6 腾讯云
# 查看角色名
curl http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/
# 获取临时凭证
curl http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/ROLE_NAME
4. 安全风险与防护:SSRF 攻击
元数据服务最大的风险是 SSRF(服务器端请求伪造)。攻击者利用应用漏洞,让服务器请求 169.254.169.254,从而窃取临时凭证。

这张示意图展示了直接访问与会话令牌校验的区别,但其中几处标注需要纠正:IMDSv2 的 token 请求会拒绝携带 X-Forwarded-For 的 PUT 请求;强制 IMDSv2 时,无效或缺失 token 的元数据请求返回 401,不是图中的 403;会话 TTL 最长 6 小时,并非固定默认值。默认启用状态应以实例、账号与镜像配置为准。容器场景也不能一律把 hop limit 设为 1,否则可能导致合法访问失败。参见 AWS IMDSv2 文档。
防护措施对比
| 云厂商 | 主要防护手段 | 效果 |
|---|---|---|
| AWS IMDSv2 | 必须先 PUT 获取 session token | 大幅提升 SSRF 难度 |
| Azure | 强制 Metadata: true Header | 阻断简单 URL 注入 |
| GCP | 强制 Metadata-Flavor: Google Header | 同上 |
| 阿里云加固模式 | 必须先获取 token | 类似 IMDSv2 |
| 华为云 V2 | 必须携带 token | 类似 IMDSv2 |
| 腾讯云 | 本文所列接口使用 GET 获取角色凭证 | 限制应用访问元数据并收紧角色权限 |
这些措施不能替代 SSRF 修复。如果漏洞允许控制请求方法、请求头并读取响应,单靠会话 token 或固定请求头不一定能阻断利用。
5. 最佳实践清单
优先使用与工作负载关联的身份
- AWS:IAM Instance Profile
- Azure:Managed Identity
- GCP:Service Account
- 阿里云:RAM 角色
- 腾讯云:CAM 角色
启用最严格的元数据模式
- AWS:强制 IMDSv2
- 阿里云:仅加固模式
- 华为云:仅 V2
优先使用官方 SDK 使用支持相应身份机制的官方 SDK 和默认凭证链,让 SDK 处理凭证获取、缓存和刷新;同时检查是否被环境变量中的长期密钥覆盖。
最小权限原则 绑定的角色只授予必要权限。
网络层限制
- 按网络拓扑设置 hop limit,并验证容器场景的可达性
- 防火墙限制对元数据地址的访问
- 不需要时直接关闭元数据服务
容器 / Kubernetes 场景 使用 Workload Identity(AWS IRSA、阿里云 RRSA、GCP Workload Identity、Azure Workload Identity),而不是直接依赖节点元数据。
6. 总结
| 场景 | 推荐方案 |
|---|---|
| 新项目 | 强制开启厂商加固模式 + 官方 SDK |
| 存量项目 | 逐步迁移到 IMDSv2 / 加固模式 |
| 容器化应用 | 优先使用 Workload Identity |
| 安全合规 | 云 API 调用审计 + 主机侧监测 + 最小权限 |
临时凭证可以缩短泄露后的可用时间,但不能消除泄露风险。将身份权限、元数据访问限制和应用层 SSRF 防护一起落实,才有实际效果。元数据访问不一定直接出现在云审计日志中,需要结合平台能力和主机侧监测。
本文基于公开文档整理,具体参数以各云厂商最新官方文档为准。