使用 CIS 基准审计云环境:AWS/Azure/GCP 合规评估的 Prowler 与 boto3 实战指南
本文是 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角色; - 安装并配置好 Prowler、ScoutSuite 或云厂商原生 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.0、CIS Azure Foundations Benchmark v4.0、CIS 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.py 中 check_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_encryption(agent.py); - 5.4 默认安全组检查
describe_security_groups的IpPermissions中是否存在CidrIp == "0.0.0.0/0"的入站规则,见check_default_sg_restrictions(agent.py),完全匹配表中"无 0.0.0.0/0 规则"的判定标准。
源码级视角:agent.py 如何把这些检查串成一次审计
仓库给出了一个开箱即用的单账户审计 Agent(scripts/agent.py),它将上表的检查点实现为 8 个独立函数:check_root_access_keys、check_root_mfa、check_password_policy、check_cloudtrail_multiregion、check_cloudtrail_log_validation、check_s3_encryption、check_vpc_flow_logs、check_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_PROFILE、AWS_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 Hub、Azure Policy、GCP 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 给出的执行路径:
- 对全部 45 个账户运行 Prowler CIS v5.0 评估,建立合规基线分数;
- 结果导出 CSV,按章节(IAM、Logging、Monitoring、Networking)归类失败项;
- 把每个 CIS 控制项映射到 SOC 2 Trust Services Criteria(如 CC6.1、CC6.6、CC7.1);
- 30 天内修复全部 Level 1 失败项,60 天内修复 Level 2;
- 在 Security Hub 启用 CIS v5.0,实现持续监控与自动漂移检测;
- 每周生成合规报告,向审计师展示改善曲线;
- 对有意不实施的控制项,以风险接受理由记录例外(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.md 与 agent.py 对照阅读,前者补全流程与场景,后者提供可运行的检查实现,二者与本文的 API 参考互为印证。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0632
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00