aws-samples/sample-compliance-lens

GitHub: aws-samples/sample-compliance-lens

一个 AWS 原生的无服务器解决方案,用于跨 AWS 组织分析 Config 快照合规态势,比对一致性包规则并通过 QuickSight 仪表板可视化合规评分与缺失规则。

Stars: 3 | Forks: 0

# Compliance Lens [![License: MIT-0](https://img.shields.io/badge/License-MIT--0-blue.svg)](LICENSE) Compliance Lens 是一个 AWS 原生的 serverless 解决方案,用于分析跨 AWS Organization 的 AWS Config 快照。它提取 Config 规则评估结果,将其与 [AWS Config Rules](https://github.com/awslabs/aws-config-rules) GitHub 仓库中的一致性包规则集进行比较,并通过 Amazon QuickSight 仪表板可视化合规态势。 ## 目录 1. [架构](#architecture) 2. [前提条件](#prerequisites) 3. [部署](#deployment) 4. [使用说明](#usage) 5. [成本](#cost) 6. [安全](#security) 7. [故障排除](#troubleshooting) 8. [常见问题](#faq) 9. [在未使用 Control Tower 的情况下使用](#using-without-control-tower) 10. [清理](#cleanup) 11. [贡献](#contributing) 12. [安全问题](#security-issues) 13. [许可证](#license) ## 架构 ![Architecture](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7d20beb6b9195828.png) ### 创建的资源 - AWS Step Functions 状态机(夜间流水线) - AWS Lambda 函数(5 个应用程序函数 + 1 个 custom-resource 辅助函数) - Amazon EventBridge 规则(S3 对象创建触发器 + 夜间计划) - Amazon S3 存储桶(5 个:精炼配置数据、合规结果、Athena 结果、OU 映射、访问日志) - Amazon DynamoDB 表(合规规则,已启用时间点恢复) - Amazon Athena 工作组、AWS Glue 数据库和表 - Amazon QuickSight 数据源、数据集、分析和仪表板(可选的二次部署) - AWS IAM 角色(每个函数的最小权限、跨账户读取、QuickSight 服务、EventBridge) ### Lambda 函数 | 函数 | 用途 | |---|---| | SourceSnapshot | 当新的 Config 快照存入源 S3 存储桶时由 EventBridge 触发。解压数据并将其重构到精炼 S3 存储桶中。 | | MapAccountOU | 通过跨账户角色代入管理账户,获取 OU/账户层级结构,将 CSV 写入 S3。 | | ParseConfigRules | 从 AWS Config Rules GitHub 仓库获取一致性包 YAML,填充 DynamoDB,并触发 Athena 视图创建。 | | QueryConfigData | 根据合规标准将账户评估结果与所需规则进行匹配,将 CSV 结果写入 S3。 | | IdentifyMissingRules | 根据合规标准识别每个账户/区域中未启用的规则,将 CSV 写入 S3。 | 还部署了一个额外的辅助 Lambda 作为 CloudFormation custom resource:`AthenaViewCreationLambda`,用于创建 Config 数据的 Athena 视图。 ### 工作流 1. EventBridge 在 UTC 时间 00:00 触发夜间的 Step Functions 状态机 2. **MapAccountOU** — 通过跨账户角色获取 OU/账户层级结构,将 CSV 写入 S3 3. **ParseConfigRules** — 从 GitHub 获取一致性包,填充 DynamoDB,运行 Athena 视图查询 4. 并行执行: - **QueryConfigData** — 将评估结果与所需规则进行匹配,将 CSV 写入 S3 - **IdentifyMissingRules** — 识别每个账户缺失的规则,将 CSV 写入 S3 5. QuickSight SPICE 数据集从 S3 和 Athena 刷新 每当源 S3 存储桶中有新的 Config 快照到达时,单独的 EventBridge 规则会触发 **SourceSnapshot**。 ## 前提条件 - **AWS Config 快照已交付到集中的 S3 存储桶。** 该解决方案处理标准的 AWS Config 快照文件(在 S3 键路径中包含 `ConfigSnapshot/` 的 gzip 压缩 JSON)。实现此目的的最常见方法是使用 [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/setting-up.html),它会自动将 Config 快照交付到集中的 Log Archive 存储桶。或者,您可以配置 [AWS Config delivery channel](https://docs.aws.amazon.com/config/latest/developerguide/manage-delivery-channel.html) 将快照交付到任何 S3 存储桶 — 请参阅下面的[在未使用 Control Tower 的情况下使用](#using-without-control-tower)。 - 一个 [AWS Organization](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html),并且可以访问 **管理账户**(以部署跨账户角色)和 **Log Archive** 或专用账户(以部署解决方案) - [AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) 1.100+ 和 [AWS CLI v2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - Python 3.12 和 Docker(由 `sam build` 用于容器化构建) - [Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/setting-up.html) 企业版,至少有一个 Author 用户 - 解决方案部署账户中的 IAM 权限,用于创建 S3、Lambda、Step Functions、EventBridge、Athena、Glue、DynamoDB、IAM 和 QuickSight 资源 ### 支持的区域 Compliance Lens 旨在部署在单个区域中。默认且推荐的区域是 `us-east-1`。无论部署区域在哪里,组织中所有已启用区域的 Config 数据都会被处理。 ## 部署 ### 0. 克隆仓库 ``` git clone https://github.com/aws-samples/sample-compliance-lens.git cd sample-compliance-lens ``` ### 1. 部署跨账户角色(管理账户) 此角色允许解决方案读取您的 AWS Organization 结构。请在您的**管理账户**中部署它。 ``` # 确保您的 AWS CLI 已为 Management Account 进行配置 aws cloudformation create-stack \ --stack-name compliance-lens-cross-account-role \ --template-body file://organization_readonly_role.yaml \ --capabilities CAPABILITY_NAMED_IAM \ --parameters ParameterKey=TargetAWSAccountNumber,ParameterValue= aws cloudformation wait stack-create-complete \ --stack-name compliance-lens-cross-account-role ``` 将 `` 替换为您将部署解决方案的 AWS 账户 ID(通常是您的 Log Archive 账户)。 ### 2. 部署解决方案(Log Archive 或专用账户) 将您的 AWS CLI 切换到 **Log Archive 或专用账户**,然后执行: ``` cp samconfig.toml.example samconfig.toml ``` 编辑 `samconfig.toml` 并设置所需的参数: | 参数 | 描述 | |---|---| | `ManagementAccountID` | 您的 AWS 管理账户 ID(例如,`123456789012`) | | `QuickSightUser` | 将拥有仪表板的 QuickSight 用户(例如,`Admin/user@example.com`) | | `ConfigSnapshotBucket` | 接收 AWS Config 快照的 S3 存储桶。对于 Control Tower 环境,这是 Control Tower Config 日志存储桶(例如,`aws-controltower-config-logs-123456789012-us-east-1`)。对于手动 Config 交付,请使用您在交付通道中配置的存储桶。 | 然后构建并部署: ``` sam build && sam deploy ``` 此过程大约需要 5-10 分钟。一旦 Glue 表包含数据(在第一次夜间运行之后),部署 QuickSight: ``` sam build && sam deploy --parameter-overrides DeployQuickSight=true ``` ### 3. KMS 密钥策略(如果适用) 如果 Config 快照存储桶使用客户托管的 KMS 密钥进行加密,请将以下语句添加到密钥策略中,以便 `SourceSnapshot` Lambda 可以解密 Config 快照: ``` { "Sid": "AllowComplianceLensSourceSnapshotDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:::role/" }, "Action": "kms:Decrypt", "Resource": "*" } ``` 在 CloudFormation 堆栈输出中或在 IAM 控制台的 `compliance-lens-*-SourceSnapshotRole-*` 下找到物理角色名称。 ## 使用说明 ### 访问仪表板 Config 快照每 24 小时创建一次。请至少等待部署 24 小时后,数据才会出现。 要手动触发处理: 1. 打开 Step Functions 控制台 2. 找到 `QueryConfigDataStateMachine` 3. 使用默认输入 `{}` 启动一次执行 ![QuickSight Dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/837cfae730195829.png) ### 仪表板选项卡 **摘要** — 合规分数仪表、带下钻功能的评估环形图以及详细的评估表。按 OU、账户、区域或一致性包进行筛选。 **缺失规则** — 按账户显示缺失规则的条形图、按合规标准显示的饼图以及详细表格。按 OU、合规标准或区域进行筛选。 ### 编辑仪表板 1. 在 QuickSight 中打开 `Compliance Lens Analysis` 2. 进行更改 3. **共享** → **发布仪表板** → 选择 `Compliance Lens Dashboard` → **发布** ### 自定义规则集 直接将自定义合规规则添加到 DynamoDB `ComplianceRulesTable`: ``` { "compliance": { "S": "" }, "configRules": { "M": { "configRules": { "L": [ { "S": "" }, { "S": "" } ] } } } } ``` 然后运行 Step Functions 状态机以处理新规则。 ## 成本 估算假设为单账户、单区域部署并进行每日处理。实际成本取决于组织规模和数据量。 | AWS 服务 | 备注 | 预估成本 | |---|---|---| | Amazon QuickSight | 企业版(1 个 Author + 读者) | ~$18–24/月 | | Amazon S3 | Config 数据、结果、映射、访问日志 | ~$1–5/月 | | AWS Lambda | 夜间 + 快照处理 | 免费套餐 / 可忽略不计 | | AWS Step Functions | 夜间执行 | 免费套餐 / 可忽略不计 | | Amazon DynamoDB | 合规规则表(预置,低吞吐量) | 免费套餐 / 可忽略不计 | | Amazon Athena | Config 数据查询 | ~$0.10–1/月 | | Amazon EventBridge | 两条规则 | 免费套餐 | | AWS Glue | 仅数据目录 | 免费 | 使用 [AWS 定价计算器](https://calculator.aws/) 获取针对您环境的定制估算。 ## 安全 - **最小权限 IAM** — 每个 Lambda 都有专用角色和特定的资源 ARN - **静态加密** — 启用 DynamoDB SSE,S3 存储桶使用 AES256 - **传输中加密** — 所有 S3 存储桶策略拒绝非 TLS 请求 - **DynamoDB 时间点恢复** — 在合规规则表上启用 - **S3 公共访问 blocked** — 所有存储桶强制私有访问 - **S3 访问日志** — 专用日志存储桶捕获对数据存储桶的访问 - **并发限制** — 所有 Lambda 函数设置 `ReservedConcurrentExecutions` - **跨账户安全** — 具有最小 AWS Organizations 权限的只读角色 - **X-Ray 追踪** — 为 Lambda 和 API 调用启用 ## 故障排除 ### 24 小时后仪表板仍无数据 1. 打开 Step Functions 控制台 → `QueryConfigDataStateMachine` → 启动执行 2. 等待完成(约 5-10 分钟) 3. 刷新 QuickSight 数据集 ### 状态机失败 | 错误 | 原因 | 修复方法 | |---|---|---| | Lambda 超时 | 数据量大 | 在 `template.yaml` 中增加超时/内存 | | S3 访问被拒绝 | 客户托管的 KMS 密钥策略 | 按照部署步骤 3 更新 KMS 密钥策略 | | `AWSOrganizationsNotInUseException` | 跨账户角色缺失或范围不正确 | 验证角色在管理账户中存在并信任解决方案账户 | ### QuickSight 数据集刷新失败 1. 验证 S3 存储桶包含预期的 CSV 输出 2. 检查合规结果和 OU 映射存储桶上的 QuickSight 服务角色权限 3. 验证 Glue 表是否存在(Glue 控制台 → 数据库 → `config`) ## 常见问题 **我需要哪些账户?** 管理账户(跨账户角色)和 Log Archive 或专用账户(解决方案)。 **在没有 Control Tower 的情况下可以使用吗?** 可以。该解决方案需要将 AWS Config 快照交付到 S3 存储桶 — 它不调用任何 Control Tower API。Control Tower 是最简单的方式,因为它会自动配置此功能,但您也可以手动设置 Config 快照交付。请参阅[在未使用 Control Tower 的情况下使用](#using-without-control-tower)。 **数据多久刷新一次?** Config 快照每 24 小时到达一次。Step Functions 每晚在 UTC 时间 00:00 运行。QuickSight SPICE 数据集每天刷新。 **支持多区域吗?** 是的。处理所有已启用区域的 Config 数据。仪表板支持区域筛选。 **我可以导出数据吗?** 可以 — 通过 QuickSight CSV 导出、直接 S3 访问结果存储桶或 Athena 查询。 **这会修改我的 AWS Config 吗?** 不会。该解决方案仅具有对 Config 快照数据的只读访问权限。 **如何更新?** 拉取最新代码,运行 `sam build && sam deploy`。 ## 在未使用 Control Tower 的情况下使用 如果您不使用 AWS Control Tower,可以配置 AWS Config 将快照直接交付到 S3 存储桶。该解决方案仅需要: 1. 在您将部署 Compliance Lens 的账户中拥有 **一个 S3 存储桶** 2. 在您要监控的每个账户/区域中启用 **AWS Config recording** 3. **一个 Config delivery channel**,将快照写入该存储桶并在 S3 键路径中包含 `ConfigSnapshot/` ### 设置步骤 1. 在您的集中账户中创建一个 S3 存储桶(或使用现有的)。 2. 在您要监控的每个账户中,配置一个 [Config delivery channelhttps://docs.aws.amazon.com/config/latest/developerguide/manage-delivery-channel.html) 以将快照交付到该存储桶。您可以使用 AWS CLI: aws configservice put-delivery-channel \ --delivery-channel name=default,s3BucketName=,configSnapshotDeliveryProperties={deliveryFrequency=TwentyFour_Hours} 3. 在存储桶上启用 [S3 EventBridge notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventBridge.html),以便在新快照到达时触发 `SourceSnapshot` Lambda。 4. 部署 Compliance Lens,并将 `ConfigSnapshotBucket` 参数设置为您的存储桶名称。 关键要求是快照对象在 S3 键路径中包含 `ConfigSnapshot/` 并使用标准的 AWS Config 快照 JSON 格式。AWS Config 的内置交付通道会自动生成这种格式。 ## 清理 ``` # 删除解决方案堆栈(Log Archive 或专用账户) sam delete # 删除跨账户角色(Management Account) aws cloudformation delete-stack --stack-name compliance-lens-cross-account-role ``` 如果 S3 存储桶中包含数据,请在运行 `sam delete` 之前将其清空;CloudFormation 无法删除非空存储桶。 ## 安全问题 如果您在本项目中发现潜在的安全问题,请通过 [vulnerability reporting page](https://aws.amazon.com/security/vulnerability-reporting/) 通知 AWS/Amazon Security。请**不要**创建公开的 GitHub issue。 ## 许可证 本库基于 MIT-0 许可证授权。请参阅 [LICENSE](LICENSE) 文件。
标签:Amazon Athena, Amazon DynamoDB, Amazon QuickSight, Amazon S3, AWS, AWS Config, AWS Control Tower, AWS IAM, AWS Lambda, AWS Organizations, AWS Step Functions, C语言, DevSecOps, DPI, GitHub开源项目, Serverless, 上游代理, 云基础设施, 合规性分析, 合规报告, 安全仪表盘, 安全态势管理, 自动化运维, 逆向工具