创建一份包含多个 Prowler 安全调查结果的合并报告 AWS 账户 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建一份包含多个 Prowler 安全调查结果的合并报告 AWS 账户

由 Mike Virgilio (AWS)、Andrea Di Fabio () 和 Jay Durga (AWS) 创作 AWS

摘要

Prowler (GitHub) 是一个开源命令行工具,可以帮助您评估、审计和监控您的 Amazon Web Services (AWS) 账户是否符合安全最佳实践。在这种模式下,您可以将 Prowler 部署到组织 AWS 账户 中由管理的集中管理中 AWS Organizations,然后使用 Prowler 对组织中的所有帐户进行安全评估。

虽然部署和使用 Prowler 进行评测的方法有很多,但该解决方案旨在实现快速部署、全面分析组织中的所有账户或已定义的目标客户,以及安全调查发现的可访问报告。按此解决方案,当 Prowler 完成对组织中所有账户的安全评测时,它会合并结果。它还会过滤掉任何预期错误消息,例如与限制 Prowler 无法扫描通过 AWS Control Tower配置的账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶相关的错误。筛选后的合并结果将在此操作说明中包含的 Microsoft Excel 模板中报告。您可以使用此报告确定组织中安全控件的潜在改进。

该解决方案的设计考虑了以下内容:

  • 这些 AWS CloudFormation 模板减少了在这种模式下部署 AWS 资源所需的工作量。

  • 您可以在部署时调整 CloudFormation 模板和 prowler_scan.sh 脚本中的参数,以便为您的环境自定义模板。

  • 通过并行处理 AWS 账户、汇总结果、合并报告和建议的补救措施以及自动生成的可视化效果来优化 Prowler 的评估和报告速度。

  • 用户不需要监控扫描进度。评估完成后,将通过亚马逊简单通知服务 (AmazonSNS) 主题通知用户,以便他们可以检索报告。

  • 报告模板可帮助您仅阅读和评测整个组织相关结果。

先决条件和限制

先决条件

  • AWS 账户 用于托管安全服务和工具,作为中组织的成员帐户进行管理 AWS Organizations。在这种模式中,此账户被称为 安全账户

  • 在安全账户中,必须具有具有出站互联网访问权限的私有子网。有关说明,请参阅私VPC有子网中的服务器和 NAT Amazon Virtual Private Cloud (AmazonVPC) 文档。您可以使用在公有子网中配置的NAT网关来建立互联网接入。

  • 对 AWS Organizations 管理账户或拥有委托管理员权限的账户的访问权限 CloudFormation。有关说明,请参阅 CloudFormation 文档中的注册委托管理员

  • 在 AWS Organizations 和之间启用可信访问 CloudFormation。有关说明,请参阅 CloudFormation 文档 AWS Organizations中的使用启用可信访问

限制

  • 目标 AWS 账户 必须作为一个组织在中进行管理 AWS Organizations。如果您不使用 AWS Organizations,则可以针对您的环境更新 IAM-ProwlerExecRole .yaml CloudFormation 模板和 prowler_scan.sh 脚本。相反,您可以提供要在其中运行脚本的 AWS 账户 IDs和区域的列表。

  • 该 CloudFormation 模板旨在将亚马逊弹性计算云 (AmazonEC2) 实例部署到具有出站互联网访问权限的私有子网中。 AWS Systems Manager 代理(SSM代理)需要出站访问权限才能访问 AWS Systems Manager 服务端点,并且您需要出站访问权限才能克隆代码存储库和安装依赖项。如果要使用公有子网,则必须修改 p rowler-resources.yaml 模板以将弹性 IP 地址与实例相关联。 EC2

产品版本

  • Prowler 版本 4.0 或更高版本

架构

部署至集中式安全账户中的 Prowler 的架构图。

此图显示以下流程:

  1. 使用会话管理器(一种功能) AWS Systems Manager,用户对EC2实例进行身份验证并运行 prowler_scan.sh 脚本。此 Shell 脚本执行步骤 2-8。

  2. 该EC2实例担任该ProwlerEC2RoleIAM角色,该角色授予访问 S3 存储桶和在组织中其他账户中ProwlerExecRoleIAM担任角色的权限。

  3. 该EC2实例在组织的管理账户中ProwlerExecRoleIAM扮演角色,并生成组织中的账户列表。

  4. 该EC2实例在组织的成员账户(架构图中称为工作负载账户)中扮演ProwlerExecRoleIAM角色,并在每个账户中执行安全评估。调查结果以CSV和HTML文件形式存储在EC2实例上。

    注意

    HTML文件是 Prowler 评估的输出。由于的性质HTML,它们不会在此模式中进行串联、处理或直接使用。但是,这些可能对个人账户报告审核很有用。

  5. 该EC2实例处理所有CSV文件以删除已知的预期错误,并将剩余的发现结果合并到一个CSV文件中。

  6. 该EC2实例将个人账户结果和汇总结果打包到一个 zip 文件中。

  7. EC2实例将 zip 文件上传到 S3 存储桶。

  8. EventBridge 规则会检测文件上传,并使用 Amazon SNS 主题向用户发送电子邮件,通知他们评估已完成。

  9. 用户从 S3 存储桶下载 zip 文件。用户将结果导入 Excel 模板,并查看结果。

工具

AWS 服务

  • 亚马逊弹性计算云 (AmazonEC2) 在中提供可扩展的计算容量 AWS Cloud。您可以根据需要启动任意数量的虚拟服务器,并快速扩展或缩减它们。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如, AWS Lambda 函数、使用API目的地的HTTP调用端点或其他 AWS 账户中的事件总线。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Organizations是一项账户管理服务,可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。

  • 亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWS Systems Manager 可帮助您管理在 AWS Cloud中运行的应用程序和基础设施。它简化了应用程序和资源管理,缩短了检测和解决操作问题的时间,并帮助您大规模安全地管理 AWS 资源。此模式使用会话管理器,这是 Systems Manager 的一项功能。

其他工具

  • Prowler 是一款开源命令行工具,可帮助您评估、审计和监控您的账户是否符合 AWS 安全最佳实践以及其他安全框架和标准。

代码存储库

此模式的代码可通过 Prowler 存储库在 GitHub 多账户安全评估中找到。代码存储库包含以下文件:

  • prowler_scan.sh — 此 bash 脚本用于并行启动多个 AWS 账户 Prowler 安全评估。按照 Prowler-Resources.yaml 中的定义 CloudFormationtemplate,此脚本会自动部署到实例上的文件夹。usr/local/prowler EC2

  • Prowler-resources.yaml — 您可以使用此 CloudFormation 模板在组织的安全账户中创建堆栈。此模板部署了该账户所需所有资源,以支持此解决方案。此堆栈必须在 IAM-ProwlerExecRole .yaml 模板之前部署。我们不建议您将这些资源部署至托管关键生产工作负载的账户中。

    注意

    如果此堆栈被删除并重新部署,则必须重建ProwlerExecRole堆栈集才能重建角色之间的跨账户依赖关系。IAM

  • IAM-ProwlerExecRole .yaml — 您可以使用此 CloudFormation 模板创建堆栈集,该堆栈集可在组织中的所有账户(包括管理账户)中部署该ProwlerExecRoleIAM角色。

  • prowler-report-template.xlsm — 您可以使用此 Excel 模板来处理 Prowler 的调查结果。报告中的数据透视表提供搜索功能、图表与综合调查发现。

操作说明

任务描述所需技能

克隆代码存储库。

  1. 在命令行界面中,将工作目录更改为要存储示例文件的位置。

  2. 输入以下命令:

    git clone https://github.com/aws-samples/multi-account-security-assessment-via-prowler.git

AWS DevOps

审核模板。

  1. 在克隆的存储库中,打开 Prowler-resources .yaml 和-.yaml 文件。IAM ProwlerExecRole

  2. 查看由这些模板创建的资源,并按您的环境需要调整模板。有关更多信息,请参阅 CloudFormation 文档中的使用模板

  3. 保存并关闭 Prowler-resources.yaml 和-.yaml 文件。 IAM ProwlerExecRole

AWS DevOps
任务描述所需技能

在安全账户中预置资源。

使用 prowler-resources.yaml 模板,您可以创建一个 CloudFormation 堆栈,用于在安全账户中部署所有必需的资源。有关说明,请参阅 CloudFormation 文档中的创建堆栈。部署此模板时应注意以下几点:

  1. 指定模板页面,选择模板已就绪,然后上传 prowler-resources.yaml 文件。

  2. 指定堆栈详细信息页面上,在堆栈名称框里输入 Prowler-Resources

  3. 参数部分中,输入以下内容:

    • VPCId— VPC 在账户中选择一个。

    • SubnetId ­- 选择可以访问 Internet 的私有子网。

      注意:如果您选择公有子网,则不会为该EC2实例分配公有 IP 地址,因为默认情况下, CloudFormation 模板不会预配置和附加弹性 IP 地址。

    • InstanceType — 根据并行评测的数量选择实例大小:

      • 对于 10,请选择 r6i.large

      • 对于 12,请选择 r6i.xlarge

      • 对于 14-18,请选择 r6i.2xlarge

    • InstanceImageId — 保留 Amazon Linux 的默认设置。

    • KeyPairName— 如果您使用SSH进行访问,请指定现有密钥对的名称。

    • PermittedSSHInbound— 如果您使用访问权限SSH,请指定允许的CIDR区块。如果您不使用SSH,请保留默认值127.0.0.1

    • BucketName – 默认值为 prowler-output-<accountID>-<region>。您可以根据需要进行修改。如果指定自定义值,则账户 ID 和区域会自动追加到指定值。

    • EmailAddress— 指定当 Prowler 完成评估并将.zip 文件上传到 S3 存储桶时SNS收到亚马逊通知的电子邮件地址。

      注意:必须在 Prowler 完成评估之前确认SNS订阅配置,否则将不会发送通知。

    • IAMProwlerEC2Role— 除非您的命名惯例要求此IAM角色使用不同的名称,否则请保留默认值。

    • IAMProwlerExecRole— 保持默认值,除非在部署 IAM-ProwlerExecRole .yaml 文件时使用其他名称。

    • Parallelism — 指定要执行的并行评测的数量。确保 InstanceType 参数中的值支持此数量的并行评测。

    • FindingOutput — 如果要排除及格结果,请选择 FailOnly。这大大缩小了输出大小,并将重点放在可能需要解决的检查。如果要纳入合格结果,请选择 FailAndPass

  4. 在 “查看” 页面上,选择 “以下资源需要能力:[:: AWSIAM: Role]”,然后选择 “创建堆栈”。

  5. 成功创建堆栈后,在 CloudFormation 控制台的输出选项卡上,复制 ProwlerEC2Role Amazon 资源名称 (ARN)。ARN稍后在部署 IAM-ProwlerExecRole .yaml 文件时会使用它。

AWS DevOps

在成员账户中配置IAM角色。

在 AWS Organizations 管理账户或具有委托管理员权限的账户中 CloudFormation,使用 IAM-ProwlerExecRole .yaml 模板创建 CloudFormation 堆栈集。堆栈集在组织中的所有成员账户中部署该ProwlerExecRoleIAM角色。有关说明,请参阅 CloudFormation 文档中的使用服务管理权限创建堆栈集。部署此模板时应注意以下几点:

  1. 在 “准备模板” 下,选择 “模板已准备就绪”,然后上传 IAM-ProwlerExecRole .yaml 文件。

  2. 在 “指定 StackSet 详细信息” 页面上,为堆栈集命名IAM-ProwlerExecRole

  3. 参数部分中,输入以下内容:

    • AuthorizedARN— 输入ProwlerEC2RoleARN您在创建Prowler-Resources堆栈时复制的。

    • ProwlerExecRoleName— 除非在部署 Prowler-Resources.yaml 文件时使用了其他名称,否则保留默认 ProwlerExecRole 值。

  4. 权限下方,选择服务托管权限

  5. 设置部署选项页面,在部署目标下,选择部署到组织并接受所有默认选项。

    注意:如果要将堆栈同时部署至所有成员账户,请将最大并发账户数容错率设置为较高的值,例如 100

  6. 在 “部署区域” 下,选择 Prowler EC2 实例的部署 AWS 区域 位置。由于IAM资源是全球性的,而不是区域性的,所以这会将IAM角色部署到所有活跃区域。

  7. 在 “审阅” 页面上,选择 “我确认 AWS CloudFormation 可能会使用自定义名称创建IAM资源”,然后选择 “创建” StackSet。

  8. 监控堆栈实例选项卡(用于单个账户状态)和操作选项卡(用于整体状态)以确定部署何时完成。

AWS DevOps

在管理账户中配置IAM角色。

使用 IAM-ProwlerExecRole .yaml 模板,您可以创建一个 CloudFormation 堆栈,用于在组织的管理账户中部署ProwlerExecRoleIAM角色。您之前创建的堆栈集不会在管理账户中部署该IAM角色。有关说明,请参阅 CloudFormation 文档中的创建堆栈。部署此模板时应注意以下几点:

  1. 在 “指定模板” 页面上,选择 “模板已准备就绪”,然后上传 IAM-ProwlerExecRole .yaml 文件。

  2. 指定堆栈详细信息页面上的堆栈名称框中,输入 IAM-ProwlerExecRole

  3. 参数部分中,输入以下内容:

    • AuthorizedARN— 输入ProwlerEC2RoleARN您在创建Prowler-Resources堆栈时复制的。

    • ProwlerExecRoleName— 除非在部署 Prowler-Resources.yaml 文件时使用了其他名称,否则保留默认 ProwlerExecRole 值。

  4. 在 “查看” 页面上,选择 “以下资源需要能力:[:: AWSIAM: Role]”,然后选择 “创建堆栈”。

AWS DevOps
任务描述所需技能

运行扫描。

  1. 登录到组织中的安全账户。

  2. 使用会话管理器连接到您之前EC2配置的 Prowler 实例。有关说明,请参阅使用会话管理器连接至您的 Linux 实例。如果您无法连接,请参阅此模式的故障排除部分。

  3. 导航到 usr/local/prowler,然后打开 prowler_scan.sh 文件。

  4. 根据您的环境需要,查看和修改此脚本中的可调参数和变量。有关自定义选项的更多信息,请参阅脚本开头的注释。

    例如,您可以修改脚本以指定要扫描的 AWS 账户 IDs或,也可以引用包含这些参数的外部文件 AWS 区域 ,而不是从管理账户获取组织中所有成员账户的列表。

  5. 保存和关闭 prowler_scan.sh 文件。

  6. 输入以下命令。这会运行 prowler_scan.sh 脚本。

    sudo -i screen cd /usr/local/prowler ./prowler_scan.sh

    请注意以下几点:

    • 屏幕命令允许脚本在连接超时或失去控制台访问权限时继续运行。

    • 扫描开始后,您可以通过 Ctrl+A D 强制分离屏幕。 屏幕已分离,您可以关闭实例连接并允许评测继续进行。

    • 要恢复已分离的会话,请连接至实例,输入 sudo -i,然后输入 screen -r

    • 若要监控个人账户评测的进度,您可以导航至 usr/local/prowler 目录并输入命令 tail -f output/stdout-<account-id>

  7. 等待 Prowler 完成所有账户扫描。该脚本可同时评测多个账户。当所有账户的评测都完成后,如果您在部署 Prowler-Resources.yaml 文件时指定了电子邮件地址,则会收到通知。

AWS 管理员

检索 Prowler 调查发现。

  1. prowler-output-<accountID>-<region> 存储桶下载 prowler-output-<assessDate>.zip 文件。有关说明,请参阅 Amazon S3 文档中的下载对象

  2. 删除存储桶中的所有对象,包含您下载的文件。这是成本优化的最佳实践,也是为了确保您可以随时删除Prowler-Resources CloudFormation 堆栈。有关说明,请参阅 Amazon S3 文档中的删除对象

将军 AWS

停止实EC2例。

为防止在实例空闲时计费,请停止运行 Prowler 的EC2实例。有关说明,请参阅 Amazon EC2 文档中的停止和启动您的实例

AWS DevOps
任务描述所需技能

导入调查发现。

  1. 在 Excel 中,打开 prowler-report-template.xlsx 文件,然后选择 Prowler 工作表。CSV

  2. 删除所有示例数据,其中包括标题行。如果系统询问您是否要删除与数据相关的查询,请选择。删除查询可能会影响 Excel 模板中数据透视表的功能。

  3. 提取从 S3 存储桶所下载的 zip 文件的内容。

  4. 在 Excel 中,打开 prowler-fullorgresults-accessdeniedfiltered.txt。我们建议您使用此文件,因为已经删除了最常见的、不可操作的错误,例如与尝试扫描资源相关的Access Denied错误。 AWS Control Tower 如果您想要未经熟悉爱你的结果,请改为打开 prowler-fullorgresults.txt 文件。

  5. 选择 A 列。

  6. 如果使用 Windows 系统,请输入 Ctrl+C;或如果您使用MacOS,请输入 Cmd+C,这将所有数据复制到剪贴板。

  7. 在 Excel 报告模板的 Prowler CSV 工作表中,选择单元格 A1。

  8. 如果使用 Windows 系统,请输入 Ctrl+V;或如果您使用MacOS,请输入 Cmd+V,这将调查发现复制到剪贴板。

  9. 确认选中所有包含粘贴数据的单元格。如否,请选择 A 列。

  10. 数据选项卡,选择文本到列

  11. 在向导中,执行以下操作:

    • 在步骤 1 中,选择分隔

    • 在步骤 2 中,对于分隔符,选择分号。在数据预览窗格,确认数据已分成列。

    • 在步骤 3,选择完成

  12. 确认文本数据跨多列分隔。

  13. 以新名称保存 Excel 报告。

  14. 搜索并删除调查发现中的任何 Access Denied 错误。有关如何以编程方式删除这些错误的说明,请参阅其他信息部分中的以编程方式删除错误

将军 AWS

完成报告。

  1. 选择调查发现工作表,然后选择单元格 A17。此单元格是数据透视表标头

  2. 在功能区的 “PivotTable 工具” 下,选择 “分析”,然后在 “刷新” 下选择 “全部刷新”。这将使用新数据集更新数据透视表。

  3. 默认情况下,Excel 无法正确显示 AWS 账户 数字。若要修复数字格式,请执行以下操作:

    • 调查发现工作表上,打开 A 列的上下文(右键单击)菜单,然后选择设置单元格格式

    • 选择数字,然后在小数位中输入 0

    • 选择确定

    注意:如果 AWS 账户 数字以一个或多个零开头,Excel 会自动删除零。如果您在报告中看到的账号少于 12 位数,则在号码开头以零补充缺失位数。

  4. (可选)您可以折叠字段,以使结果更易于阅读。执行以下操作:

    • 调查发现工作表,如果将光标移到第 18 行和第 19 行之间的行(关键标题和第一个查找结果之间的间距),则光标图标将变为指向下方的小箭头。

    • 单击选择所有调查发现字段。

    • 打开上下文(右键单击)菜单,找到展开/折叠,然后选择折叠

  5. 有关评测的详细信息,请查看调查发现严重性通过失败工作表。

将军 AWS
任务描述所需技能

更新 Prowler。

如果要将 Prowler 更新至最新版本,请执行以下操作:

  1. 使用会话管理器连接到 Prowler 的EC2实例。有关说明,请参阅使用会话管理器连接至您的 Linux 实例

  2. 输入以下 命令。

    sudo -i pip3 install --upgrade prowler
将军 AWS

更新 prowler_scan.sh 脚本。

如果要将 prowler_scan.sh 脚本更新至存储库中的最新版本,请执行以下操作:

  1. 使用会话管理器连接到 Prowler 的EC2实例。有关说明,请参阅使用会话管理器连接至您的 Linux 实例

  2. 输入以下 命令。

    sudo -i
  3. 导航至 Prowler 脚本目录。

    cd /usr/local/prowler
  4. 输入以下命令,以存储本地脚本,以便您可以将自定义更改合并到最新版本中。

    git stash
  5. 输入以下命令,下载最新版本的脚本。

    git pull
  6. 输入以下命令,将自定义脚本与最新版本的脚本合并。

    git stash pop
注意

您可能会收到与任何不在 GitHub 存储库中的本地生成的文件相关的警告,例如查找报告。只要 prowler_scan.sh 显示本地隐藏的更改已合并,就可以忽略这些内容。

将军 AWS
任务描述所需技能

删除所有已部署资源。

您可以将资源保留在账户中。如果您在EC2实例未使用时将其关闭,并保持 S3 存储桶为空,则可以降低维护资源以备将来扫描的成本。

如果要取消预配所有资源,请执行以下操作:

  1. 删除管理账户中预置的 IAM-ProwlerExecRole 堆栈。有关说明,请参阅 CloudFormation 文档中的删除堆栈

  2. 删除在组织的管理账户或委托管理员账户中预置的 IAM-ProwlerExecRole 堆栈集。有关说明,请参阅 CloudFormation 文档中的删除堆栈集

  3. 删除 prowler-output S3 存储桶中的所有对象。有关说明,请参阅 Amazon S3 文档中的删除对象

  4. 删除安全账户中预置的 Prowler-Resources 堆栈。有关说明,请参阅 CloudFormation 文档中的删除堆栈

AWS DevOps

故障排除

事务解决方案

无法使用会话管理器连接到EC2实例。

SSM代理必须能够与 Systems Manager 端点通信。执行以下操作:

  1. 验证部署EC2实例的子网是否可以访问互联网。

  2. 重启 EC2 实例。

部署堆栈集时, CloudFormation 控制台会提示您这样做Enable trusted access with AWS Organizations to use service-managed permissions

这表示未在 AWS Organizations 和之间启用可信访问 CloudFormation。部署服务托管堆栈集需要可信访问权限。选择该按钮以启用受信任的访问。有关更多信息,请参阅 CloudFormation 文档中的启用可信访问

相关资源

AWS 文档

其他资源

其他信息

以编程方式删除错误

如果结果包含 Access Denied 错误,则应将其从调查发现中删除。这些错误通常是由于外部影响权限导致 Prowler 无法评测特定资源造成的。例如,在查看通过配置的 S3 存储桶时,某些检查会失败。 AWS Control Tower您可通过编程方式提取这些结果,并将筛选后的结果另存为新文件。

以下命令删除包含单个文本字符串(一种模式)行,然后将结果输出至新文件中。

  • 适用于 Linux 或 macOS (Grep)

    grep -v -i "Access Denied getting bucket" myoutput.csv > myoutput_modified.csv
  • 适用于 Windows (PowerShell)

    Select-String -Path myoutput.csv -Pattern 'Access Denied getting bucket' -NotMatch > myoutput_modified.csv

以下命令删除与多个文本字符串匹配的行,然后将结果输出至新文件。

  • 对于 Linux 或 macOS(在字符串之间使用转义管道)

    grep -v -i 'Access Denied getting bucket\|Access Denied Trying to Get' myoutput.csv > myoutput_modified.csv
  • 适用于 Windows(在字符串之间使用逗号)

    Select-String -Path myoutput.csv -Pattern 'Access Denied getting bucket', 'Access Denied Trying to Get' -NotMatch > myoutput_modified.csv

报告示例

下图是 Prowler 合并调查发现报告中的调查发现工作表示例。

Prowler 扫描结果报告中的“调查发现”选项卡示例

下图是 Prowler 合并调查发现报告中的 Pass Fail 工作表的示例。(默认情况下,输出中不包括通过结果。)

Prowler 扫描结果报告中的“通过失败” 选项卡示例

下图是 Prowler 合并调查发现报告中严重性工作表的示例。

Prowler 扫描结果报告中的“严重性” 选项卡示例