1. 什么是 IMDS

AWS 提供的实例元数据服务(Instance Metadata Service,IMDS)用于在 EC2 实例内部获取运行时信息,例如:

  • 实例 ID

  • Region / AZ

  • IAM Role 临时凭证

  • 网络信息(IP / MAC)

访问地址固定为:

http://169.254.169.254/latest/meta-data/

2. IMDS 的版本分类

目前 IMDS 只有两个版本:

  • IMDSv1(早期版本)

  • IMDSv2(增强安全版本)


3. IMDSv1

3.1 基本用法

IMDSv1 访问非常简单,直接 HTTP 请求即可:

curl http://169.254.169.254/latest/meta-data/

获取 IAM 凭证示例:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

3.2 优点

  • 简单易用

  • 无需额外认证步骤


3.3 安全问题

IMDSv1 最大的问题是:没有任何认证机制

典型风险:

(1)SSRF 攻击

如果你的应用存在 SSRF 漏洞:

攻击者 → 你的服务 → 169.254.169.254 → 获取 IAM 凭证

(2)凭证泄露

攻击者可直接获取:

  • 临时 Access Key

  • Secret Key

  • Session Token

进而访问 AWS 资源


4. IMDSv2

IMDSv2 是 AWS 为了解决安全问题推出的增强版本。


4.1 访问流程(两步)

Step 1:获取 Token

curl -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"

返回:

<TOKEN>

Step 2:携带 Token 请求

curl -H "X-aws-ec2-metadata-token: <TOKEN>" \
  http://169.254.169.254/latest/meta-data/

4.2 安全增强点

(1)Token 机制

  • 必须先获取 token 才能访问 metadata

  • token 有 TTL(最长 6 小时)


(2)防 SSRF

攻击者无法直接构造:

http://169.254.169.254/...

因为缺少 token


(3)Hop Limit

可限制请求跳数(类似 TTL):

  • 防止通过代理/转发访问 metadata


5. IMDSv1 vs IMDSv2 对比

对比项IMDSv1IMDSv2
认证机制Token
请求方式单次两步
安全性
防 SSRF
是否推荐

6. 最佳实践

6.1 强制使用 IMDSv2

推荐在 EC2 上设置:

aws ec2 modify-instance-metadata-options \
  --instance-id <id> \
  --http-tokens required \
  --http-endpoint enabled

6.2 禁用 IMDSv1

关键参数:

  • HttpTokens = required(必须使用 token)

  • HttpEndpoint = enabled


6.3 限制 Hop Limit

--http-put-response-hop-limit 1

避免通过代理访问 metadata


7. 常见问题

Q1:IMDSv2 会不会影响现有程序?

会。

如果你的程序还在使用 IMDSv1(无 token),在强制 IMDSv2 后:

👉 请求会失败(返回 401)


Q2:如何检测当前是否使用 IMDSv1?

可以尝试:

curl http://169.254.169.254/latest/meta-data/
  • 成功:说明 IMDSv1 可用

  • 失败:说明已禁用或强制 IMDSv2


Q3:IMDSv2 是否完全安全?

不是“绝对安全”,但大幅降低风险:

  • SSRF 攻击难度显著提高

  • 需要额外漏洞才能利用


8. 总结

  • IMDS 只有两个版本:IMDSv1 和 IMDSv2

  • IMDSv1 简单但存在严重安全隐患

  • IMDSv2 通过 Token + Hop Limit 提升安全性

  • 实际生产环境:必须强制使用 IMDSv2


9. 一句话结论

IMDSv1 是“裸奔”,IMDSv2 是“带锁”,生产环境不要再用 v1。

更多推荐