Prakashgode/cloud-cspm
GitHub: Prakashgode/cloud-cspm
一款轻量级 AWS 云安全态势管理 CLI 工具,基于 CIS 标准扫描核心服务的安全配置错误,支持跨账户扫描和多格式报告导出。
Stars: 1 | Forks: 0
# Cloud CSPM

Cloud CSPM 是一个轻量级的 AWS Cloud Security Posture Management CLI,用于扫描 IAM、S3、EC2、RDS、日志记录、Lambda 和 Secrets Manager 中的 CIS 式安全配置错误。它支持通过 STS AssumeRole 进行跨账户扫描,使用 `boto3`、`click` 和 `rich`,并包含现代 Python 项目元数据、CI 工作流和原生 SARIF 导出。



## 扫描内容
| 扫描器 | 检查项 |
|---------|--------|
| IAM | Root MFA、密码策略、未使用的凭证、密钥轮换、控制台用户 MFA |
| S3 | 公有访问块、加密、版本控制、访问日志、SSL 强制执行 |
| EC2 | 开放的 SSH/RDP、危险端口、默认安全组、EBS 加密、公有实例 |
| RDS | 加密、公有访问、Multi-AZ、自动升级、备份保留、删除保护 |
| Logging | CloudTrail 启用、日志验证、KMS 加密、VPC flow logs |
| Lambda | 公有访问、环境 KMS 加密、VPC 附加、multi-AZ 子网、标签、X-Ray tracing |
| Secrets Manager | 启用轮换、近期轮换、近期访问、标签 |
## 要求
- Python 3.11 到 3.14
- 通过 `aws configure` 或环境变量配置的 AWS 凭证
- 只读 AWS 访问权限,例如 `SecurityAudit` 托管策略
- 如果要扫描不同的 AWS 账户,需要 `sts:AssumeRole` 权限
## 快速开始
推荐使用 `uv` 的工作流:
```
git clone https://github.com/Prakashgode/cloud-cspm.git
cd cloud-cspm
uv sync --locked --all-extras --dev
uv run cloud-cspm
```
使用 `pip` 的备选方案:
```
python -m venv .venv
# Linux/macOS: source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
pip install -e ".[dev]"
cloud-cspm
```
您仍然可以使用 `python cspm.py` 直接运行源入口点。
## 使用方法
```
# 运行所有
cloud-cspm
# 特定 profile
cloud-cspm --profile production
# 单个 region
cloud-cspm --region us-east-1
# 特定 scanner
cloud-cspm --scanner iam --scanner s3
cloud-cspm --scanner lambda --scanner secrets
# 按严重性筛选
cloud-cspm --severity CRITICAL
# 导出结果
cloud-cspm --output report.json
cloud-cspm --output report.csv
cloud-cspm --output report.sarif
```
## 示例报告
示例工件已提交至:
- [`samples/demo-report.json`](samples/demo-report.json)
- [`samples/demo-report.csv`](samples/demo-report.csv)
- [`samples/demo-report.sarif`](samples/demo-report.sarif)
SARIF 工件仅包含可操作的 `FAIL` 和 `ERROR` 发现,这对于机器处理和下游安全工具非常有用。
此 SARIF 导出针对 AWS 资源 URI 而非仓库文件对发现进行建模。它旨在作为云安全 pipeline 的通用交换格式,而不是 GitHub code-scanning 上传格式。
使用以下命令在本地重新生成演示资产:
```
uv run python scripts/generate_sample_artifacts.py
```

## 跨账户扫描
使用 STS AssumeRole 通过相同的 CLI 扫描不同的 AWS 账户:
```
cloud-cspm \
--profile security-audit \
--role-arn arn:aws:iam::123456789012:role/SecurityAudit
```
如果目标角色需要外部 ID:
```
cloud-cspm \
--profile security-audit \
--role-arn arn:aws:iam::123456789012:role/SecurityAudit \
--external-id cspm-demo
```
## 开发
安装完整的开发环境:
```
uv sync --locked --all-extras --dev
```
在本地运行质量门:
```
uv run ruff format .
uv run ruff check .
uv run mypy
uv run pytest -v
```
该仓库包含:
- 用于项目元数据和工具配置的 `pyproject.toml`
- 用于可复现依赖解析的 `uv.lock`
- 用于 linting 和导入排序的 Ruff
- 用于基本类型检查的 mypy
- 在 Python 3.11 到 3.14 上进行 GitHub Actions 矩阵测试
- 用于 pip 和 GitHub Actions 更新的 Dependabot
- 对 pull requests 的依赖项审查
- 用于下游安全工具的原生 SARIF 导出
- 用于 AWS 模拟器覆盖的 moto 支持的集成测试
- 用于仓库维护的 `SECURITY.md`、`LICENSE` 和 `CONTRIBUTING.md`
## 项目结构
```
cloud-cspm/
|-- assets/
|-- cspm.py
|-- samples/
|-- scripts/
|-- pyproject.toml
|-- uv.lock
|-- scanners/
|-- reports/
|-- policies/
|-- tests/
`-- .github/workflows/
```
## 添加扫描器
继承 `BaseScanner` 并调用 `self.add_finding(...)`:
```
from scanners.base_scanner import BaseScanner, Severity, Status
class MyScanner(BaseScanner):
def scan(self):
self.add_finding(
check_id="CUSTOM-1",
check_name="My Check",
status=Status.FAIL,
severity=Severity.HIGH,
resource_id="resource-123",
resource_type="AWS::Service::Resource",
region="us-east-1",
description="Description of the finding",
remediation="How to fix it",
)
return self.findings
```
## 许可证
MIT
标签:Anthropic, AWS安全, boto3, CISA项目, CIS基准, Click, CloudTrail监控, CSPM, DevSecOps, EC2安全检查, IAM安全, Lambda安全, LNA, PE 加载器, Python安全工具, RDS加密, Rich, S3存储安全, SARIF导出, Secrets Manager, TinkerPop, 上游代理, 云安全态势管理, 前端应用, 安全合规扫描, 跨账号扫描, 逆向工具