michaelochoaa/cloud-posture-scanner
GitHub: michaelochoaa/cloud-posture-scanner
一个对 AWS/Azure Terraform 配置进行静态扫描以检测错误配置,并将发现映射到 CIS Benchmark 和 NIST 800-53 合规控制项的云安全态势工具。
Stars: 0 | Forks: 0
# 云安全态势扫描器
在应用任何配置之前,对 AWS 和 Azure 的 Terraform (.tf) 源码进行静态扫描以查找错误配置,并将每个发现映射到 CIS Benchmark 控制项和 NIST SP 800-53 Rev. 5 控制项。
我开发这个工具是为了作为我在 Triple Point Security 所做的合规性文档工作的自动化配套,在那里我手动制作符合 NIST SP 800-53 Rev. 5 的安全与合规文档。这个工具能捕获文档旨在防止的错误配置——例如公开的 S3 存储桶、对互联网完全开放的安全组、未加密的数据库、过于宽泛的 IAM 策略——在它们执行 `terraform apply` 之前。
## 为什么对 Terraform 源码进行静态分析,而不是实时云扫描
该工具直接扫描 `.tf` 文件,而不是连接到实时的 AWS 或 Azure 账户。原因有二:首先,这意味着任何人都可以克隆此仓库并立即运行它,无需任何云凭证或成本;其次,在代码审查中(即在 `apply` 之前)捕获错误配置,绝对优于在资源已经存在于生产环境之后才捕获它。这与真正的 CSPM (Cloud Security Posture Management) 和 IaC 扫描工具所围绕构建的“左移”原则相同。
## 已实现的规则
| 规则 | 检查内容 | 严重性 | CIS Benchmark | NIST 800-53 |
|---|---|---|---|---|
| `S3_PUBLIC_ACL` | 带有 `acl = "public-read"` 或 `"public-read-write"` 的 S3 存储桶 | Critical | CIS AWS 2.1.1 | AC-3, AC-6 |
| `S3_PUBLIC_ACCESS_BLOCK_DISABLED` | `aws_s3_bucket_public_access_block` 中任何保护标志设置为 `false` | High | CIS AWS 2.1.4 | AC-3, AC-6 |
| `SG_OPEN_SENSITIVE_PORT` | 在端口 22 或 3389 上来自 `0.0.0.0/0` 的安全组入站规则 | Critical | CIS AWS 5.2/5.3 | SC-7, AC-4 |
| `UNENCRYPTED_STORAGE` | 未启用加密的 `aws_db_instance` / `aws_ebs_volume` | High | CIS AWS 2.2.1 | SC-28 |
| `IAM_WILDCARD_POLICY` | 授予 `Action: "*"` + `Resource: "*"` 的 IAM 策略 | Critical | CIS AWS 1.16 | AC-6, AC-6(1) |
| `AZURE_NSG_OPEN_INGRESS` | 允许在端口 22 或 3389 上从 `*`/`Internet` 入站的 Azure NSG 规则 | Critical | CIS Azure 6.2/6.3 | SC-7, AC-4 |
| `AZURE_STORAGE_PUBLIC_ACCESS` | 允许公开 blob 访问的 Azure 存储账户 | High | CIS Azure 3.7 | AC-3, AC-6 |
添加新规则只需在 `app/rules.py` 中定义一个函数并将其注册到 `ALL_RULES` 中,无需修改其他代码。
## 技术栈
Python, FastAPI, Pydantic v2, [python-hcl2](https://github.com/amplify-education/python-hcl2) (真正的 HCL2 解析,而非正则表达式), pytest。
## 快速开始
```
pip install -r requirements.txt
# 扫描故意配置错误的示例 (AWS + Azure):
python cli.py samples/insecure
# 扫描干净的 baseline 进行比较:
python cli.py samples/secure
# 或者运行 API:
uvicorn app.main:app --reload
```
### 示例:修改前后对比
`python cli.py samples/insecure` 在 6 个资源中发现了 6 个问题,其中 4 个 Critical,2 个 High,同时涵盖 AWS(公开的 S3 存储桶、开放的 SSH 安全组、未加密的 RDS 实例、通配符 IAM 策略)和 Azure(开放的 RDP 网络安全规则、公开的存储账户)。
`python cli.py samples/secure` 扫描了使用相同服务构建的 4 个资源,但配置了适当的控制措施(启用了公共访问阻止、安全组范围限定为私有 CIDR、开启了加密)并返回零发现。
## 项目结构
```
app/
parser.py # HCL2 parsing + normalization (strips quirks from the underlying grammar)
rules.py # one function per misconfiguration check, each mapped to CIS + NIST 800-53
scanner.py # runs every rule against every parsed resource
report.py # renders the Markdown compliance report
models.py # Pydantic schemas
main.py # FastAPI routes (scan a server-side path, or upload files directly)
cli.py # scan a local directory, no server needed
samples/
insecure/ # AWS + Azure resources with real misconfigurations
secure/ # the same services, configured correctly
tests/ # pytest suite
```
## 测试
```
pytest -q
```
14 个测试:每条规则包含一个正例和一个反例,外加集成测试(确认不安全样本会产生发现,而安全基线样本不会产生发现),以及端到端的 FastAPI 端点测试。
## 简化部分说明(以及生产版本会增加的内容)
规则检查主要查看 Terraform 源码中的字面量属性值。它们不会解析 Terraform variables、locals 或远程状态,因此如果某个安全组的 CIDR 来源于变量 (`cidr_blocks = [var.allowed_cidr]`),它将不会被评估为实际的运行时值。生产版本将集成 `terraform plan` 输出(其中变量已被解析)而不是原始源码,就像 Checkov 和 tfsec 等工具在执行深度检查时所做的那样。
## 数据说明
所有示例 Terraform 文件均专为本项目编写,不包含任何真实的基础设施、账户 ID 或特定于公司的配置。
标签:AWS, Azure, DPI, ECS, Terraform, 云安全态势管理, 云安全监控, 云计算, 前端应用, 安全规则引擎, 网络测绘, 规则引擎, 逆向工具, 静态分析