EC2 元数据 169.254.169.254 的真面目 - 链路本地地址与 IMDSv2 的设计

解析 EC2 实例元数据服务端点 169.254.169.254 为何是链路本地地址、被 SSRF 攻击利用的历史,以及 IMDSv2 基于令牌认证诞生的经过。

169.254.169.254 在哪里

EC2 实例内部访问 http://169.254.169.254/latest/meta-data/ 时,会返回实例 ID、AMI ID、IAM 角色临时凭证、网络配置等实例元数据。这个 169.254.169.254 地址不是互联网上的服务器,而是 Nitro System 虚拟机管理程序提供的本地服务。169.254.0.0/16 是 RFC 3927 定义的链路本地地址,是不会被路由器转发的特殊地址范围。也就是说,对该地址的请求不会离开实例,由虚拟机管理程序直接响应。这种设计使元数据服务不受网络故障影响,也不依赖 VPC 路由配置。实例启动的瞬间,甚至在网络配置完成之前就能访问元数据服务。cloud-init 在执行实例初始配置时首先从元数据服务获取用户数据和网络配置,正是因为这种高可靠性。

Capital One 事件 - SSRF 导致元数据泄露的那天

2019 年 7 月,Capital One(美国大型银行)发生了约 1 亿人个人信息泄露事件。攻击者利用 Capital One Web 应用中存在的 SSRF(Server-Side Request Forgery)漏洞,从 EC2 实例元数据服务获取了 IAM 角色的临时凭证。SSRF 是让服务器端应用向任意 URL 发送请求的攻击。攻击者让 Web 应用发送 http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name 请求,获取了 IAM 角色的访问密钥、秘密密钥和会话令牌。利用这些凭证访问 S3 存储桶,下载了大量个人信息。这一事件暴露了 IMDSv1(Instance Metadata Service Version 1)的设计弱点。IMDSv1 通过简单的 HTTP GET 请求返回元数据,因此 SSRF 攻击可以轻易访问。

IMDSv2 - 基于令牌认证的防御

受 Capital One 事件影响,AWS 于 2019 年 11 月发布了 IMDSv2(Instance Metadata Service Version 2)。IMDSv2 是要求会话令牌才能访问元数据的基于令牌的认证方式。使用 IMDSv2 获取元数据时,需先通过 PUT 请求获取会话令牌,然后将该令牌包含在 HTTP 头中发送 GET 请求。这种两步认证能防止 SSRF 攻击的原因是,大多数 SSRF 漏洞只能执行 GET 请求。能执行 PUT 请求的 SSRF 漏洞很少见,而且还需要从响应头提取令牌并包含在下一个请求中这样复杂的操作。此外,IMDSv2 的令牌获取请求必须包含 X-aws-ec2-metadata-token-ttl-seconds 头,IP 转发的请求(TTL 设为 1,无法跨网络跳)也会被阻止。2024 年以后,AWS 将新实例的默认设置改为仅 IMDSv2,强烈建议禁用 IMDSv1。

元数据可获取信息的全貌

元数据服务可获取的信息涵盖广泛。包括实例基本信息(instance-id、instance-type、ami-id、hostname)、网络信息(local-ipv4、public-ipv4、mac、network/interfaces)、IAM 角色临时凭证(iam/security-credentials/role-name)、用户数据(user-data)、块设备映射(block-device-mapping)等。特别重要的是 IAM 角色临时凭证。为 EC2 实例附加 IAM 角色后,可从元数据服务获取临时访问密钥、秘密密钥和会话令牌。AWS SDK 内部自动使用此机制,开发者无需在代码中硬编码访问密钥。临时凭证自动轮换,有效期通常为 6 小时。元数据服务还包含实例的用户数据。用户数据是实例启动时指定的脚本或数据,cloud-init 用于初始配置。在用户数据中包含密码或密钥是危险的,因为任何人都可通过元数据服务读取。

元数据服务安全强化措施

除启用 IMDSv2 外,还有几种强化元数据服务安全的方法。第一,将 HttpPutResponseHopLimit 设为 1。这会阻止容器内对元数据的访问。当 ECS 或 Docker 容器内的应用无需访问元数据服务时,将跳数限制设为 1 可防止容器内的 SSRF 攻击。第二,完全禁用元数据服务。将 HttpEndpoint 设为 disabled 可完全阻止对元数据服务的访问。对于不需要 IAM 角色凭证的实例(使用固定凭证时),禁用元数据服务最为安全。第三,将 IAM 角色权限最小化。即使元数据服务的凭证泄露,如果角色权限最小,损害也可控。Capital One 事件中,泄露的角色拥有对 S3 存储桶的广泛访问权限,扩大了损害范围。要系统学习 EC2 安全设计,专业书籍 (Amazon)可供参考。