查询IMDS即EC2 Metadata V2中的信息

一、背景

EC2在169.254.169.254的IP地址上提供了HTTP服务,可查询包括AWS账户ID、本机Region、所属AZ、机型、EC2 Instance ID、Userdata脚本、绑定的IAM Role等众多信息。这个服务被称为Instance Metadata Service,简称IMDS。

IMDS之前的版本是V1,监听在http://169.254.169.254/metadata的路径上,只允许本机访问。但是在2019年的一次安全事件中,暴露出来如果EC2上的WEB SERVER被攻破则可以用类似跨站的方式去请求IMDS。于是在2020年起,EC2的IMDS版本从V1升级到了V2。V2的主要变化是:1)强制要求身份验证 2)禁止跨站转发调用。

在新创建EC2的时候,默认选项就是IMDS V2版本,其参数在EC2创建向导高级界面中可以看到。

IMDS可用于查询本机的多种信息。本文介绍几个常用的方法。

二、查询方法

1、手工获得查询Metadata的Token

由前文讲解的Metadata的IMDSv2的有关背景可知,当没有通过验证的时候,直接发起请求将会被拒绝。这里测试下执行如下命令。

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

可看到接口拒绝了访问。

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>401 - Unauthorized</title>
 </head>
 <body>
  <h1>401 - Unauthorized</h1>
 </body>
</html>

手工获取Token的命令是,其中21600是Token有效的时长,单位是秒。

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

执行后可看到返回信息如下:

AQCDAJsMlc_XBG86zhNWNaijqUycP2UejjGT36B6IGB1pCqAFEYRKuA==

以上就是IMDSv2版本需要的认证Token,有了这个Token才能获取Metadata信息。

2、查询当前EC2使用的IAM Role

我们将以上生成Token的命令组合带入,可直接生成查询结果。以下命令表示查询当前EC2绑定的IAM Profile和对应的Role。执行如下命令:

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/iam/info

返回结果如下:

....
....
{
  "Code" : "Success",
  "LastUpdated" : "2024-01-25T09:40:13Z",
  "InstanceProfileArn" : "arn:aws:iam::133129065110:instance-profile/PVRE-SSMOnboardingInstanceProfile-COQJA7c9df1o",
  "InstanceProfileId" : "AIPAR57Y4KKLO5VBATNGP"
* Closing connection

3、查询当前EC2绑定的Role使用的临时Token

执行如下命令:

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance

返回结果如下就是当前临时Token:

...
...
  "Code" : "Success",
  "LastUpdated" : "2024-01-25T09:40:53Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIARxxxxxxxxxxx",
  "SecretAccessKey" : "8oRIApz2sBtQqnlxxxxxxxxxxx",
  "Token" : "IQoJb3JpZ2luX2VjENL//////////
  wEaCXVzLXdlc3QtMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxETYhEvhD54mA==",
  "Expiration" : "2024-01-25T16:06:13Z"
* Closing connection

如上显示就是临时Token,这个Token大约6小时轮换一次,且上述输出结果也显示了过期时间。

4、其他一些有用的查询地址

  • 查询镜像ami-id:http://169.254.169.254/latest/meta-data/ami-id
  • 查询AZ:http://169.254.169.254/latest/meta-data/placement/availability-zone
  • 查询机型配置:http://169.254.169.254/latest/meta-data/instance-type 

三、参考资料

Instance metadata categories

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html

Instance identity roles

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-identity-roles.html

浅谈云上攻防:元数据服务带来的安全挑战

https://www.secrss.com/articles/31784