mohidev-tech/cspm-scanner
GitHub: mohidev-tech/cspm-scanner
一个轻量级、零凭证的 IaC 配置错误扫描器,静态解析 Terraform HCL 代码,将每个发现映射到 SOC2、NIST 800-53 和 CIS AWS 控制,并输出 SARIF 格式用于 CI 集成。
Stars: 0 | Forks: 0
# 🛡️ cspm-scanner
[](https://github.com/mohidev-tech/cspm-scanner/actions/workflows/ci.yml)
[](LICENSE)
[](https://go.dev/)
[](docs/compliance-mappings.md)
[](docs/compliance-mappings.md)
[](docs/compliance-mappings.md)
## 功能(实际终端输出)
```
$ cspm scan testdata/bad
[CRITICAL] S3 bucket has a public ACL
id: CSPM-AWS-S3-002
resource: aws_s3_bucket.logs
location: testdata/bad/main.tf:3
why: Public S3 ACLs are the #1 cloud-misconfig data-breach pattern — acl = public-read
fix: Set acl = "private" and pair with an "aws_s3_bucket_public_access_block".
maps to: SOC2 CC6.1, NIST 800-53 AC-3, CIS AWS 2.1.5
[CRITICAL] Security group exposes admin port to the internet
id: CSPM-AWS-EC2-001
resource: aws_security_group.open
location: testdata/bad/main.tf:9
why: Security groups allowing 0.0.0.0/0 on SSH (22) or RDP (3389)...
— ingress opens admin port to 0.0.0.0/0 (from=22 to=22)
fix: Restrict ingress to a VPN/bastion CIDR or use Systems Manager Session Manager.
maps to: SOC2 CC6.6, NIST 800-53 AC-4, CIS AWS 5.2
[HIGH] RDS instance is publicly accessible
id: CSPM-AWS-RDS-001
resource: aws_db_instance.db
...
summary: 6 findings (CRITICAL=2 HIGH=4 MEDIUM=0 LOW=0)
```
退出码为 `1` — `--fail-on` 默认为 `HIGH`。可直接将其投入 CI 使用。
## 为何选择此工具
| | **cspm-scanner** | checkov | tfsec | Snyk IaC |
|---|---|---|---|---|
| **价格** | 免费 (Apache 2.0) | 免费 | 免费(2023年归档) | 免费层 — 每月100次扫描 |
| **需要凭证** | ❌ 无需 | ❌ 无需 | ❌ 无需 | ✅ Snyk 账户 |
| **输出中的合规映射** | ✅ 每个发现映射 SOC2 + NIST + CIS | ⚠️ 仅标签 | ⚠️ 仅标签 | ✅ |
| **原生 SARIF 支持** | ✅ `--format sarif` | ✅ | ✅ | ✅ |
| **外部运行时依赖** | 仅 hcl/v2 | python + 多个 | go + 多个 | 专有 |
| **二进制文件大小** | ~6 MB 单一二进制 | ~120 MB python+依赖 | ~30 MB | 无 (SaaS模式) |
| **冷启动时间** | <50 ms | ~3 s | ~500 ms | 网络 |
| **添加新规则** | 一个 Go 文件,约40行 | Python 类层次结构 | Go + 接口 | 无 |
| **许可证** | Apache 2.0 | Apache 2.0 | MIT | 专有 |
这不是 checkov 的克隆。它是**最小型的扫描器,将每个发现映射到审计友好的控制ID**,原生输出 SARIF,且零非 Go 依赖。将二进制文件放入任何 CI 运行器,即可运行。
## 快速开始
### 选项1 — 一行命令安装
```
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/mohidev-tech/cspm-scanner/main/install.sh | sh
# Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/mohidev-tech/cspm-scanner/main/install.ps1 | iex
```
### 选项2 — go install
```
go install github.com/mohidev-tech/cspm-scanner/cmd/cspm@latest
```
### 运行
```
cspm scan ./infra/terraform # default: console + fail on HIGH
cspm scan --format json ./infra # machine-readable
cspm scan --format sarif ./infra > cspm.sarif
cspm scan --fail-on CRITICAL ./infra # gentler gate
cspm list-checks # what's in the catalog?
```
## 检测内容
| 检查ID | 严重级别 | 检测内容 | 映射到 |
|---|---|---|---|
| `CSPM-AWS-S3-001` | 高 | S3 存储桶未配置 `server_side_encryption_configuration` | SOC2 CC6.7 · NIST SC-28 · CIS AWS 2.1.1 |
| `CSPM-AWS-S3-002` | 严重 | S3 存储桶 ACL 为 `public-read` / `public-read-write` | SOC2 CC6.1 · NIST AC-3 · CIS AWS 2.1.5 |
| `CSPM-AWS-EC2-001` | 严重 | 安全组允许 `0.0.0.0/0` 入站 SSH/RDP | SOC2 CC6.6 · NIST AC-4 · CIS AWS 5.2 |
| `CSPM-AWS-RDS-001` | 高 | RDS 实例 `publicly_accessible = true` | SOC2 CC6.6 · NIST SC-7 · CIS AWS 2.3.3 |
| `CSPM-AWS-RDS-002` | 高 | RDS 实例 `storage_encrypted = false`(默认行为!) | SOC2 CC6.7 · NIST SC-28 · CIS AWS 2.3.1 |
| `CSPM-AWS-IAM-001` | 高 | IAM 策略包含 Allow 操作的 `"Action": "*"` 或 `"Resource": "*"` | SOC2 CC6.1 · NIST AC-6 · CIS AWS 1.16 |
路线图:GCP、Azure、Kubernetes 清单、与云实时状态对比的漂移检测。每个项目作为独立的卫星项目实现。
## 在 CI 中使用
### GitHub Actions — 失败门槛设为 HIGH,上传到安全选项卡
```
- name: cspm scan
run: |
curl -fsSL https://raw.githubusercontent.com/mohidev-tech/cspm-scanner/main/install.sh | sh
cspm scan --format sarif --output cspm.sarif --fail-on HIGH ./infra
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: cspm.sarif
category: cspm
```
### GitLab CI
```
cspm:
image: golang:1.22-alpine
script:
- go install github.com/mohidev-tech/cspm-scanner/cmd/cspm@latest
- cspm scan --format json --output cspm.json --fail-on HIGH infra/
artifacts:
paths: [cspm.json]
```
### Pre-commit 钩子
```
# .pre-commit-config.yaml
- repo: local
hooks:
- id: cspm
name: cspm-scanner
entry: cspm scan --fail-on CRITICAL
language: system
pass_filenames: false
files: \.tf$
```
## 设计选择
| 选择 | 原因 |
|---|---|
| 通过 `hcl/v2` 扫描**源代码文本**,而非 `terraform show -json` | CI 中零凭证需求。PR 反馈时间 <1s。适用于任何 IaC 仓库,无需云账户状态。[ADR 0001](docs/adr/0001-hcl-source-text-over-evaluated-plan.md) |
| **一个检查 = 一个 Go 文件** | 新规则只需约40行代码的 PR;审查时只需阅读一个文件 |
| **合规映射直接内嵌在 `Check` 接口中** | 输出即符合审计要求,不仅面向开发者 — 每个发现都会列出其违反的 SOC2/NIST/CIS 控制项 |
| **将 SARIF 作为一等输出** | 工程师通常关注 GitHub 安全选项卡,无需额外仪表盘 |
| **使用标准库 `flag`,不依赖 cobra** | 仅一个外部依赖 (hcl/v2)。单二进制文件约 6 MB |
## 已知限制 — 明确记录,不隐藏
我们**有意**不扫描已评估的 Terraform 计划。这意味着:
- `publicly_accessible = var.expose_db` **不会被检测到**(我们不解析 `var.expose_db`)。
- 模块输出流入资源的情况**不会被检测到**。
- AWS 账户实时状态的漂移**不会被检测到** — 这是一个静态扫描器,而非 CSPM 即服务。
如果需要这些功能,请搭配 `terraform show -json | trivy iac`(可解析变量)和运行时 CSPM 工具(如 Prowler、Cloud Custodian)来检测账户实时状态漂移。[ADR 0001](docs/adr/0001-hcl-source-text-over-evaluated-plan.md) 详细说明了这一权衡。
## 在本项目组合中的定位
| 仓库 | 功能 | 关联 |
|---|---|---|
| **[devsecops-platform](https://github.com/mohidev-tech/devsecops-platform)** | 集群 + 安全应用 | 包含自己的 Terraform — 由 cspm-scanner 扫描 |
| **[secure-supply-chain](https://github.com/mohidev-tech/secure-supply-chain)** | Cosign 签名的镜像 + 准入验证 | 构建平台准入的镜像 |
| **cspm-scanner** *(本仓库)* | 验证构建平台所用的 IaC | 形成闭环:IaC → 构建 → 发布 → 准入 |
## 贡献指南
欢迎提交 PR。详见 [CONTRIBUTING.md](CONTRIBUTING.md)。如需私下报告安全漏洞,请参阅 [SECURITY.md](SECURITY.md)。
## 许可证
Apache 2.0 — 详见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
标签:CIS AWS, CI集成, EVTX分析, GitHub Code Scanning, Go语言, GraphQL安全矩阵, HCL解析, NIST 800-53, SARIF, SOC2, 云安全监控, 合规映射, 基础设施即代码安全, 安全扫描器, 开源, 日志审计, 程序破解, 配置扫描, 零凭证, 静态分析