IMDSv2强制实施:即将覆盖您所在区域!
2025年1月8日发布 / 2024年3月28日更新
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年发出警告:
滥用AWS元数据服务已成为每周发生的事件。——Scott Piper (@0xdabbad00) 2018年9月3日
#blueteamtips 攻击者可通过从EC2实例元数据服务转储凭据来提升AWS权限。这是一个(模拟)攻击案例,攻击者curl元数据服务,识别使用了IAM角色EC2DeveloperRole并获取临时凭据。——Jon Hencinski (@jhencinski) 2019年4月4日
IMDSv2在强制实施时,可防护SSRF漏洞,防止攻击者从实例元数据服务(IMDS)泄露凭据。
2022年底和2021年底的研究表明,此类漏洞是公开记录的云安全事件最常见原因之一。因此,IMDSv2被视为AWS环境中必须实施的关键云安全控制措施。
如需深入了解IMDSv2,请参阅Nick Frichette(恰巧是我同事)的精彩文章《保护EC2实例元数据服务》。我也在演讲“Fantastic AWS Hacks and Where to Find Them”中讨论过此话题。
发展历程
至今,强制实施IMDSv2仍相对繁琐。
最初,必须在实例级别通过设置metadata_options.http_tokens="required"选项来强制执行,该选项可设置在实例本身、关联的EC2启动模板或启动配置上。虽然可以使用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 feed中,随后很快发布了官方公告。顾名思义,这两个功能允许您在区域级别设置默认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支持的云功能对实践者来说帮助有限,尤其是每天处理大量区域和账户的从业者。
作为重度Terraform用户,我确保在问题中跟踪此需求,并迅速尝试自己实现这个新的Terraform资源,参考了有用的HashiCorp贡献者指南。
经过几小时痛苦的Go代码调试和CI斗争,拉取请求准备就绪。现已合并并在v5.43.0中发布。您现在可以使用aws_ec2_instance_metadata_defaults资源:
|
|
总结
此新功能对每天努力强制实施IMDSv2的实践者非常有用。这是在环境中启用安全默认值的绝佳方式——但默认情况下仍留给我们不安全的默认设置。根据AWS公告,这可能很快改变:
2024年中 – 新发布的Amazon EC2实例类型将默认仅使用IMDSv2。为支持过渡,您仍能在启动时或启动后在实例上启用/打开IMDSv1,无需重启或停止/启动。
同样重要的是记住,此功能关乎默认设置。使用它默认强制IMDSv2并不会阻止任何人启动允许使用IMDSv1的实例。为此,您可以使用SCP或使用ec2:MetadataHttpTokens条件键显式拒绝。
敬请关注,感谢阅读!