返回更新列表
新发布Sep 10, 2026

aws-security-assessment-solution v3.0.0

一个AWS工具,帮助您使用Prowler创建对您AWS账户的时间点评估。

分享

自助式安全评估解决方案 (v2.0)

网络安全对于许多 CIO、CISO 及其客户而言,始终是一个非常重要的话题和关注点。为应对这些重要关切,AWS 开发了一套核心服务,客户应使用这些服务来帮助保护其账户。Amazon GuardDutyAWS Security HubAWS Config 以及 AWS Well-Architected 审查可帮助客户在其 AWS 账户上保持强大的安全态势。随着越来越多的组织部署到云端,尤其是如果它们部署速度较快,且尚未实施推荐的 AWS 服务,则可能需要对云环境进行快速安全评估。

我们开发了一种经济实惠、易于部署、安全且快速的解决方案,为客户提供安全评估报告。这些报告使用开源项目 Prowler 生成。Prowler 基于 AWS 最佳实践执行即时安全评估,可帮助快速识别客户已部署环境中任何潜在的风险领域。如果您有兴趣持续进行这些评估,AWS 建议启用 Security Hub 的 基础安全最佳实践标准。如果您有兴趣将 Prowler 评估结果与 Security Hub 集成,可以按照 Prowler 文档 中的说明进行操作。

注意:Prowler 并非 AWS 拥有的解决方案。客户在运行此解决方案之前应独立审查 Prowler。与 Prowler 相关的任何依赖项都应保持最新。此解决方案通过 pip 包安装程序安装固定版本的 Prowler(当前为 5.41.0),以便 Prowler 输出格式的更改不会在无预警的情况下中断扫描。要升级到较新版本,请编辑 2-sat2-codebuild-prowler.yaml 中的 pip3 install prowler== 行。

📕 如需更详细的分步说明,请访问 SHIP Workshop 中的模块 2。

目录

概述

该解决方案通过 AWS CloudFormation 部署。部署后,将创建一个 AWS CodeBuild 项目和一个用于存储 Prowler 生成报告的 Amazon S3 存储桶。随后使用一个 AWS Lambda 函数来启动 AWS CodeBuild 项目。

参数(用户输入)默认值将在单个账户中运行基础扫描。但是,您可以选择不同的参数来执行更广泛的扫描或扫描多个账户。部署过程在不到 5 分钟内即可完成。该解决方案的 AWS CloudFormation 模板已提供在此 Github 仓库中供审查。

模板部署后,CodeBuild 项目将运行。默认评估大约需要 5 分钟完成。安全评估的完成时间将根据资源数量和所选的扫描选项而有所不同。评估结束后,报告将交付到所创建的 S3 存储桶。

架构图

参数

可通过更新 CloudFormation 参数来自定义 SATv2。本节总结了可用选项,并提供了包含更多信息的章节链接。

参数描述更多信息
ProwlerScanType指定要执行的扫描类型。选择 full 而不指定其他 ProwlerOptions 将执行完整扫描。要执行特定检查,请选择 Full 并在 ProwlerOptions 中附加 -c 扫描类型
MultiAccountScan如果要扫描组织中的所有账户,请将此设置为 true。您必须已部署前置模板以配置角色,或指定具有适当权限的其他 ProwlerRole。多账户扫描
Reporting如果要将 Prowler 报告汇总为单个 csv,请将此设置为 true。这在扫描多个账户时很有帮助。报告汇总
EmailAddress如果希望在评估完成时收到电子邮件,请指定一个地址。通知
高级参数
ConcurrentAccountScans对于多账户扫描,请指定要并发扫描的账户数。这对于拥有许多账户的大型组织很有用。选择超过三个会改变 CodeBuild 实例的大小,并可能产生额外费用。
CodeBuildTimeout设置 CodeBuild 作业的超时时间。默认值为 300 分钟(5 小时)。
MultiAccountListOverride指定以空格分隔的要扫描的账户列表。留空将扫描组织中的所有账户。如果要扫描特定账户,请确保已将上述 MultiAccountScan 参数设置为 true。如果您无法提供委派的 ListAccount 访问权限,则可以提供 MultiAccountListOverride 参数。多账户扫描
ProwlerOptions指定 Prowler 的参数。--role 和 ARN 将自动附加到您指定的参数末尾。这也可用于指定单个检查。完整扫描
ProwlerRoleProwler 应假定以执行扫描的角色。如果要指定具有不同权限的自定义角色,请更改此项。

部署

您可以使用此项目在 AWS Organizations 中的多个账户或单个账户中运行 Prowler。我们提供了使用 AWS CloudShell 或 AWS 控制台的说明。选择一个选项开始。

部署类型AWS CloudShellAWS 控制台
单账户链接链接
多账户链接链接

单账户扫描

要针对单个账户运行自助式安全评估解决方案 (SATv2),请按照以下说明操作。您可以选择使用 AWS CLI 或 AWS 控制台。

AWS CloudShell

显示步骤

部署解决方案

  1. 登录您的 AWS 账户。

  2. 在导航栏中,选择 AWS CloudShell

  3. 要下载 CloudFormation 模板,请输入以下命令。

    wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/2-sat2-codebuild-prowler.yaml
    
  4. 要创建用于暂存模板的 S3 存储桶,请输入以下命令。该模板大于 51,200 字节,因此 CloudFormation 要求将其上传到 S3 而不是内联传递。

    TEMPLATE_BUCKET=sat2-cfn-templates-$(aws sts get-caller-identity --query Account --output text)-$AWS_REGION
    aws s3 mb s3://$TEMPLATE_BUCKET --region $AWS_REGION
    
  5. 要部署 CloudFormation 模板,请输入以下命令。--s3-bucket 选项会在创建堆栈之前将模板上传到存储桶。

    aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml \
    --stack-name sat2 \
    --capabilities CAPABILITY_NAMED_IAM \
    --s3-bucket $TEMPLATE_BUCKET
    
  6. 堆栈创建完成后,您可以删除暂存存储桶。它仅用于将模板交给 CloudFormation。

    aws s3 rb s3://$TEMPLATE_BUCKET --force
    

AWS 控制台

显示步骤

部署解决方案

  1. 下载 2-sat2-codebuild-prowler.yaml CloudFormation 模板。
  2. 导航到 AWS CloudFormation 控制台
  3. 在导航窗格中,选择 堆栈
  4. 选择 创建堆栈
  5. 在指定模板下,选择 上传模板文件
  6. 选择您在步骤 1 中下载的 2-sat2-codebuild-prowler.yaml
  7. 选择 下一步
  8. 对于堆栈名称,输入 sat2
  9. 选择 下一步
  10. 在配置堆栈选项页面上,选择 下一步
  11. 在审查 SAS 页面上,选中 我确认 AWS CloudFormation 可能创建 IAM 资源。 复选框,然后选择 提交

多账户扫描

自助式安全评估解决方案 (SAT) 也支持多账户扫描。您必须将前置角色部署到要执行扫描的每个账户。要为多个账户运行 SATv2,请按照以下说明操作。您可以选择使用 AWS CLI 或 AWS 控制台。

这些说明假定您已具备堆栈集操作的前置条件。有关更多信息,请访问 AWS CloudFormation 用户指南

注意:StackSets 不适用于管理账户。要评估管理账户,请将 1-sat2-member-role 作为 CloudFormation 堆栈部署。

AWS CloudShell

显示步骤

步骤 1:部署前置角色

  1. 登录您的 AWS 管理账户。

  2. 在导航栏中,选择 AWS CloudShell

  3. 确定您将从哪个账户运行 Prowler 扫描。客户通常使用安全工具账户或审计账户。记下 ProwlerAccountID 参数的账户 ID。

  4. 要下载 CloudFormation 模板,请输入以下命令。

    wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/1-sat2-member-roles.yaml
    
  5. 通过 CloudFormation StackSets 部署 CloudFormation 模板。更新以下参数:

    • <aws-account-id> 替换为您将运行 Prowler 的账户 ID。
    • <region> 替换为您要部署模板的区域。
    aws cloudformation create-stack-set --template-body file://1-sat2-member-roles.yaml \
    --stack-set-name sat2-member-roles \
    --permission-model SERVICE_MANAGED \
    --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameters ParameterKey=ProwlerAccountID,ParameterValue=<aws-account-id> \
    --region <region>
    
  6. 使用以下命令为组织中的每个账户创建堆栈实例。您可以针对特定 OU 或根 OU。更新以下参数:

    • <root-ou> 替换为 组织根 ID
    • <region> 替换为您要部署模板的区域。
    aws cloudformation create-stack-instances --stack-set-name sat2-member-roles \
    --deployment-targets OrganizationalUnitIds='["<root-ou>"]' \
    --regions '["<region>"]' \
    --operation-preferences FailureTolerancePercentage=100,MaxConcurrentPercentage=100 \
    --region <region>
    
  7. 确定您的 Prowler 账户是否已有委派管理员或资源策略。只需一种选项即可,建议使用资源策略,因为它更精细。

    注意:GovCloud 中不提供资源策略,因此您需要使用委派管理员。

    7a. 您的 Prowler 账户可能已有委派。您可以使用以下命令进行检查:

    aws organizations list-delegated-administrators
    

    7b. 您的 Prowler 账户可能已有资源策略。您可以使用以下命令进行检查:

    aws organizations describe-resource-policy
    
  8. 如果您没有委派管理员或资源策略,可以使用以下命令添加适当的访问权限。

    注意:如果您无法提供委派的 ListAccount 访问权限,则可以在 2-sat2-codebuild-prowler 模板 中提供 MultiAccountListOverride 参数。

    注意:如果您使用 GovCloud,请使用步骤 8a 创建委派管理员。如果您使用商业区域,请使用步骤 8b 为 ListAccounts 提供最低权限访问。

    8a. 如果您还没有委派管理员,请使用以下命令委派管理员。将 <aws-account-id> 替换为您将运行 Prowler 的账户 ID。

    aws organizations register-delegated-administrator <aws-account-id>
    

    8b. 使用以下命令添加资源策略。

    • <aws-account-id> 替换为您将运行 Prowler 的账户 ID。

      aws organizations put-resource-policy --content \
      '{
          "Version": "2012-10-17",
          "Statement": [
          {
              "Sid": "Statement",
              "Effect": "Allow",
              "Principal": {
              "AWS": "arn:aws:iam::<aws-account-id>:root"
              },
              "Action": [
                  "organizations:ListAccounts",
                  "organizations:DescribeAccount",
                  "organizations:ListTagsForResource",
                  "organizations:ListParents",
                  "organizations:DescribeOrganizationalUnit"
      	    ],
              "Resource": "*"
          }
          ]
      }'
      

    注意:ListParentsDescribeOrganizationalUnit 用于填充发现结果中的 account_ou_uidaccount_ou_name 列。省略它们后,扫描的其余部分仍可正常工作,但这两列将返回为空。

步骤 2:部署 SATv2 解决方案

注意:确保您已切换到您指定将运行 Prowler 的账户。

  1. 要下载模板,请在 Prowler 账户 中打开 AWS CloudShell 并输入以下命令。

    wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/2-sat2-codebuild-prowler.yaml
    
  2. 要创建用于暂存模板的 S3 存储桶,请输入以下命令。该模板大于 51,200 字节,因此 CloudFormation 要求将其上传到 S3 而不是内联传递。

    TEMPLATE_BUCKET=sat2-cfn-templates-$(aws sts get-caller-identity --query Account --output text)-$AWS_REGION
    aws s3 mb s3://$TEMPLATE_BUCKET --region $AWS_REGION
    
  3. 在 Prowler 账户中部署模板。将 MultiAccountScan 设置为 true 以扫描组织中的所有账户。--s3-bucket 选项会在创建堆栈之前将模板上传到存储桶。

    aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml \
    --stack-name sat2-prowler \
    --capabilities CAPABILITY_NAMED_IAM \
    --s3-bucket $TEMPLATE_BUCKET \
    --parameter-overrides MultiAccountScan=true
    
  4. 堆栈创建完成后,您可以删除暂存存储桶。它仅用于将模板交给 CloudFormation。

    aws s3 rb s3://$TEMPLATE_BUCKET --force
    

AWS 控制台

显示步骤

步骤 1:部署前置角色

  1. 下载 1-sat2-member-roles.yaml2-sat2-codebuild-prowler.yaml 文件。

  2. 通过 CloudFormation StackSets 部署 CloudFormation 模板。更新以下参数:

    • 将 <aws-account-id> 替换为您将运行 Prowler 的账户 ID。
    • 将 <region> 替换为您要部署模板的区域。3. 导航至 AWS CloudFormation 控制台
  3. 在导航窗格中,选择 StackSets

  4. 选择 创建 StackSet

  5. 在权限部分,保留 服务管理权限 的选中状态。

  6. 在指定模板下,选择 上传模板文件

  7. 选择您在步骤 1-1 中下载的 1-sat2-member-roles.yaml

  8. 选择 下一步

  9. 对于堆栈名称,输入 sat2-member-role

  10. 对于参数,输入以下内容:

    • ProwlerAccountID - 您将运行 Prowler 的账户 ID。
  11. 选择 下一步

  12. 在配置 StackSet 选项页面,选择 下一步

  13. 在设置部署选项页面,输入以下内容:

    1. 对于 部署目标,保留 部署到组织 的选中状态。
    2. 对于 指定区域,选择 us-east-1
    3. 对于 区域并发,选择 并行
  14. 选择 下一步

  15. 审核 页面,勾选 我确认 AWS CloudFormation 可能创建 IAM 资源。 复选框,然后选择 提交

步骤 2:为 AWS Organizations 启用委派管理员

确定您是否已为希望部署 Prowler 的账户配置了委派管理员或已存在的资源策略。建议您从安全工具(审计)账户运行 Prowler。要更新或验证审计账户是否具有 ListAccounts 权限,请按照以下步骤操作。

  1. 导航至 AWS Organizations 控制台

  2. 在导航窗格中,选择 设置

  3. 对于 AWS Organizations 的委派管理员,包含以下语句。

    {
        "Version": "2012-10-17",
        "Statement": [
        {
            "Sid": "Statement",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::<aws-account-id>:root"
            },
            "Action": [
                    "organizations:ListAccounts",
                    "organizations:DescribeAccount",
                    "organizations:ListTagsForResource",
                    "organizations:ListParents",
                    "organizations:DescribeOrganizationalUnit"
    		    ],
            "Resource": "*"
        }
        ]
    }
    

    注意:ListParentsDescribeOrganizationalUnit 用于填充发现结果中的 account_ou_uidaccount_ou_name 列。省略它们后,其余扫描仍可正常工作,但这两列将返回为空。

步骤 3:部署 SATv2 解决方案

  1. 在您将运行该工具的账户(ProwlerAccountID)中,导航至 AWS CloudFormation 控制台

  2. 在导航窗格中,选择 堆栈

  3. 选择 创建堆栈

  4. 在指定模板下,选择 上传模板文件

  5. 选择您在步骤 1-1 中下载的 2-sat2-codebuild-prowler.yaml

  6. 选择 下一步

  7. 对于堆栈名称,输入 sat2-prowler

  8. 在参数部分,对于 MultiAccountScan,选择 true

  9. 您可以选择启用报告功能,以在单个 csv 文件中获取所有账户的摘要。对于 Reporting,选择 true

  10. 选择 下一步

  11. 在配置堆栈选项页面,选择 下一步

  12. 在审核页面,勾选 我确认 AWS CloudFormation 可能创建 IAM 资源。 复选框,然后选择 提交

查看结果

解决方案部署完成后,一个 Lambda 函数将启动 CodeBuild 项目。CodeBuild 项目构建完成后,Prowler 结果将上传到所创建的 Amazon S3 存储桶。如果您配置了通知,则 Prowler 扫描完成时会收到一封电子邮件。如果您配置了报告,则会在 /reports 文件夹中获得一个合并的 csv 文件。

如果您未配置电子邮件提醒,可以从 CodeBuild 控制台 监控进度。

要查看结果,请按照以下步骤操作。

  1. 在您部署 Prowler 的账户中导航至 Amazon S3 控制台。

  2. 选择以 sat2-prowler-prowlerfindingsbucket- 开头的存储桶。

  3. 选择所需输出格式的文件夹,然后选择要查看的运行对应的 scan_date=scan_time= 文件夹。

    每种输出格式都有其自己的顶级文件夹,每次运行都会在其下方的 scan_date=YYYY-MM-DD/scan_time=HHMMSS 子文件夹中写入数据。该时间是扫描开始的 UTC 时间:

    csv/scan_date=2026-09-01/scan_time=204955/         Prowler 的 CSV 发现结果(按原样写入)
    html/scan_date=2026-09-01/scan_time=204955/        每个账户的 HTML 报告
    json/scan_date=2026-09-01/scan_time=204955/        每个账户的 JSON
    ocsf-json/scan_date=2026-09-01/scan_time=204955/   每个账户的 OCSF JSON
    parquet/scan_date=2026-09-01/scan_time=204955/     Athena 查询的副本
    compliance/scan_date=2026-09-01/scan_time=204955/  合规性 CSV(生成时)
    reports/                                           合并的 CSV 和仪表板
    

    每次运行都有其自己的文件夹,因此再次运行该解决方案时,新发现结果绝不会与旧发现结果混淆,包括在同一天多次运行的情况。之前的运行会被保留,以便您进行比较。

  4. 对于每个账户,将有 4 种文件类型(csv、html、json、json-ocsf),格式为 prowler-output-<aws-account-id>-<datetime>

  5. 选择其中一个 html 对象。

  6. 选择 打开

    Prowler 输出

  7. 将打开一个新窗口,显示您的报告。您可以使用筛选器来识别发现结果并确定其优先级。

    Prowler 发现结果

SATv2 仪表板(推荐)

如果您启用了报告功能,则报告文件夹中将包含一个静态 html 仪表板。

  1. 选择 satv2-dashboard.html 对象,然后选择 打开
  2. 选择合并的 csv,然后选择 操作使用预签名 URL 共享

    注意:请勿与任何人共享您的预签名 URL。预签名 URL 使用安全凭证授予下载对象的限时权限。该 URL 可以在浏览器中输入,或由程序用于下载对象。预签名 URL 使用的凭证是生成该 URL 的 AWS 用户的凭证。有关更多信息,请查看使用预签名 URL 共享对象。

  3. 对于 分钟数,输入 1
  4. 将 URL 粘贴到 satv2-dashboard.html 页面中。
  5. img/satv2-dashboard.png 中查看示例仪表板输出。

Prowler 仪表板

Prowler 内置了一个用于查看结果的仪表板。要使用 Prowler 仪表板,必须在本地安装 Prowler,并且必须将 Prowler 的结果下载到本地。

您必须拥有 AWS 命令行界面(CLI)和有效的凭证。有关更多信息,请查看 AWS 命令行界面用户指南

  1. 安装 Prowler。有关更多信息,请查看 Prowler 安装说明

    pip install prowler
    
  2. 获取 Amazon S3 存储桶的名称。存储桶名称位于 CloudFormation 控制台中,作为 ProwlerFindingsBucket 资源。或者,导航至 S3 控制台,查找格式为 {stack_name}-prowlerfindingsbucket-{ID} 的存储桶。

  3. 从 S3 下载 CSV 和合规性数据。如果您未运行完整扫描,则可能没有合规性数据。将 {bucket_name} 替换为您的存储桶名称,将 {scan_date}{scan_time} 替换为您要加载的运行,例如 2026-09-01204955。要列出可用的运行,请使用 aws s3 ls s3://{bucket_name}/csv/scan_date={scan_date}/

    aws s3 sync s3://{bucket_name}/compliance/scan_date={scan_date}/scan_time={scan_time}/ output/compliance/
    aws s3 sync s3://{bucket_name}/csv/scan_date={scan_date}/scan_time={scan_time}/ output/
    

    注意:一次仅同步一个运行。Prowler 仪表板读取 output/*.csv,不会搜索子文件夹,因此将 scan_date= 文件夹本身复制到 output/ 中会产生一个空仪表板。同时加载两个运行会导致每个发现结果显示两次。

  4. 运行仪表板。使用以下命令运行仪表板。默认情况下,它将在 http://127.0.0.1:11666/ 上启动。

    prowler dashboard
    

扫描类型

默认情况下,SAT2 将运行包含 13 项检查的基本扫描。您可以通过选择不同的 ProwlerScanType 参数值来选择运行中级或完整检查。

例如,使用中级扫描选项对单个账户进行扫描将使用以下命令:```bash aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml
--stack-name sat2-prowler
--capabilities CAPABILITY_NAMED_IAM
--s3-bucket $TEMPLATE_BUCKET
--parameter-overrides ProwlerScanType=Intermediate

>注意:`--s3-bucket` 选项是必需的,因为该模板大于 51,200 字节,这是 CloudFormation 接受内联内容的最大限制。`$TEMPLATE_BUCKET` 是在上述 CloudShell 部署步骤中创建的暂存存储桶。它适用于本 README 中每个 `aws cloudformation deploy` 示例。

检查项会频繁添加,要查看最新检查项,请运行 `prowler aws --list-checks` 命令。以下为每个检查级别提供了示例。

### 基础扫描
要查看检查项列表,请查阅 [基础检查](https://github.com/awslabs/aws-security-assessment-solution/blob/main/checks/basic_checks.txt)。

- 手动检查 - 维护最新的联系信息。
- 查找过时的 Lambda 运行时。
- 确保 CloudTrail 在所有区域中已启用。
- 确保 AWS Config 在所有区域中已启用。
- 确保没有安全组允许从 0.0.0.0/0 或 ::/0 入站到任何端口。
- 检查 GuardDuty 是否已启用。
- 确保 IAM 密码策略要求至少包含一个小写字母。
- 确保 IAM 密码策略要求至少包含一个数字。
- 确保 IAM 密码策略要求至少包含一个符号。
- 确保 IAM 密码策略要求至少包含一个大写字母。
- 确保根账户已启用 MFA。
- 确保访问密钥每 90 天或更短时间内轮换。
- 确保没有向 Everyone 或任何 AWS 用户开放的 S3 存储桶。

### 中级扫描
要查看检查项列表,请查阅 [中级检查](https://github.com/awslabs/aws-security-assessment-solution/blob/main/checks/intermediate_checks.txt)。

此扫描将向 Prowler 扫描选项添加 `--severity critical high`。选择此项后,Prowler 将运行所有导致严重或高严重性的安全检查。

### 完整扫描
要查看检查项列表,请查阅 [完整检查](https://github.com/awslabs/aws-security-assessment-solution/blob/main/checks/full_checks.txt)。

此选项不会向 Prowler 扫描添加任何额外参数。它将导致 Prowler 运行 500 多项检查。

您也可以使用完整扫描,以您希望的任何方式自定义扫描。

对于 **ProwlerScanType**,选择 **Full**。

对于 **ProwlerOptions**,追加检查项。例如,要仅检查 GuardDuty 是否已启用,请输入:

`aws --ignore-exit-code-3 -c guardduty_is_enabled`

## 通知

您可以在部署 CloudFormation 模板时,在 EmailAddress 参数中可选地指定电子邮件地址。这将创建一个 SNS 主题,并在 CodeBuild 作业完成时发送电子邮件。

这在运行较长时间的扫描或跨多个账户扫描时可能很有帮助。

例如,使用电子邮件通知的单账户扫描将使用以下命令:```bash
aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml \
--stack-name sat2-prowler \
--capabilities CAPABILITY_NAMED_IAM \
--s3-bucket $TEMPLATE_BUCKET \
--parameter-overrides [email protected]

设置或不设置可选的 EmailAddress 参数,您都可以在 CodeBuild 控制台中查看进度。

  1. 导航至 CodeBuild 控制台

  2. 在导航窗格中,在 Build 下选择 Build projects

  3. 选择以 ProwlerCodeBuild- 开头的构建项目。

  4. 在 Build history 下,您将看到最近一次运行。

    CodeBuild project

  5. (可选)您可以选择 Start build,使用部署解决方案时选择的选项再次运行扫描。

报告摘要

您可以选择启用报告功能,将多次 Prowler 扫描结果汇总到单个文件中。当您在 AWS Organization 中的多个账户上运行 Prowler 时,这可能很有帮助。报告摘要功能默认处于关闭状态。要启用报告功能,请在部署 CloudFormation 模板时将 Reporting 参数设置为 true。这将创建一个 Athena WorkGroup、一个 Glue 表,并自动运行查询以整合结果。汇总的 csv 文件位于与 Prowler 结果相同的 S3 存储桶中的 /reports 文件夹内。

如果在启用报告功能时指定了电子邮件地址,则在 Athena 查询完成时,您将收到第二封电子邮件。

Athena 表的构建方式

Athena 查询的是 parquet/ 中的发现结果副本,而非 Prowler 的 CSV。CodeBuild 项目在将每个 CSV 上传前会先将其转换为 Parquet,而 Glue 表 prowler 指向 parquet/

之所以进行转换,是因为 Prowler 5.17.0 及更高版本在其检查元数据中携带多行 Markdown,因此 DESCRIPTIONRISKREMEDIATION_* 字段包含换行符。Prowler 会正确引用这些字段,但 Athena 通过 Hive 的 TextInputFormat 读取 CSV,该格式在任何 SerDe 运行之前就会按换行符拆分记录。因此,基于 CSV 的表会按物理行返回一行,而不是按发现结果返回一行,并且会静默丢弃第一个多行字段之后的列。Parquet 不使用换行符作为记录边界,因此文本可以完整保留。Parquet 还会大幅压缩重复的修复文本,从而降低查询成本:一组 116 MB 的 CSV 大约会变成 3 MB 的 Parquet。

csv/ 文件夹保持 Prowler 写入时的原样,因此 Prowler 仪表板和任何现有的 CSV 工具都能继续正常工作。

扫描历史与重复项

该表按 scan_date scan_time 进行分区,因此解决方案的每次运行都会获得自己的分区。由此产生两点影响:

  • /reports 中的汇总 CSV 仅涵盖最近一次运行,因此重新运行解决方案绝不会重复计算发现结果,且不再存在的发现结果也不会残留在报告中。
  • 较早的运行仍可查询。scan_datescan_time 是普通列,因此您可以比较不同运行之间的结果。Prowler scan trend 保存的查询即执行此操作,每次运行对应一行。

仅按日期分区是不够的。同一天的第二次扫描会写入同一分区,其发现结果将与较早运行的发现结果合并,而非替换它们。较新扫描不再报告的发现结果(例如由于资源被删除、账户离开组织、成员角色停止工作或扫描类型被缩小)仍会出现在报告中,并看起来像是当前的。

新分区会自动注册:报告 Lambda 在运行整合查询之前会执行 MSCK REPAIR TABLE,因此无需调度爬网程序,也无需手动添加任何内容。

如果您编写自己的 Athena 查询,请将其限制为单次运行,否则您将一次性聚合存储桶中的所有扫描。两个键均为固定宽度,因此按连接后的顺序比较它们可按时间顺序排列各次运行:```sql SELECT severity, count(*) FROM "{bucket_name}"."prowler" WHERE status = 'FAIL' AND concat(scan_date, scan_time) = ( SELECT max(concat(scan_date, scan_time)) FROM "{bucket_name}"."prowler" ) GROUP BY severity

要查询某一天的所有运行结果,只需单独按 `scan_date` 过滤即可。

>注意:如果您正在升级使用早期仅含 `scan_date` 布局的部署,升级前的结果在新表中不可见,因为其 S3 路径没有 `scan_time=` 层级。数据在 S3 中保持不变。您可以等待下一次扫描重新填充表,或将旧文件移动到 `scan_time=` 文件夹中,例如 `aws s3 mv s3://{bucket_name}/parquet/scan_date={scan_date}/ s3://{bucket_name}/parquet/scan_date={scan_date}/scan_time=000000/ --recursive`,然后在 Athena 中运行 `MSCK REPAIR TABLE prowler`。

例如,启用报告和电子邮件警报的多账户扫描将使用以下命令:```bash
aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml \
--stack-name sat2-prowler \
--capabilities CAPABILITY_NAMED_IAM \
--s3-bucket $TEMPLATE_BUCKET \
--parameter-overrides MultiAccountScan=true Reporting=true [email protected]

报告架构图

创建了两个示例保存查询:

保存的查询显示内容
Prowler 组织摘要最近一次扫描中,每个被评估账户的失败检查项。
Prowler 扫描趋势按扫描日期和严重程度划分的失败检查项,用于比较不同时间的运行结果。

要查看并运行查询,请按照以下步骤操作:

  1. 导航到 Amazon Athena 控制台。

  2. 选择以 sat2-prowler-* 开头的工作组。

  3. 选择 保存的查询 选项卡。

  4. 通过选择 ID 来选择要运行的查询。

    Athena 保存的查询

  5. 选择 运行 来运行查询。

    Athena 保存的查询结果

常见问题 (FAQ)

  1. 是否有费用?
    • 此解决方案设计为在 AWS 免费套餐 内运行。
    • 对于 Amazon CodeBuild,客户每月可获得 100 分钟的构建时间。
    • 对于已超出 CodeBuild、S3 和 Lambda 免费套餐的客户,此解决方案的运行成本不到 1 美元。
  2. 这是一个持续监控和报告工具吗?
    • 不是。这是一次性评估,我们建议客户使用 AWS Security Hub 进行持续评估。
  3. 这是否与 GuardDuty、Security Hub、CloudWatch 等集成?
    • 不集成。您可以按照这篇博客中的说明将 Prowler 与 Security Hub 集成。
  4. 如何修复报告中的问题?
    • 通常,报告中应描述问题并提供易于识别的修正方法。请同时查阅每个工具(Prowler)的公开文档。如果这还不够,请联系您的 AWS 客户团队或 AWS 支持 以帮助您理解报告并努力修复问题。
  5. Prowler 为 SATv2 报告哪些发现?
    检查项缓解措施
    检查 Lambda 函数的 API 操作调用是否被 CloudTrail 记录。CloudTrail 是 AWS 账户级别的配置。无论是否使用 SATv2,都应启用 CloudTrail。
    为 CloudFormation 堆栈启用终止保护SATv2 旨在某个时间点运行,然后被删除。如果堆栈被终止,发现结果仍会保留在 S3 存储桶中。
    检查 CloudWatch 日志组是否受 AWS KMS 保护。日志组数据在 CloudWatch Logs 中始终加密。默认情况下,CloudWatch Logs 对静态日志数据使用服务端加密。为节省成本,未配置客户管理的 KMS 密钥。
    检查 CloudWatch 日志组是否具有特定天数的保留策略。日志组保留期按设计设置为 7 天。此检查查找保留期少于一年的日志组。
    检查 S3 存储桶是否启用了 KMS 加密。所有 Amazon S3 存储桶默认配置了加密,对象通过使用 Amazon S3 托管密钥(SSE-S3)的服务端加密自动加密。为节省成本,未配置客户管理的 KMS 密钥。
    检查 S3 存储桶是否未启用 MFA 删除。Prowler 评估结果可以重新生成,不需要 MFA 删除。
    检查 S3 存储桶是否启用了对象锁定Prowler 评估结果可以重新生成,不需要 S3 对象锁定。
    检查 S3 存储桶是否启用了服务器访问日志记录Prowler 评估结果不需要服务器访问日志记录。

清理

运行解决方案后,您应删除 CloudFormation 堆栈以移除不再需要的资源。包含 Prowler 扫描结果的 S3 存储桶将保留。

要从您的账户中移除安全评估解决方案,请按照以下步骤操作。

  1. 在您运行该工具的账户(ProwlerAccountID)中导航到 AWS CloudFormation 控制台

  2. 在导航窗格中,选择 堆栈

  3. 选择 sat2-prowler 堆栈。

  4. 选择 删除

如果您部署了成员角色 StackSet 来扫描多个账户,请按照以下步骤操作。

  1. 在您创建成员角色 StackSet 的账户中导航到 AWS CloudFormation 控制台

  2. 在导航窗格中,选择 StackSets

  3. 选择 sat2-member-roles StackSet。

  4. 选择 操作,然后选择 从 StackSet 删除堆栈

  5. 指定创建 StackSet 时相同的 AWS OU ID

  6. 对于 指定区域,选择 添加所有区域

  7. 选择 下一步,然后 提交

更改完成后,您可以删除 StackSet。

  1. 选择 sat2-member-roles StackSet。

  2. 选择 操作,然后选择 删除 StackSet

如果您想删除包含扫描结果的 Amazon S3 存储桶,请按照 Amazon S3 用户指南 中的步骤删除对象和存储桶。如果您再次运行该解决方案,将为您的结果创建一个新的 S3 存储桶。

安全

有关更多信息,请参阅 CONTRIBUTING

许可证

本项目根据 Apache-2.0 许可证授权。

分类