痛点:AWS 安全审计为什么这么难
你管着 3 个 AWS 账户、十几个 Region,老板突然说下周要过 CIS Benchmark 合规审计。
打开 AWS Security Hub 看了一眼——检查项 300 多条,从 IAM 密码策略到 S3 公开访问,从 CloudTrail 日志到 VPC Flow Logs,手动逐条核查少说两天。更头疼的是,每次基础设施变更后都得重新检查,人工审计根本跟不上变更频率。
现实中很多团队的做法是:出了安全事件才回头补,平时全靠"应该没问题吧"。这不是懒,是手动审计的成本太高,高到不可持续。
方案:Prowler——一条命令扫完全账户
Prowler 是一个开源的云安全审计工具,用 Python 编写,覆盖 AWS、Azure、GCP 三大云平台。核心能力:
- 300+ 自动化检查项,覆盖 CIS AWS Benchmark、PCI-DSS、HIPAA、SOC2、GDPR 等主流合规框架
- 零 Agent 部署,只需一个 IAM 角色即可扫描整个账户
- 多格式报告输出:HTML、CSV、JSON、JSON-OCSF,可直接对接 Security Hub 或 SIEM
- 支持多账户扫描,通过 AWS Organizations 一次覆盖所有成员账户
和 AWS 原生的 Security Hub 相比,Prowler 免费、检查项更多、可离线运行、CI/CD 集成更灵活。
实操步骤
第 1 步:安装 Prowler
推荐用 pip 安装,保证版本最新:
# Python 3.9+ 环境
pip install prowler
# 验证安装
prowler -v
也可以用 Docker 直接运行,适合 CI/CD 场景:
docker run -it --rm \
-v ~/.aws:/root/.aws:ro \
toniblyx/prowler:latest aws
第 2 步:配置 IAM 权限
Prowler 需要只读权限来扫描资源。最省事的方式是使用 AWS 托管策略:
# 创建 Prowler 专用 IAM 角色
aws iam create-role \
--role-name ProwlerAuditRole \
--assume-role-policy-document file://trust-policy.json
# 附加只读策略(核心)
aws iam attach-role-policy \
--role-name ProwlerAuditRole \
--policy-arn arn:aws:iam::aws:policy/SecurityAudit
aws iam attach-role-policy \
--role-name ProwlerAuditRole \
--policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess
trust-policy.json 示例(允许当前账户 assume):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
关键:
SecurityAudit+ViewOnlyAccess两个策略缺一不可。只挂SecurityAudit会导致约 30% 的检查项因权限不足被跳过。
第 3 步:运行扫描
# 全量扫描当前账户(所有 Region、所有检查项)
prowler aws
# 只扫描特定合规框架
prowler aws --compliance cis_2.0_aws
# 只扫描指定 Region(节省时间)
prowler aws -f us-east-1,ap-northeast-1
# 只扫描特定服务
prowler aws --services iam s3 cloudtrail
# 指定输出格式和目录
prowler aws -M html csv json -o /tmp/prowler-report
全量扫描单个 Region 大约 5-10 分钟,全 Region 扫描视资源量通常在 15-30 分钟。
第 4 步:解读报告 + 集成 CI/CD
扫描完成后,Prowler 会在 output/ 目录生成报告。HTML 报告可直接浏览器打开,按严重等级(Critical/High/Medium/Low)分类展示:
# 查看扫描结果摘要
prowler aws --compliance cis_2.0_aws -M csv \
| grep "FAIL" | wc -l
集成 GitHub Actions 示例——每天自动扫描,失败项超阈值则告警:
# .github/workflows/security-audit.yml
name: AWS Security Audit
on:
schedule:
- cron: '0 2 * * *' # 每天 UTC 2:00
jobs:
prowler-scan:
runs-on: ubuntu-latest
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::ACCOUNT_ID:role/ProwlerAuditRole
aws-region: us-east-1
- name: Install Prowler
run: pip install prowler
- name: Run Prowler
run: |
prowler aws --compliance cis_2.0_aws \
-M json-ocsf \
--severity critical high \
-o prowler-results/
- name: Check critical findings
run: |
CRITICAL=$(cat prowler-results/*.json | \
python3 -c "import sys,json; \
data=[json.loads(l) for l in sys.stdin]; \
print(sum(1 for d in data if d.get('status_code')=='FAIL'))")
echo "Critical/High failures: $CRITICAL"
if [ "$CRITICAL" -gt 10 ]; then
echo "::error::安全审计发现 $CRITICAL 个高危问题!"
exit 1
fi
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: prowler-report
path: prowler-results/
也可以将结果推送到 AWS Security Hub,统一管理:
prowler aws --security-hub --send-sh-only-fails
避坑指南
坑 1:扫描结果大量 SKIP,不是 bug 是权限不够
现象:报告里 30%+ 的检查项状态为 SKIP。
原因:IAM 权限缺失。特别是 ViewOnlyAccess 策略容易被遗漏。
解决:确认 Prowler 使用的 IAM 角色同时附加了 SecurityAudit 和 ViewOnlyAccess,然后重新扫描。可以用 --list-checks-json 查看每个检查项的依赖权限。
坑 2:全 Region 扫描太慢,CI/CD 超时
全量扫描 20+ Region 可能需要 30 分钟以上。CI/CD 环境建议:
# 只扫描有资源的 Region
prowler aws -f $(aws ec2 describe-regions \
--query 'Regions[].RegionName' --output text | tr '\t' ',')
# 或者只扫 critical/high 级别
prowler aws --severity critical high
坑 3:误报太多导致告警疲劳
Prowler 默认规则较严格,某些检查项在特定架构下属于"预期行为"(比如公开的 S3 静态网站桶)。用 allowlist 文件排除:
# allowlist.yaml
Allowlist:
Accounts:
"123456789012":
Checks:
s3_bucket_public_access:
Regions:
- us-east-1
Resources:
- "my-public-website-bucket"
Comment: "公开静态网站桶,预期行为"
prowler aws --allowlist allowlist.yaml
每条排除必须写 Comment,方便后续审计追溯"为什么这个不算问题"。
总结
Prowler 解决的是"安全审计可持续性"问题——不是扫一次就完事,而是嵌入 CI/CD 持续运行。核心实操路径:
pip install prowler+ 配置SecurityAudit+ViewOnlyAccessIAM 角色prowler aws --compliance cis_2.0_aws一键扫描- 集成 GitHub Actions / Jenkins 每日自动运行,Critical/High 超阈值即告警
- 用 allowlist 管理误报,保持告警信噪比
一个成熟的安全审计体系,不靠人记性,靠自动化流水线。Prowler 就是那条流水线上最趁手的开源工具。