一、背景
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
浅谈云上攻防:元数据服务带来的安全挑战