IMDSv2 强制执行:即将登陆您所在的区域!
2024年3月25日,AWS发布了一项新功能,帮助在区域级别默认对新启动的实例强制执行IMDSv2。这是一个期待已久的功能,但仍有一些特别之处。
IMDSv2 简介
IMDSv2是AWS于2019年11月发布的一项安全机制,紧随备受关注的Capital One数据泄露事件之后。该事件是由一个类似于SSRF的漏洞引起的,并导致美国参议员Ron Wyden致信AWS,询问为客户提供了哪些保护措施。以下是我从这封信中复制的几段摘录。
许多安全专家公开推测,Capital One的黑客利用了SSRF漏洞,这是专家们多年来一直警告的缺陷。据亚马逊所知,是否使用了SSRF攻击来获取Capital One的客户数据?
在过去两年中,有多少亚马逊客户因其亚马逊云计算服务器遭受SSRF攻击而遭到入侵?
亚马逊是否向其云计算客户提供了关于SSRF攻击可能性的任何指导,特别是针对亚马逊元数据服务的攻击?
有趣的是,“利用SSRF漏洞滥用AWS元数据服务”是我在2017年写的首批安全主题博客文章之一,甚至在我开始从事安全工作之前。Jon Hencinski和Scott Piper在2018年和2019年也对此发出过警告。
当强制执行时,IMDSv2可以防止SSRF漏洞,否则攻击者可能通过这些漏洞从实例元数据服务(IMDS)窃取凭据。
2022年末和2021年末的过去研究表明,此类漏洞是公开记录的云安全事件最常见的原因之一。因此,IMDSv2被视为在AWS环境中强制执行的关键云安全控制措施。
关于IMDSv2的更深入解释,请参阅非常出色的Nick Frichette(碰巧也是我的同事)撰写的优秀文章《保护EC2实例元数据服务》。我也在我的演讲“Fantastic AWS Hacks and Where to Find Them”中讨论过它。
发展历程
到目前为止,强制执行IMDSv2相对比较麻烦。
最初,您必须在实例级别强制执行,通过在实例本身或关联的EC2启动模板或启动配置上设置 metadata_options.http_tokens="required" 选项。虽然您可以使用 ec2:MetadataHttpTokens 条件键来限制 ec2:RunInstances 的能力,仅允许用于IMDSv2强制的实例,但这仍然是一个高度手动的过程,并且是不安全默认设置的典型例子。
2022年10月,AWS发布了一项新功能,允许我们声明“默认情况下,对从此特定AMI启动的所有实例强制执行IMDSv2”。
|
|
这方便了他们在2023年3月推出默认强制执行IMDSv2的Amazon Linux 2023 AMI。由于发布时未包含Terraform支持,我借此机会向Terraform AWS提供商提交了我的第一个(小型)贡献。
2023年11月,AWS控制台UI开始在非常流行的“快速启动”EC2屏幕中默认强制执行IMDSv2。
现在,2024年3月,AWS引入了这项新功能,允许默认对某个区域中所有新实例强制执行IMDSv2!
但历史回顾到此为止——让我们看看这个功能是如何工作的。
认识 GetInstanceMetadataDefaults 和 ModifyInstanceMetadataDefaults
这两个新的API调用于3月25日出现在我的RSS订阅中,随后是官方公告。正如其名所示,这两个新功能允许您在区域级别设置默认的EC2实例元数据选项。并不完全是文档中所说的“账户级别”,因为这是一个区域设置。
|
|
这里重要的是 HttpTokens。将其设置为 required 意味着“强制执行IMDSv2”。因此,下面的代码片段是您希望在所有账户和区域中运行的内容:
|
|
在撰写本文时,AWS CLI尚未支持这些API调用,因此您必须使用可靠的Python或其他SDK。
更新:AWS CLI在1.32.70版本(3月25日发布)和2.15.33版本(3月27日发布)中增加了支持:
|
|
如果您关注了前面的“历史”部分,您可能已经注意到我们现在可以在区域、AMI和实例级别设置IMDS。这些设置如何相互作用?AWS提供了一个非常清晰的文档,可以总结为“实例设置优先(如果已设置),区域设置其次(如果已设置),AMI设置第三(如果已设置),默认不强制执行IMDSv2”。
实现Terraform支持
任何没有IaC支持的云功能对于从业者来说帮助有限,他们中的许多人每天都要处理大量的区域和账户。
经过几个小时的痛苦调试Go代码和与CI斗争,拉取请求准备好了。现在它已被合并并在v5.43.0中发布。您现在可以使用 aws_ec2_instance_metadata_defaults 资源:
|
|
总结
这个新功能对于每天努力强制执行IMDSv2的从业者来说非常有用。这是在环境中启用安全默认设置的好方法——但默认情况下仍然留给我们不安全的默认设置。根据AWS的公告,这种情况可能很快就会改变:
2024年中 – 新发布的Amazon EC2实例类型将默认仅使用IMDSv2。为了过渡支持,您仍然能够在启动时或在实例运行后启用/打开IMDSv1,而无需重启或停止/启动。
同样重要的是要记住,此功能是关于默认设置的。使用它来默认强制执行IMDSv2并不能阻止任何人启动允许使用IMDSv1的实例。为此,您可以使用SCP或使用 ec2:MetadataHttpTokens 条件键进行显式拒绝。
敬请关注,感谢阅读!