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

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/

IMDSv2只是多了一步获取session token的过程,为什么它会比IMDSv1更安全呢?关键在于第一步的PUT请求:
169.254.169.254下的数据。但如果在IMDSv2下,需要先使用PUT请求。大部分的反向代理都不会允许PUT请求SSRF - Server-Side Request Forgery是一 种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,ssrf攻击的目标是外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。) 具体的攻击方式可以参考 https://catalog.workshops.aws/aws-cirt-ssrf-imdsv1-simulation-and-detection/en-US默认创建的EC2即可以使用IMDSv1,也可以使用IMDSv2。
如果想在创建EC2时,只允许使用IMDSv2,在Metadata version选项中可以设置:

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

EC2具有以下指标,可以在cloudwatch中查看:
MetadataNoToken |
使用IMDSv1调用的次数;如果全部使用IMDSv2调用,则这个指标数量为0 |
|---|
