饮墨

子安饮墨馀三斗,留与卿儿作赋来

Prowler 实战:开源 AWS 安全审计利器,5 分钟自动扫描 300+ 合规检查项

1 views

痛点: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 持续运行。核心实操路径:

  1. pip install prowler + 配置 SecurityAudit + ViewOnlyAccess IAM 角色
  2. prowler aws --compliance cis_2.0_aws 一键扫描
  3. 集成 GitHub Actions / Jenkins 每日自动运行,Critical/High 超阈值即告警
  4. 用 allowlist 管理误报,保持告警信噪比

一个成熟的安全审计体系,不靠人记性,靠自动化流水线。Prowler 就是那条流水线上最趁手的开源工具。

分享:

相关文章