在云原生环境中,禁止硬编码长期 AccessKey/SecretKey 已成为基本安全要求。主流云厂商都提供了实例元数据服务(Instance Metadata Service, IMDS),让运行在云服务器内部的应用可以动态获取临时凭证(Token / 临时 AccessKey)。

这些接口通常通过实例内部可访问的专用地址或域名提供服务。应用在配置实例角色、托管身份或服务账号后,可以获取短期凭证,减少长期密钥的分发和保存。

需要区分两类 token:IMDSv2 的会话 token 用于访问元数据服务;从元数据服务取得的临时凭证或 OAuth access token,用于访问云 API。两者用途和有效期不同。

1. 为什么需要元数据服务?

传统做法把长期密钥写在代码、环境变量或配置文件里,一旦泄露后果严重。

元数据服务的核心优势:

2. 各主流云厂商对比

云厂商元数据地址元数据访问机制推荐模式临时凭证获取路径
AWS169.254.169.254IMDSv2(先 PUT 拿 session token)强制 IMDSv2/latest/meta-data/iam/security-credentials/<role>
Azure169.254.169.254必须带 Metadata: trueManaged Identity/metadata/identity/oauth2/token
GCPmetadata.google.internal必须带 Metadata-Flavor: GoogleService 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.254V2 加固(先 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,从而窃取临时凭证。

SSRF 与 IMDSv2 元数据访问机制对比

这张示意图展示了直接访问与会话令牌校验的区别,但其中几处标注需要纠正: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. 最佳实践清单

  1. 优先使用与工作负载关联的身份

    • AWS:IAM Instance Profile
    • Azure:Managed Identity
    • GCP:Service Account
    • 阿里云:RAM 角色
    • 腾讯云:CAM 角色
  2. 启用最严格的元数据模式

    • AWS:强制 IMDSv2
    • 阿里云:仅加固模式
    • 华为云:仅 V2
  3. 优先使用官方 SDK 使用支持相应身份机制的官方 SDK 和默认凭证链,让 SDK 处理凭证获取、缓存和刷新;同时检查是否被环境变量中的长期密钥覆盖。

  4. 最小权限原则 绑定的角色只授予必要权限。

  5. 网络层限制

    • 按网络拓扑设置 hop limit,并验证容器场景的可达性
    • 防火墙限制对元数据地址的访问
    • 不需要时直接关闭元数据服务
  6. 容器 / Kubernetes 场景 使用 Workload Identity(AWS IRSA、阿里云 RRSA、GCP Workload Identity、Azure Workload Identity),而不是直接依赖节点元数据。

6. 总结

场景推荐方案
新项目强制开启厂商加固模式 + 官方 SDK
存量项目逐步迁移到 IMDSv2 / 加固模式
容器化应用优先使用 Workload Identity
安全合规云 API 调用审计 + 主机侧监测 + 最小权限

临时凭证可以缩短泄露后的可用时间,但不能消除泄露风险。将身份权限、元数据访问限制和应用层 SSRF 防护一起落实,才有实际效果。元数据访问不一定直接出现在云审计日志中,需要结合平台能力和主机侧监测。


本文基于公开文档整理,具体参数以各云厂商最新官方文档为准。

官方文档