通过在 AWS EC2 上自动升级到更安全的实例元数据服务 v2 (IMDSv2) 来防止 SSRF 攻击。
目的和功能
工程团队可能在 AWS 中拥有种类繁多的计算基础设施,需要保护它们免受利用元数据服务的特定漏洞的攻击。如果使用了任何 IAM 或实例启动时需要用户数据信息,则实例上必须运行元数据服务。限制实例的攻击面对于防止通过窃取该服务提供的信息在您的环境中进行横向移动至关重要。过去许多著名的攻击都利用了这一特定服务来利用附加到实例的角色,或转储可通过元数据服务访问的敏感数据。Metabadger 可以帮助识别您在哪里以及如何使用实例元数据服务,同时赋予您减少任何不必要的攻击杠杆的能力,从而降低您在 EC2 中操作时的整体风险水平。
使用此工具可能会影响您的 AWS 计算基础设施,因为并非所有服务和应用程序都能在没有元数据服务或仅使用版本 2 的情况下正常工作。在生产环境中部署时要谨慎,并制定回滚计划,以防出现异常情况。Metabadger 内置了使用 -v1 标志回滚到默认版本 1 的能力,您可以使用它快速将实例回滚到使用默认版本。理想情况下,您应该先在非生产环境中运行此工具并更新元数据版本,作为应用前的试验场。
步骤 1
首先,我们想要发现特定 AWS 区域中元数据服务的整体使用情况。Metabadger 将评估您凭据指向的 /.aws/credentials 文件中或当前假定角色所在区域的使用状态。如果您希望更改到当前配置以外的其他区域,也可以在运行 discover-metadata 命令时指定 --region 标志。一旦您清楚了解实例运行的是哪个版本以及服务是启用还是禁用,您就能制定出更加明确的加固行动方案。请注意,您可以在此处找到每个元数据选项的具体含义 这里。
步骤 2
切换到服务 v2 版本时应评估的一个方面是 IAM 角色的使用情况。Metabadger 让您能够识别某个区域中可能已经使用了 IAM 角色的实例。discover-role-usage 命令将输出附加了角色的实例列表。如果您有很多使用角色的实例,在将服务更新到 v2 时应采取预防措施,以确保工作负载的整体功能不受影响。
步骤 3
完成初步发现和评估后,您现在可以创建分阶段的方法来加固计算基础设施,使其使用元数据服务的 v2 版本,或在不需要的地方禁用它。harden-metadata 命令默认允许您更新特定区域中的所有实例。您也可以使用 --tags 标志传递实例标签,或传入包含要应用配置的实例 CSV 的输入文件。一旦您对 v2 进行了适当的更新并在不使用服务的地方禁用了它,您可以重新使用步骤 1 中的项目进行评估,以确认您的环境已被锁定。如果您有某些不想更新的实例,可以通过 --exclusion 标志按标签或实例 ID 排除它们。
Metabadger 需要一个具有以下权限的 IAM 角色或凭据:
ec2:ModifyInstanceAttribute
ec2:DescribeInstances
在对实例元数据服务进行更改时,您应谨慎行事,并遵循 AWS 关于如何安全升级到版本 2 的额外指南。Metabadger 旨在协助您完成此过程,以进一步保护您在 AWS 中的计算基础设施。
通过 pip 安装
pip3 install --user metabadger
通过 Github 安装
$ git clone https://github.com/salesforce/metabadger
$ cd metabadger
$ pip install -e .
$ metabadger
Usage: metabadger [OPTIONS] COMMAND [ARGS]...
Metabadger is an AWS Security Tool used for discovering and hardening the
Instance Metadata service.
Options:
--version Show the version and exit.
--help Show this message and exit.
Commands:
cloudwatch-metrics Pull CloudWatch Metrics for MetadataNoToken usage
disable-metadata Disable the IMDS service on EC2 instances
discover-metadata Discover summary of IMDS service usage within EC2
discover-role-usage Discover summary of IAM role usage for EC2
harden-metadata Harden the AWS instance metadata service from v1 to v2
cloudwatch-metrics
直接通过 AWS CloudWatch 中的 MetadataNoToken 指标拉取您对 IMDSv1 的使用情况信息。此命令将显示过去一小时内正在积极使用 v1 服务的实例。请注意,运行此命令时,您应具有查看 CloudWatch 指标的 IAM 权限。
选项:
-a, --all-region 拉取所有可用区域的 CloudWatch 指标
-r, --region TEXT 指定执行此命令的 AWS 区域
-t, --time-period INTEGER CloudWatch 时间周期(秒),用于跟踪 IMDS v1 指标
-p, --profile TEXT 指定 AWS IAM 配置文件
--help 显示此消息并退出
discover-metadata
您整体实例元数据服务使用情况的摘要,包括使用的版本和总体强制百分比。使用这些数字将帮助您了解元数据使用的整体加固状况以及您在何处强制使用 v2 还是 v1。
选项:
-a, --all-region 提供 AWS 账户中所有可用区域的元数据摘要
-j, --json 以 JSON 格式获取元数据摘要
-r, --region TEXT 指定执行此命令的 AWS 区域
-p, --profile TEXT 指定 AWS IAM 配置文件
discover-role-usage
实例及其使用的角色摘要,这将让您清楚了解在对元数据服务本身进行更新时必须采取的谨慎程度。
选项:
-p, --profile TEXT 指定 AWS IAM 配置文件
-r, --region TEXT 指定执行此命令的 AWS 区域
harden-metadata
修改实例以使用元数据 v1 或 v2 的能力,并通过干运行模式了解将修改多少实例。
选项:
-a, --all-region 更新您账户中所有区域的 IMDS
-e, --exclusion 排除标志将应用于除指定的标签或实例之外的所有内容
-d, --dry-run 干运行加固元数据更改
-v1, --v1 强制使用元数据服务的 v1 版本
-i, --input-file PATH 要加固 IMDS 的实例 CSV 文件路径
-t, --tags TEXT 应用加固设置的逗号分隔标签列表
-r, --region TEXT 指定执行此命令的 AWS 区域
-p, --profile TEXT 指定 AWS IAM 配置文件
disable-metadata
使用此命令完全禁用实例上的元数据服务。
选项:
-e, --exclusion 排除标志将应用于除指定的标签或实例之外的所有内容
-d, --dry-run 干运行禁用元数据服务
-i, --input-file PATH 要禁用 IMDS 的实例 CSV 文件路径
-t, --tags TEXT 应用加固设置的逗号分隔标签列表
-r, --region TEXT 指定执行此命令的 AWS 区域
-p, --profile TEXT 指定 AWS IAM 配置文件
Metabadger 所做的所有更改都将记录到工作目录中名为 metabadger.log 的文件中。该文件将包含工具更改元数据服务时每个操作的以下信息: