首页
/ 使用 CIS 基准审计云环境:AWS/Azure/GCP 合规评估的 Prowler 与 boto3 实战指南

使用 CIS 基准审计云环境:AWS/Azure/GCP 合规评估的 Prowler 与 boto3 实战指南

2026-09-09 19:52:31作者:宣利权Counsellor

本文是 Anthropic-Cybersecurity-Skills 仓库中 auditing-cloud-with-cis-benchmarks 技能的深度技术指南,围绕 API 参考文档 展开。它面向需要以 CIS Foundations Benchmark 为标尺、对 AWS、Azure、GCP 云环境执行自动化安全审计的工程师、审计师与 AI Agent,读者阅读后可掌握:用 Prowler 一键执行 CIS v5.0 AWS / v4.0 Azure / v4.0 GCP 合规扫描、用 boto3 编写单账户快速检查脚本、用 jq 汇总失败控制项并驱动修复与持续合规监控的完整闭环。

从技能骨架到 API 参考:这份文档在仓库中的定位

auditing-cloud-with-cis-benchmarks 是仓库 Cloud Security 域(共 66 个技能)中的一个合规评估技能。技能目录采用 agentskills.io 标准组织:

  • SKILL.md:定义触发条件(When to Use)、前置条件与五步 Workflow,是 Agent 执行的主线;
  • references/api-reference.md:即本文核心,提供可直接复用的 boto3 检查片段、CIS 控制项速查表和 Prowler CLI 命令;
  • scripts/agent.py:一个可运行的 Python 审计 Agent,把 API 参考中的检查点全部落成函数;
  • 技能元数据还映射了 MITRE ATT&CK(T1078.004、T1530、T1098.003、T1685.002、T1580)、NIST CSF 2.0(PR.IR-01、ID.AM-08、GV.SC-06、DE.CM-01)与 NIST AI RMF(GOVERN-1.1、GOVERN-4.2、MAP-2.3),方便 Agent 在合规审计语境中快速检索命中。

API 参考文档解决了"命令记不全、控制项对不上号"的痛点:把每个 CIS 控制项(如 1.4、2.1.1、3.1)直接映射到具体的 API 调用与判定逻辑,是评估脚本、修复 runbook 和自动化流水线之间的桥梁。

前置条件:以只读权限开始审计

在执行任何 CIS 检查前,请确认以下前提(来自 SKILL.md 的 Prerequisites 章节):

  • 目标云账户的只读访问权限:AWS 建议 SecurityAudit 托管策略,Azure 使用 Reader 角色,GCP 使用 Viewer 角色;
  • 安装并配置好 ProwlerScoutSuite 或云厂商原生 CSPM 工具;
  • 理解 CIS Benchmark 的结构:section(章节)、controls(控制项)、profiles(Level 1 与 Level 2 两个档位);
  • 审计凭据与修复凭据分离:扫描用只读账号,修复(如删除 root key、启用加密)用单独的、最小权限的变更账号,降低审计账号被滥用为横向移动入口的风险(对应 ATT&CK T1078.004 Valid Accounts 的防御场景)。

需要强调的是:本技能只做配置基线审计,不适合运行时威胁检测(应参考 detecting-cloud-threats-with-guardduty)、应用层渗透测试(应参考 conducting-cloud-penetration-testing),也不适用于非 CIS 体系的合规框架。

第一步:选择正确的 CIS Benchmark 版本

CIS 为每家云厂商发布独立的 Foundations Benchmark 版本。截至 2025 年,当前版本为:CIS AWS Foundations Benchmark v5.0CIS Azure Foundations Benchmark v4.0CIS GCP Foundations Benchmark v4.0

Section AWS v5.0 Azure v4.0
Identity & Access IAM 策略、MFA、root Azure AD、RBAC、PIM
Logging CloudTrail、Config Activity Log、Diag
Monitoring CloudWatch 告警 Defender、Sentinel
Networking VPC、SG、NACLs NSG、ASG、Firewall
Storage S3 加密、访问控制 Storage 加密
Database RDS 加密 SQL TDE、审计

CIS 的两种 Profile 档位决定了修复策略的优先级:

  • Level 1:可在不显著影响性能或功能的前提下实施的基础安全设置,代表"安全卫生"底线,应优先全部满足;
  • Level 2:纵深防御(defense-in-depth)设置,可能限制部分功能或需要额外规划,属于加固项而非必需项。

在结果解读阶段,先处理 Level 1 失败项,再评估 Level 2。

第二步:用 Prowler 执行多账户自动评估

API 参考文档给出的是三行最简命令,SKILL.md 则补充了生产级用法(多输出格式、多账户、输出目录按日期命名):

# AWS CIS v5.0 评估
prowler aws \
  --compliance cis_5.0_aws \
  --profile audit-account \
  --output-formats json-ocsf,html,csv \
  --output-directory ./cis-audit-$(date +%Y%m%d)

# Azure CIS v4.0 评估
prowler azure \
  --compliance cis_4.0_azure \
  --subscription-ids "sub-id-1,sub-id-2" \
  --output-formats json-ocsf,html,csv \
  --output-directory ./cis-audit-azure-$(date +%Y%m%d)

# GCP CIS v4.0 评估
prowler gcp \
  --compliance cis_4.0_gcp \
  --project-ids "project-1,project-2" \
  --output-formats json-ocsf,html,csv \
  --output-directory ./cis-audit-gcp-$(date +%Y%m%d)

参数说明:

  • --compliance cis_X.Y_<provider>:指定目标基准版本,Prowler 会加载对应的控制项清单;
  • --profile / --subscription-ids / --project-ids:指定评估范围(单账号或多账号);
  • --output-formats json-ocsf,html,csv:同时产出结构化 JSON(OCSF 标准,便于 jq 处理)、可视化 HTML 报告与表格化 CSV;
  • --output-directory:按日期隔离每次审计产物,便于追溯历史合规分数变化。

多账户 AWS 场景也可使用 ScoutSuite:

scout suite aws \
  --profile audit-account \
  --report-dir ./scout-report \
  --ruleset cis-5.0 \
  --force

--ruleset cis-5.0 指定 CIS 规则集,--force 覆盖旧报告。

第三步:用 boto3 快速核对关键 AWS CIS 控制项

Prowler 适合全量扫描;当你只想快速验证几个高危控制项、或把检查逻辑内嵌到 CI/CD 与 Agent 脚本中时,API 参考文档提供的 boto3 片段是最直接的武器。下面的四组检查都直接取自 api-reference.md,并补充了判定逻辑说明。

IAM 账户汇总:root 密钥与 MFA(CIS 1.4 / 1.5)

import boto3
iam = boto3.client("iam")
summary = iam.get_account_summary()["SummaryMap"]
print("Root access keys:", summary["AccountAccessKeysPresent"])
print("Root MFA:", summary["AccountMFAEnabled"])

判定标准:AccountAccessKeysPresent == 0(无 root 访问密钥)且 AccountMFAEnabled == 1(root 已启用 MFA)。这两项是 CIS 评分中破坏力最大、最容易被 SOC 2 / ISO 27001 审计师抽查的控制项——root 凭据一旦泄露即等于整个账户沦陷。

密码策略(CIS 1.8–1.11)

policy = iam.get_account_password_policy()["PasswordPolicy"]
print("Min length:", policy["MinimumPasswordLength"])
print("Require symbols:", policy["RequireSymbols"])

CIS 要求密码策略覆盖长度、大小写、数字、符号与过期时间五个维度。MinimumPasswordLength 建议不低于 14,RequireSymbols 等布尔字段决定是否强制符号类字符。注意:若从未设置过密码策略,get_account_password_policy() 会抛出 NoSuchEntity,脚本应捕获 ClientError 并判为 FAIL("No policy set"),这正好是 scripts/agent.pycheck_password_policy 的兜底逻辑。

CloudTrail 多区域(CIS 3.1)

ct = boto3.client("cloudtrail")
trails = ct.describe_trails()["trailList"]
for t in trails:
    print(t["Name"], "Multi-region:", t["IsMultiRegionTrail"])

判定标准:存在至少一条 IsMultiRegionTrail == True 的追踪。多区域 CloudTrail 保证所有 Region 的管理操作都被记录,是日志章节的基础控制项。

VPC Flow Logs(CIS 5.1)

ec2 = boto3.client("ec2")
vpcs = ec2.describe_vpcs()["Vpcs"]
flow_logs = ec2.describe_flow_logs()["FlowLogs"]
logged = {fl["ResourceId"] for fl in flow_logs}
for vpc in vpcs:
    print(vpc["VpcId"], "Logged:" if vpc["VpcId"] in logged else "MISSING")

把已启用流日志的 ResourceId 集合与全部 VPC 比对,任何一个 VPC 不在集合内即标记为 MISSING。这一"集合差"写法在 agent.py 的 check_vpc_flow_logs 中被实现为 missing = [v["VpcId"] for v in vpcs if v["VpcId"] not in logged_vpcs]

CIS 控制项速查表:控制 ID、API 与判定条件

API 参考文档用一张表把常见 CIS 控制项与 boto3 方法、判定条件对齐,适合直接贴进检测规则或审计 Runbook:

CIS Control boto3 Method Check
1.4 Root keys iam.get_account_summary() AccountAccessKeysPresent == 0
1.5 Root MFA iam.get_account_summary() AccountMFAEnabled == 1
2.1.1 S3 encryption s3.get_bucket_encryption() No ClientError
3.1 CloudTrail ct.describe_trails() IsMultiRegionTrail
5.1 VPC flow logs ec2.describe_flow_logs() All VPCs covered
5.4 Default SG ec2.describe_security_groups() No 0.0.0.0/0 rules

两个值得注意的实现细节(均可在 agent.py 中印证):

  • 2.1.1 S3 加密ClientError 作为判定信号:get_bucket_encryption() 对未启用加密的桶直接抛异常,无需解析错误码,见 check_s3_encryptionagent.py);
  • 5.4 默认安全组检查 describe_security_groupsIpPermissions 中是否存在 CidrIp == "0.0.0.0/0" 的入站规则,见 check_default_sg_restrictionsagent.py),完全匹配表中"无 0.0.0.0/0 规则"的判定标准。

源码级视角:agent.py 如何把这些检查串成一次审计

仓库给出了一个开箱即用的单账户审计 Agent(scripts/agent.py),它将上表的检查点实现为 8 个独立函数:check_root_access_keyscheck_root_mfacheck_password_policycheck_cloudtrail_multiregioncheck_cloudtrail_log_validationcheck_s3_encryptioncheck_vpc_flow_logscheck_default_sg_restrictions。其设计值得在自研审计工具时借鉴:

  • 统一返回结构:每个检查返回 {"control", "description", "status", "detail"},便于下游聚合与报告渲染;
  • 会话注入run_full_audit(session) 接收一个 boto3.Session,全部函数基于同一会话执行,天然支持 --profile 切换账户(agent.py);
  • 自动出报告main() 通过 STS 获取账户 ID,统计 PASS/FAIL 计算合规分数,并落盘 JSON 报告(默认 cis_audit_report.json),包含 account、benchmark、audit_date、compliance_score、checks 等字段(agent.py)。

运行方式:

python scripts/agent.py --profile audit-account --region us-east-1 --output cis_audit_report.json

三个参数均有环境变量兜底(AWS_PROFILEAWS_DEFAULT_REGION,默认 us-east-1),适合直接放进 CI 流水线。

第四步:解读结果并按优先级修复

Prowler 输出的 JSON(OCSF 格式)可以用 jq 快速加工成决策信息。API 参考文档没有展开这一步,SKILL.md 给出了两个高价值片段:

按失败资源数聚合失败控制项

cat ./cis-audit-*/prowler-output-*.json | \
  jq '[.[] | select(.StatusExtended == "FAIL")] | group_by(.CheckID) |
  map({control: .[0].CheckID, description: .[0].CheckTitle,
  failed_resources: length, severity: .[0].Severity}) |
  sort_by(-.failed_resources)'

按章节计算合规分数

cat ./cis-audit-*/prowler-output-*.json | \
  jq 'group_by(.Section) | map({
    section: .[0].Section,
    total: length,
    passed: [.[] | select(.StatusExtended == "PASS")] | length,
    failed: [.[] | select(.StatusExtended == "FAIL")] | length,
    score: (([.[] | select(.StatusExtended == "PASS")] | length) / length * 100 | round)
  })'

修复顺序建议:Level 1 优先(代表基础安全卫生),再处理 Level 2(纵深防御)。SKILL.md 给出的关键修复命令示例:

# CIS 1.4: 确保不存在 root 访问密钥
aws iam list-access-keys --user-name root
# 若存在则删除
aws iam delete-access-key --user-name root --access-key-id AKIAEXAMPLE

# CIS 2.1.1: 为所有 S3 桶启用默认加密
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
  aws s3api put-bucket-encryption --bucket "$bucket" \
    --server-side-encryption-configuration '{
      "Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]
    }' 2>/dev/null && echo "Encrypted: $bucket" || echo "FAILED: $bucket"
done

# CIS 3.1: 创建多区域 CloudTrail
aws cloudtrail create-trail \
  --name organization-trail \
  --s3-bucket-name cloudtrail-logs-bucket \
  --is-multi-region-trail \
  --enable-log-file-validation \
  --kms-key-id arn:aws:kms:us-east-1:123456789012:key/key-id
aws cloudtrail start-logging --name organization-trail

# CIS 4.x: 配置 CloudWatch 指标过滤与告警
aws logs put-metric-filter \
  --log-group-name CloudTrail/DefaultLogGroup \
  --filter-name UnauthorizedAPICalls \
  --filter-pattern '{ ($.errorCode = "*UnauthorizedAccess*") || ($.errorCode = "AccessDenied*") }' \
  --metric-transformations metricName=UnauthorizedAPICalls,metricNamespace=CISBenchmark,metricValue=1

提示:批量修复务必先在 staging 环境验证,再对生产执行;删除 root 密钥等破坏性操作应配合变更审批与备份。

第五步:建立持续合规监控

一次性审计只能提供快照,配置漂移随时可能让账户重新失分。SKILL.md 建议用云原生能力把 CIS 检查变成常态化监控:

# AWS: 在 Security Hub 启用 CIS v5.0 标准
aws securityhub batch-enable-standards \
  --standards-subscription-requests '[
    {"StandardsArn": "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/5.0.0"}
  ]'

# Azure: 分配 CIS benchmark 策略计划
az policy assignment create \
  --name cis-azure-benchmark \
  --scope "/subscriptions/<sub-id>" \
  --policy-set-definition "1a5bb27d-173f-493e-9568-eb56638dbd0e" \
  --params '{"effect": {"value": "AuditIfNotExists"}}'

# 用 cron 每周定时执行 Prowler 评估
0 2 * * 1 prowler aws --compliance cis_5.0_aws --output-formats csv --output-directory /opt/audits/weekly-$(date +\%Y\%m\%d)

对应工具矩阵(SKILL.md Tools & Systems):Prowler(跨 AWS/Azure/GCP 执行 300+ 项检查)、ScoutSuite(多云审计 + HTML 报告)、AWS Security HubAzure PolicyGCP Security Command Center

输出格式:让审计结果可直接呈报

SKILL.md 给出了标准报告模板,审计结果应包含总分、分章节得分与按账户影响的失败排序,方便审计师与管理层读取:

CIS Benchmark Audit Report
============================
Cloud Provider: AWS
Benchmark Version: CIS AWS Foundations Benchmark v5.0
Accounts Assessed: 45
Assessment Date: 2025-02-23
Tool: Prowler v4.3.0

OVERALL COMPLIANCE SCORE: 74%

COMPLIANCE BY SECTION:
  1. Identity and Access Management:  68% (41/60 controls passed)
  2. Storage:                         82% (28/34 controls passed)
  3. Logging:                         91% (20/22 controls passed)
  4. Monitoring:                      55% (18/33 controls passed)
  5. Networking:                      78% (32/41 controls passed)

TOP FAILED CONTROLS (by affected accounts):
  [1.4]   Root account has active access keys           - 3/45 accounts
  [1.5]   MFA not enabled for root account              - 2/45 accounts
  [2.1.1] S3 default encryption not enabled             - 12/45 accounts
  [3.1]   CloudTrail not multi-region                   - 8/45 accounts
  [4.3]   No alarm for root account usage               - 28/45 accounts
  [5.1]   VPC flow logs not enabled                     - 15/45 accounts
  [5.4]   Security groups allow 0.0.0.0/0 ingress       - 22/45 accounts

REMEDIATION PRIORITY:
  Critical (Fix within 7 days):  Root access keys, missing root MFA
  High (Fix within 30 days):     S3 encryption, CloudTrail, VPC flow logs
  Medium (Fix within 60 days):   CloudWatch alarms, security group restrictions
  Low (Fix within 90 days):      Level 2 controls, informational items

常见场景:SOC 2 认证前的 CIS 预审计

一个 SaaS 公司正在冲刺 SOC 2 Type II,审计师要求 45 个 AWS 账户具备可追溯的持续合规证据。SKILL.md 给出的执行路径:

  1. 对全部 45 个账户运行 Prowler CIS v5.0 评估,建立合规基线分数;
  2. 结果导出 CSV,按章节(IAM、Logging、Monitoring、Networking)归类失败项;
  3. 把每个 CIS 控制项映射到 SOC 2 Trust Services Criteria(如 CC6.1、CC6.6、CC7.1);
  4. 30 天内修复全部 Level 1 失败项,60 天内修复 Level 2;
  5. 在 Security Hub 启用 CIS v5.0,实现持续监控与自动漂移检测;
  6. 每周生成合规报告,向审计师展示改善曲线;
  7. 对有意不实施的控制项,以风险接受理由记录例外(documented exceptions)。

常见陷阱:不先在 staging 环境验证就批量修复,可能破坏生产负载;完全忽略 Level 2 控制项会削弱审计叙事,即使它们并非强制要求。

关键概念速查

术语 定义
CIS Benchmark 由互联网安全中心(Center for Internet Security)经社区共识制定的描述性安全配置基线
Level 1 Profile 无显著性能/功能影响即可实施的基础安全控制,代表安全卫生
Level 2 Profile 可能限制功能、需要谨慎规划的纵深防御控制
Foundations Benchmark 面向云厂商的 CIS 基准,覆盖 IAM、日志、监控、网络与存储安全
Control ID 每条 CIS 建议的唯一数字标识(如 1.4 root 密钥、2.1.1 S3 加密)
Compliance Score 处于通过状态的控制项百分比,随时间追踪以衡量安全态势改善
Automated Assessment 借助云厂商 API 检查资源配置、逐项对照基准要求的工具化评估
Remediation Runbook 修复特定失败控制项的分步文档,含预检查与验证步骤

结语

从 API 参考文档出发,可以拼出一条完整的云合规审计链路:选择基准版本 → Prowler 全量扫描 → boto3 快速验证 → jq 聚合失败项 → 分级修复 → 云原生持续监控auditing-cloud-with-cis-benchmarks 技能的价值在于把"控制 ID → API 调用 → 判定条件 → 修复命令"整条映射关系固化下来,既可供人类审计师查阅,也可直接作为 AI Agent 执行合规评估的可操作 playbook。建议结合仓库中的 SKILL.mdagent.py 对照阅读,前者补全流程与场景,后者提供可运行的检查实现,二者与本文的 API 参考互为印证。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
900
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
927
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.89 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
602
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
396
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
526