Prowler Terraform Kickstarter:用 Terraform 一键部署 AWS 上的 Prowler 定期安全基线扫描
【免费下载链接】prowlerProwler is the world’s most widely used open-source cloud security platform that automates security and compliance across any cloud environment.项目地址: https://gitcode.com/GitHub_Trending/pr/prowler
本文基于 Prowler 仓库中的 Terraform Kickstarter 模块文档 及其配套 Terraform 源码编写。它讲清了该模块如何在一个 AWS 账户中自动搭起“CloudWatch Events 定时触发 + CodeBuild 执行 Prowler 扫描 + S3 报告归档 + Security Hub 结果订阅”的完整流水线,并逐一解析其全部 Terraform 输入变量、资源清单与构建脚本。读完本文,你可以直接复制该目录完成部署,并理解每个资源的权限边界与默认扫描命令的含义。
模块定位与文件构成
Terraform Kickstarter 是一个“预构建 Terraform 模块”,用于快速安装执行安全基线评估所需的全部 AWS 资源,扫描结果通过 Prowler 发送到 AWS Security Hub。在仓库中,该模块由以下文件构成:
- main.tf:Provider 声明与全部云资源定义(IAM、S3、CodeBuild、Security Hub、CloudWatch Events);
- variables.tf:全部输入变量及其默认值;
- data.tf:
aws_caller_identity、aws_region、SecurityAudit托管策略等数据源; - outputs.tf:输出
account_id; - prowler_build_spec.yml:CodeBuild 的 buildspec,定义 Prowler 的安装与执行步骤;
- tf_install.sh:Amazon Linux 上安装 Terraform 的辅助脚本;
- docs/tf.md:Terraform 文档(Requirements / Providers / Resources / Inputs / Outputs),本文即围绕该文档展开;
- readme.md:安装步骤与验收方法说明。
环境要求与 Provider 版本
根据 docs/tf.md 与 main.tf 的声明,模块只依赖hashicorp/aws一个 Provider,无子模块(No modules):
| 名称 | 要求 |
|---|---|
| 依赖(Requirement) | aws ~> 3.54 |
| Provider | aws,锁定版本 3.55.0 |
这意味着模块面向 AWS Provider 3.x 编写(较新的 Provider 4.x/5.x 语法如 S3 桶版本化子资源等并未使用),部署前请确认本地 Terraform 能拉取该版本 Provider。provider "aws"块的 region 由变量var.select_region控制,默认us-east-1。
安装步骤(CloudShell 全程不到一分钟)
readme.md 给出的官方路径是“启动 AWS CloudShell,然后安装 Terraform、拉取仓库、init、apply”。结合当前仓库的实际目录结构,步骤如下:
# 1. 克隆 Prowler 仓库(readme.md 原始示例) git clone https://github.com/prowler-cloud/prowler.git cd prowler # 2. 在 Amazon Linux(CloudShell)上通过 HashiCorp yum 源安装 Terraform sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo sudo yum -y install terraform # 3. 进入模块目录(当前仓库中的实际位置) cd contrib/terraform-kickstarter # 4. 初始化并应用 terraform init terraform apply两点注意事项,均来自 readme 与源码:
- Security Hub 订阅可能报一次错:readme 明确指出 apply 时大概率会在 SecurityHub 订阅资源(
aws_securityhub_product_subscription)上出现一个与 Terraform 状态相关的错误。此时可打开 Security Hub 控制台,进入 Integrations 搜索 Prowler,确认其状态显示为绿色的Accepting findings,即可验证订阅实际已生效。 - 旧版一键脚本:tf_install.sh 会 clone 仓库并 checkout
terraform-kickstart分支(旧路径util/terraform-kickstarter在 readme 中仍被引用)。在新版仓库中该模块已位于contrib/terraform-kickstarter,建议以上面的手工步骤为准。
部署完成后,默认配置下每天 00:00 GMT 会自动触发一次扫描;也可以随时进入 CodeBuild 控制台手动启动security_baseline_kickstarter_codebuild项目立即执行一次评估。
资源清单:apply 之后你得到什么
docs/tf.md 的 Resources 表格完整列出了模块部署的全部资源,按职责可分为四组:
| 资源 | 类型 | 作用 |
|---|---|---|
aws_cloudwatch_event_rule.prowler_check_scheduler_event | resource | 按 cron 表达式定时触发扫描的事件规则 |
aws_cloudwatch_event_target.run_prowler_scan | resource | 将事件路由到 CodeBuild 项目 |
aws_codebuild_project.prowler_codebuild | resource | 执行 Prowler 的构建项目 |
aws_iam_role.prowler_kick_start_role | resource | CodeBuild 服务角色(执行 Prowler 扫描) |
aws_iam_role.prowler_event_trigger_role | resource | CloudWatch Events 触发角色(仅允许 StartBuild) |
aws_iam_policy.prowler_kickstarter_iam_policy | resource | 扫描角色的内联权限策略 |
aws_iam_policy.prowler_event_trigger_policy | resource | 触发角色的内联权限策略 |
aws_iam_policy_attachment.prowler_kickstarter_iam_policy_attach | resource | 将扫描策略附加到扫描角色 |
aws_iam_policy_attachment.prowler_event_trigger_policy_attach | resource | 将触发策略附加到触发角色 |
aws_s3_bucket.prowler_report_storage_bucket | resource | 报告存储桶(版本化 + AES256 加密) |
aws_s3_bucket_policy.prowler_report_storage_bucket_policy | resource | 强制 SSL、拒绝未加密对象上传 |
aws_s3_bucket_public_access_block.prowler_report_storage_bucket_block_public | resource | 四项全开的公网访问屏蔽 |
aws_securityhub_account.securityhub_resource | resource | 启用 Security Hub 账户 |
aws_securityhub_product_subscription.security_hub_enable_prowler_findings | resource | 订阅 Prowler 发现项 |
aws_caller_identity.current | data source | 获取当前账户 ID |
aws_iam_policy.SecurityAudit | data source | AWS 官方 SecurityAudit 托管策略 |
aws_region.current | data source | 获取当前 Region 名称 |
IAM:两个角色的最小权限切分
main.tf 中定义了两个角色,职责刻意分开:
prowler_kick_start_role(security_baseline_kickstarter_iam_role):信任策略只允许codebuild.amazonaws.com扮演(Sid 为CodeBuildProwler)。它直接附加 AWS 托管策略arn:aws:iam::aws:policy/SecurityAudit以及job-function/SupportUser、job-function/ViewOnlyAccess,获得只读巡检所需的基础权限,并通过 main.tf 的内联策略prowler_kickstarter_iam_policy获得:写 CloudWatch Logs、向 Security HubBatchImportFindings/GetFindings、操作 CodeBuild 报告组、sts:AssumeRole,以及对报告桶arn:aws:s3:::prowler-kickstart-${region}-${account}-reports/*的s3:PutObject/GetObject等权限。prowler_event_trigger_role(security_baseline_kickstarter_event_trigger_iam_role):信任策略只允许events.amazonaws.com扮演;其内联策略 prowler_event_trigger_policy 仅授予对这一个 CodeBuild 项目 ARN 的codebuild:StartBuild,是纯粹的“扳机”角色。
S3 报告桶:默认安全加固
main.tf 中报告桶命名为prowler-kickstart-${region}-${account_id}-reports,并内置三层保护:
- 桶开启版本控制,服务端加密默认
AES256(SSE-S3); - 桶策略包含
S3ForceSSL(拒绝非 TLS 请求)和DenyUnEncryptedObjectUploads(拒绝不带 SSE 头的对象写入)两条 Deny 语句; aws_s3_bucket_public_access_block四项(block_public_acls、block_public_policy、ignore_public_acls、restrict_public_buckets)全部为true。
Security Hub 集成
main.tf 先创建aws_securityhub_account开通账户,再创建aws_securityhub_product_subscription,product_arn固定为arn:aws:securityhub:${region}::product/prowler/prowler——即让 Security Hub 接受 Prowler 作为发现项来源产品。这也是 apply 时最容易报状态错误的资源(见上文注意事项)。main.tf 头部注释还给出了一条运维提示:若 Security Hub 账户在 Terraform 之外已存在,可用terraform import aws_securityhub_account.securityhubresource <account_id>导入状态。
定时调度
main.tf 中 CloudWatch Event Rulesecurity_baseline_kickstarter_event_cron的schedule_expression取自变量var.prowler_schedule,目标直接指向 CodeBuild 项目 ARN 并携带触发角色 ARN。默认 croncron(0 0 ? * * *)表示每天 00:00(GMT)执行一次。
输入变量详解
docs/tf.md 的 Inputs 表格与 variables.tf 一致,全部变量均有默认值、非必填:
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
select_region | string | us-east-1 | AWS Provider 使用的 Region |
enable_security_hub | bool | true | 是否启用 AWS Security Hub |
enable_security_hub_prowler_subscription | bool | true | 是否启用 Prowler 产品订阅 |
prowler_cli_options | string | "-q -M json-asff -S -f us-east-1" | 传给 Prowler 的完整 CLI 参数 |
prowler_schedule | string | "cron(0 0 ? * * *)" | cron 调度表达式 |
codebuild_timeout | number | 300 | CodeBuild 构建超时(分钟) |
其中prowler_cli_options是最关键的变量:它被原样注入 CodeBuild 环境变量PROWLER_OPTIONS,最终拼进执行命令。默认值各参数的含义为:-q静默输出(不逐条打印检查项);-M json-asff指定 ASFF(AWS Security Finding Format)输出格式,正是 Security HubBatchImportFindings所需的格式——从当前 CLI 解析器源码 可以看到-M(即--output-formats)的帮助文本明确说明“使用 AWS Security Hub 集成时,json-asff 输出也会一并保存”;-S开启 Security Hub 推送;-f指定 Prowler 使用的 AWS Region。由于该字符串是整体透传的,你可以在部署时追加任意合法的 Prowler CLI 参数(例如追加合规框架--compliance或指定--output-directory),但需注意参数语法以当时扫描的 Prowler 版本 CLI 为准。
codebuild_timeout对应aws_codebuild_project的build_timeout(见 main.tf)。全账户扫描通常不会超过默认的 300 分钟;若账户规模极大导致构建超时,调大该值即可。
CodeBuild 构建脚本解析
扫描的实际执行逻辑在 prowler_build_spec.yml(由 main.tf 以buildspec = file("prowler_build_spec.yml")内联进项目,source.type为NO_SOURCE):
version: 0.2 phases: install: runtime-versions: python: 3.8 commands: - echo "Installing Prowler and dependencies..." - pip3 install detect-secrets - yum -y install jq - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - unzip awscliv2.zip - ./aws/install - git clone https://github.com/prowler-cloud/prowler - cd prowler build: commands: - echo "Running Prowler as ./prowler $PROWLER_OPTIONS" - ./prowler $PROWLER_OPTIONS || true post_build: commands: - echo "Scan Complete" - aws s3 cp --sse AES256 output/ s3://$BUCKET_REPORT/ --recursive - echo "Done!"各阶段要点:
- install:基于
aws/codebuild/amazonlinux2-x86_64-standard:3.0镜像(见 main.tf 的environment块),安装 Python 3.8 运行时、detect-secrets(Prowler 检查密钥扫描时的可选依赖)、jq,并安装 AWS CLI v2 供上传报告用,最后克隆 Prowler 源码; - build:以
./prowler $PROWLER_OPTIONS执行扫描。末尾的|| true保证即使 Prowler 以非零退出码结束(例如存在失败检查项触发的退出码 3),构建也不会失败,post_build 的报告归档仍会执行; - post_build:将
output/目录整体以 AES256 服务端加密递归上传到环境变量$BUCKET_REPORT指向的报告桶——该环境变量由 main.tf 注入,值为报告桶 ID。
由于artifacts.type为NO_ARTIFACTS(见 main.tf),构建不产生 CodeBuild 工件,报告的唯一落点就是 S3 报告桶;Security Hub 中的发现项则通过扫描进程直接调用securityhub:BatchImportFindings上报(内联策略已放行,且Resource为*,因为 Security Hub 发现项操作不支持资源级细化)。
输出与部署后的验证
模块只有一个输出(见 outputs.tf 与 tf.md 的 Outputs 表):
| 输出 | 取值 |
|---|---|
account_id | data.aws_caller_identity.current.account_id,即部署所在账户 ID |
terraform apply成功后,建议按 readme.md 的验收流程确认:
- 打开 Security Hub 控制台 → Integrations → 搜索 Prowler,确认状态为Accepting findings(若 apply 时该资源报错,以此为准);
- 打开 CodeBuild 控制台,手动启动一次
security_baseline_kickstarter_codebuild项目,确认构建成功、S3 报告桶中出现output/下的报告文件,Security Hub 中随后出现 Prowler 来源的发现项; - 之后每天 00:00 GMT 会按默认 cron 自动重复上述流程。想改频率,只需在 apply 时传入新的
-var 'prowler_schedule=..."...'(CloudWatch Events 的 cron 语法),无需改动任何 tf 文件。
小结
该 Kickstarter 的价值在于把“定时化、可追溯的云上安全基线扫描”所需的四类资源(调度、执行、存储、汇总)一次性以 IaC 方式装好:CloudWatch Events 负责按 cron 触发,CodeBuild 负责安装并运行 Prowler 并归档报告,S3 桶以强制 TLS + SSE + 公网屏蔽的方式保存原始输出,Security Hub 订阅则把 ASFF 格式发现项持续汇入统一的合规视图。所有可调项(Region、扫描频率、超时、CLI 参数)都收敛在 variables.tf 的六个变量中,配合 docs/tf.md 的资源与输入输出清单,即可在约一分钟内完成部署并接管后续的安全基线巡检。
【免费下载链接】prowlerProwler is the world’s most widely used open-source cloud security platform that automates security and compliance across any cloud environment.项目地址: https://gitcode.com/GitHub_Trending/pr/prowler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考