AWS IMDSv2区域级强制实施全面解析

本文详细介绍了AWS新推出的区域级IMDSv2强制实施功能,包括其技术实现原理、API调用方法、Terraform支持,以及如何通过这一重要安全机制防范SSRF漏洞攻击。

IMDSv2强制实施:即将登陆您所在的区域!

IMDSv2简介

IMDSv2是AWS于2019年11月发布的安全机制,旨在应对类似Capital One数据泄露事件中暴露的SSRF漏洞。该事件促使美国参议员Ron Wyden致信AWS,询问为客户提供了哪些保护措施。

当强制实施时,IMDSv2能够防范SSRF漏洞,防止攻击者从实例元数据服务(IMDS)窃取凭据。2021年末和2022年末的研究表明,此类漏洞是公开记录的云安全事件最常见的原因之一。

发展历程

到目前为止,强制实施IMDSv2相对困难。最初,用户必须在实例级别通过设置metadata_options.http_tokens="required"选项来强制执行,或者通过相关的EC2启动模板或启动配置。

2022年10月,AWS发布了一项新功能,允许用户声明"默认情况下,从此特定AMI启动的所有实例都强制实施IMDSv2":

1
2
3
4
5
6
aws ec2 register-image \
    --name my-image \
    --root-device-name /dev/xvda \
    --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} \
    --architecture x86_64 \
    --imds-support v2.0

这使得AWS能够在2023年3月推出默认强制实施IMDSv2的Amazon Linux 2023 AMI。

2023年11月,AWS控制台UI在非常流行的"快速启动"EC2屏幕中开始默认强制实施IMDSv2。

现在,2024年3月,AWS引入了这项新功能,允许在区域级别默认对所有新实例强制实施IMDSv2!

认识GetInstanceMetadataDefaults和ModifyInstanceMetadataDefaults

这两个新的API调用于3月25日出现在RSS订阅中,随后是官方公告。正如其名称所示,这两个API允许您在区域级别设置默认的EC2实例元数据选项。

1
2
3
4
5
6
7
client.modify_instance_metadata_defaults(
    HttpTokens='optional'|'required'|'no-preference',
    HttpPutResponseHopLimit=123,
    HttpEndpoint='disabled'|'enabled'|'no-preference',
    InstanceMetadataTags='disabled'|'enabled'|'no-preference',
    DryRun=True|False
)

这里重要的部分是HttpTokens。将其设置为required意味着"强制实施IMDSv2"。因此,下面的代码是您希望在所有账户和区域中运行的:

1
2
3
4
import boto3

ec2_client = boto3.client('ec2')
ec2_client.modify_instance_metadata_defaults(HttpTokens='required')

在撰写本文时,AWS CLI尚未支持这些API调用,因此您必须使用Python或其他SDK。

更新:AWS CLI在1.32.70版本(3月25日发布)和2.15.33版本(3月27日发布)中增加了支持:

1
aws ec2 modify-instance-metadata-defaults --http-tokens required

实现Terraform支持

任何没有IaC支持的云功能对于每天处理大量区域和账户的从业者来说都难以使用。作为一个重度Terraform用户,我确保在问题中跟踪这个需求,并迅速开始自己实现这个新的Terraform资源。

经过几个小时的Go代码调试和与CI的斗争,拉取请求已准备就绪。它现在已被合并并在v5.43.0中发布。您现在可以使用aws_ec2_instance_metadata_defaults资源:

1
2
3
4
5
6
resource "aws_ec2_instance_metadata_defaults" "imdsv2" {
  http_tokens                 = "required" # non-default
  instance_metadata_tags      = "disabled"
  http_endpoint               = "enabled"
  http_put_response_hop_limit = 1
}

总结

这个新功能对于每天努力强制实施IMDSv2的从业者非常有用。这是在环境中启用安全默认设置的好方法——但默认情况下仍然保留不安全的默认设置。根据AWS的公告,这种情况可能很快就会改变:

“2024年中 - 新发布的Amazon EC2实例类型将默认仅使用IMDSv2。为了支持过渡,您仍然能够在启动时或在实例运行时启用/打开IMDSv1,无需重启或停止/启动。”

同样重要的是要记住,这个功能是关于默认设置的。使用它来默认强制实施IMDSv2并不会阻止任何人启动允许使用IMDSv1的实例。为此,您可以使用SCP或使用ec2:MetadataHttpTokens条件键的显式拒绝。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计