网络安全仍然是许多 CIO、CISO 及其客户非常关注的重要话题。为应对这些重要关切,AWS 开发了一组核心服务,客户可使用这些服务来帮助保护其账户。Amazon GuardDuty、AWS Security Hub、AWS Config 和 AWS Well-Architected 审查有助于客户在其 AWS 账户上保持强大的安全态势。随着越来越多的组织部署到云中,特别是如果它们快速部署且尚未实施推荐的 AWS 服务,则可能需要对云环境进行快速安全评估。
我们开发了一种廉价、易于部署、安全且快速的解决方案,为客户提供安全评估报告。这些报告是使用开源项目 Prowler 生成的。Prowler 基于 AWS 最佳实践执行时间点安全评估,有助于快速识别客户部署环境中任何潜在的风险领域。如果您有兴趣持续进行这些评估,AWS 建议启用 Security Hub 的 基础安全最佳实践标准。如果您有兴趣将 Prowler 评估结果与 Security Hub 集成,您可以按照 Prowler 文档 中的说明进行操作。
注意:Prowler 不是 AWS 拥有的解决方案。客户应在运行此解决方案之前独立审查 Prowler。与 Prowler 相关的任何依赖项都应保持最新。此解决方案会安装 pip 包安装程序提供的最新版本。
📕 如需更详细的分步说明,请访问 SHIP 研讨会 中的模块 2。
该解决方案使用 AWS CloudFormation 进行部署。部署后,会创建一个 AWS CodeBuild 项目和一个 Amazon S3 存储桶,用于存储 Prowler 生成的报告。然后使用 AWS Lambda 函数启动 AWS CodeBuild 项目。
参数(用户输入)的默认值将在单个账户中运行基础扫描。但是,您可以选择不同的参数来运行更广泛的扫描或扫描多个账户。部署过程需要不到 5 分钟即可完成。该解决方案的 AWS CloudFormation 模板已提供在此 GitHub 存储库中供审查。
模板部署后,CodeBuild 项目将运行。默认评估大约需要 5 分钟才能完成。安全评估完成的时间将取决于资源数量和所选的扫描选项。评估结束后,报告将传送到所创建的 S3 存储桶。

SATv2 可以通过更新 CloudFormation 参数进行自定义。本节总结了可用选项,并提供了包含更多信息的章节链接。
您可以使用此项目在 AWS Organization 中跨多个账户运行 Prowler,也可以在单个账户中运行。我们提供了使用 AWS CloudShell 或 AWS 控制台的说明。选择一个选项开始。
要针对单个账户运行自助安全评估解决方案(SATv2),请按照以下说明操作。您可以选择使用 AWS CLI 或 AWS 控制台。
登录您的 AWS 账户。
在导航栏中,选择 AWS CloudShell。
要下载 CloudFormation 模板,请输入以下命令。
wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/2-sat2-codebuild-prowler.yaml
要部署 CloudFormation 模板,请输入以下命令。
aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml --stack-name sat2 --capabilities CAPABILITY_NAMED_IAM
自助安全评估解决方案(SAT)也支持多账户扫描。您必须在要执行扫描的每个账户中部署一个先决条件角色。要运行 SATv2 进行多账户扫描,请按照以下说明操作。您可以选择使用 AWS CLI 或 AWS 控制台。
这些说明假设您已经具备执行堆栈集操作的先决条件。有关更多信息,请访问 AWS CloudFormation 用户指南。
注意:StackSets 不适用于管理账户。要评估管理账户,请将 1-sat2-member-role 作为 CloudFormation Stack 部署。
登录您的 AWS 管理账户。
在导航栏中,选择 AWS CloudShell。
确定您将从哪个账户运行 Prowler 扫描。客户通常使用安全工具账户或审计账户。记下用于 ProwlerAccountID 参数的账户 ID。
要下载 CloudFormation 模板,请输入以下命令。
wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/1-sat2-member-roles.yaml
通过 CloudFormation StackSets 部署 CloudFormation 模板。更新以下参数:
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>
使用以下命令为组织中的每个账户创建堆栈实例。您可以针对特定的 OU 或根 OU。更新以下参数:
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>
下载 1-sat2-member-roles.yaml 和 2-sat2-codebuild-prowler.yaml 文件。
通过 CloudFormation StackSets 部署 CloudFormation 模板。更新以下参数:
在导航窗格中,选择 StackSets。
选择 Create StackSet。
对于 Permissions,保留 Service-managed permissions 选中状态。
在 Specify template 下,选择 Upload a template file。
选择您在步骤 1-1 中下载的 1-sat2-member-roles.yaml。
选择 Next。
对于 Stack name,输入 sat2-member-role。
对于 Parameters,输入以下内容:
选择 Next。
在 Configure StackSet options 页面中,选择 Next。
在 Set deployment options 中,输入以下内容:
选择 Next。
在 Review 页面中,选中 I acknowledge that AWS CloudFormation might create IAM resources. 复选框,然后选择 Submit。
确定您要在其中部署 Prowler 的账户是否已有委托管理员或资源策略。建议从您的安全工具(审计)账户运行 Prowler。要更新或验证审计账户是否具有 ListAccounts 权限,请按照以下步骤操作。
部署解决方案后,Lambda 函数会启动 CodeBuild 项目。CodeBuild 项目构建完成后,Prowler 结果将上传到所创建的 Amazon S3 存储桶。如果您配置了通知,当 Prowler 扫描完成时,您将收到一封电子邮件。如果您配置了报告,您将在 /reports 文件夹中获得一个整合后的 csv 文件。
如果您没有配置电子邮件提醒,则可以从 CodeBuild 控制台 监控进度。
要查看结果,请按照以下步骤操作。
在您部署 Prowler 的账户中,导航到 Amazon S3 控制台。
选择以 sat2-prowler-prowlerfindingsbucket- 开头的存储桶。
选择包含扫描日期和时间的文件夹。
对于每个账户,将有 4 种文件类型(csv、html、json、json-ocsf),格式为 prowler-output-<aws-account-id>-<datetime>。
选择其中一个 html 对象。
选择 打开。

新窗口将打开,显示您的报告。您可以使用过滤器来识别并确定发现的优先级。

如果您启用了报告功能,则报告文件夹中将包含一个静态 html 仪表板。
注意:请勿与任何人共享您的预签名 URL。预签名 URL 使用安全凭证授予限时下载对象的权限。该 URL 可以在浏览器中输入,也可以由程序用于下载对象。预签名 URL 使用的凭证是生成该 URL 的 AWS 用户的凭证。有关更多信息,请参阅使用预签名 URL 共享对象。
Prowler 内置了一个仪表板,用于查看结果。要使用 Prowler 仪表板,必须在本地安装 Prowler,并且必须将 Prowler 的结果下载到本地。
您必须拥有 AWS 命令行界面 (CLI) 和有效的凭证。有关更多信息,请参阅 AWS 命令行界面用户指南。
安装 Prowler。有关更多信息,请参阅 Prowler 安装说明。
pip install prowler
获取 Amazon S3 存储桶的名称。存储桶的名称可以在 CloudFormation 控制台中作为 ProwlerFindingsBucket 资源找到。或者,导航到 S3 控制台,查找格式为 {stack_name}-prowlerfindingsbucket-{ID} 的存储桶。
从 S3 下载 CSV 和合规性数据。如果您未进行完整扫描,可能没有合规性数据。将 {bucket_name} 替换为您存储桶的名称。
aws s3 sync s3://{bucket_name}/compliance/ output/compliance/
aws s3 sync s3://{bucket_name}/csv/ output/
运行仪表板。使用以下命令运行仪表板。默认情况下,它将在 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
--parameter-overrides ProwlerScanType=Intermediate
检查项会频繁添加,要查看最新检查项,请运行 `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 天或更短时间轮换
- 确保没有 S3 存储桶对 Everyone 或任何 AWS 用户开放。
### 中级扫描
要查看检查项列表,请查阅[中级检查](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 \
--parameter-overrides [email protected]
无论是否设置了可选的 EmailAddress 参数,您都可以在 CodeBuild 控制台中查看进度。

您可以选择启用报告功能,将多个 Prowler 扫描 csv 文件汇总为一个文件。这在跨 AWS 组织中的多个账户运行 Prowler 时可能很有用。报告摘要功能默认关闭。要启用报告,请在部署 CloudFormation 模板时将 Reporting 参数设置为 true。这将创建一个 Athena WorkGroup、一个 Glue 表,并自动运行查询以合并结果。汇总后的 csv 文件位于与 Prowler 结果相同的 S3 存储桶的 /reports 文件夹中。
如果在启用报告时指定了电子邮件地址,则当 Athena 查询完成时,您将收到第二封电子邮件。
例如,启用了报告和电子邮件警报的多账户扫描将使用以下命令:
aws cloudformation deploy \
--stack-name ProwlerStack \
--template-file ProwlerSASTemplate.yaml \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM \
--parameter-overrides \
EnableReporting=true \
[email protected]```bash
aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml
--stack-name sat2-prowler
--capabilities CAPABILITY_NAMED_IAM
--parameter-overrides MultiAccountScan=true Reporting=true EmailAddress=[email protected]

示例创建了一个已保存查询,该查询统计所有被评估账户中未通过的检查项。如需查看并运行此查询,请执行以下步骤:
1. 导航至 Amazon Athena 控制台。
2. 选择以 `sat2-prowler-*` 开头的工作组。
3. 选择 **已保存查询** 选项卡。
4. 通过选择 **ID** 来选中要运行的查询。

5. 选择 **运行** 以执行查询。

## 常见问题解答 (FAQ)
1. 是否产生费用?
+ 此解决方案旨在 [AWS 免费套餐](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all) 内运行。
+ 对于 [Amazon CodeBuild](https://aws.amazon.com/free/devops/?p=ft&z=subnav&loc=3),客户每月可获得 100 分钟的构建时长。
+ 对于已经超出 CodeBuild、S3 和 Lambda 免费套餐的客户,运行此解决方案的成本低于 1 美元。
2. 这是否是一个持续监控和报告工具?
+ 不是。这是一次性评估,我们建议客户使用 [AWS Security Hub](https://aws.amazon.com/security-hub/) 进行持续评估。
3. 是否与 GuardDuty、Security Hub、CloudWatch 等集成?
+ 不集成。您可以按照 [此博客](https://aws.amazon.com/blogs/security/use-aws-fargate-prowler-send-security-configuration-findings-about-aws-services-security-hub/) 中的说明将 Prowler 与 Security Hub 集成。
4. 如何修复报告中的问题?
+ 通常,报告中会描述问题并附带易于识别的修正方法。同时请参考每个工具(例如 Prowler)的公开文档。如果仍不足够,请联系您的 AWS 账户团队或 [AWS Support](https://aws.amazon.com/contact-us/),以帮助您理解报告并解决问题。
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 控制台](https://console.aws.amazon.com/cloudformation)。
2. 在导航窗格中,选择 **堆栈**。
3. 选择 **sat2-prowler** 堆栈。
4. 选择 **删除**。
如果您部署了成员角色 StackSet 以扫描多个账户,请执行以下步骤。
1. 在您创建成员角色 StackSet 的账户中,导航至 [AWS CloudFormation 控制台](https://console.aws.amazon.com/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 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html) 中的步骤删除对象和存储桶。如果您再次运行解决方案,将会创建一个新的 S3 存储桶来存放结果。
## 安全
请参阅 [CONTRIBUTING](https://github.com/awslabs/aws-security-assessment-solution/blob/main/CONTRIBUTING.md#security-issue-notifications) 了解更多信息。
## 许可证
本项目采用 Apache-2.0 许可证授权。
| 参数 | 描述 | 更多信息 |
|---|
| 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 将自动附加到您指定的参数末尾。此参数也可用于指定单个检查。 | 完全扫描 |
| ProwlerRole | Prowler 执行扫描时应扮演的角色。如果您想指定自己的角色并具有不同权限,请更改此参数。 |
确定您的 Prowler 账户是否已有委托管理员或资源策略。只需要一种选择,建议使用资源策略,因为它更精细。
注意:资源策略在 GovCloud 中不可用,因此您需要使用委托管理员。
7a. 您的 Prowler 账户可能已有委托。您可以使用以下命令进行检查:
aws organizations list-delegated-administrators
7b. 您的 Prowler 账户可能已有资源策略。您可以使用以下命令进行检查:
aws organizations describe-resource-policy
如果您没有委托管理员或资源策略,可以使用以下命令添加适当的访问权限。
注意:如果您无法提供委托的 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"
],
"Resource": "*"
}
]
}'
注意:确保您已切换到您指定将运行 Prowler 的账户。
要下载模板,请在 Prowler 账户 中打开 AWS CloudShell 并输入以下命令。
wget https://raw.githubusercontent.com/awslabs/aws-security-assessment-solution/main/2-sat2-codebuild-prowler.yaml
在 Prowler 账户中部署模板。将 MultiAccountScan 设置为 true 以扫描组织中的所有账户。
aws cloudformation deploy --template-file 2-sat2-codebuild-prowler.yaml \
--stack-name sat2-prowler \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides MultiAccountScan=true
导航到 AWS Organization 控制台。
在导航窗格中,选择 Settings。
对于 Delegated administrator for 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"
],
"Resource": "*"
}
]
}
```#### 第三步:部署 SATv2 解决方案
在将运行该工具的账户(ProwlerAccountID)中,导航到 AWS CloudFormation 控制台。
在导航窗格中,选择 堆栈。
选择 创建堆栈。
在“指定模板”下,选择 上传模板文件。
选择您在步骤 1-1 中下载的 2-sat2-codebuild-prowler.yaml。
选择 下一步。
对于堆栈名称,输入 sat2-prowler。
在“参数”部分,为 MultiAccountScan 选择 true。
您可以选择启用报告功能,以将所有账户的摘要汇总到一个 csv 文件中。对于 Reporting,选择 true。
选择 下一步。
在“配置堆栈选项”页面上,选择 下一步。
在“审核 SAS”页面上,勾选 我确认 AWS CloudFormation 可能会创建 IAM 资源。 复选框,然后选择 提交。