Instance Metadata Service - IMDS

IMDS分为v1和v2

IMDSv1

IMDSv1的使用很简单,访问EC2的 http://169.254.169.254/latest/meta-data 接口,就能获取到实例的各种数据:

image-20230816084505488

IMDSv2

IMDSv2的使用要经过两步。第一步是使用PUT请求获取session token

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

第二步是使用session token来访问metadata接口:

curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-id/

image-20230816084635452

为什么IMDSv2更安全

IMDSv2只是多了一步获取session token的过程,为什么它会比IMDSv1更安全呢?关键在于第一步的PUT请求:

  • 市面上大部分的WAF都默认阻拦PUT请求,所以如果部署了WAF,可以很好的保护IMDS
  • 如果在EC2上部署了反向代理,则用户会获取到169.254.169.254下的数据。但如果在IMDSv2下,需要先使用PUT请求。大部分的反向代理都不会允许PUT请求
  • 可以阻挡SSRF攻击(SSRF - Server-Side Request Forgery是一 种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,ssrf攻击的目标是外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。) 具体的攻击方式可以参考 https://catalog.workshops.aws/aws-cirt-ssrf-imdsv1-simulation-and-detection/en-US

参考: https://aws.amazon.com/cn/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/

只允许使用IMDSv2

默认创建的EC2即可以使用IMDSv1,也可以使用IMDSv2。

如果想在创建EC2时,只允许使用IMDSv2,在Metadata version选项中可以设置:

image-20230816093712894

另外,使用SCP也可以禁止用户开启 IMDSv1的机器:

image-20230816100300721

如何监控使用IMDSv1的EC2

EC2具有以下指标,可以在cloudwatch中查看:

MetadataNoToken 使用IMDSv1调用的次数;如果全部使用IMDSv2调用,则这个指标数量为0

image-20230816095352973