sudoNaji/devsec-vault-cli
GitHub: sudoNaji/devsec-vault-cli
一款基于 Git 原生的密钥泄露检测 CLI 工具,通过多层防御策略在代码提交前、CI 流水线和历史记录中捕获敏感凭证,防止密钥泄露事件发生。
Stars: 0 | Forks: 0
# DevSec Vault
## 为什么选择 DevSec Vault?
密钥泄露是导致云泄露的头号原因。DevSec Vault 实现了一个**纵深防御**流水线,可在开发生命周期的每个阶段捕获密钥——在提交之前,在推送之前,以及追溯检查仓库历史。
## 检测层
```
Developer workstation
│
├── [Layer 1] pre-commit hook ──── devsec-vault staged
│ └── Blocks commit if staged diff contains a secret
│
├── [Layer 2] detect-secrets ──── baseline-driven allowlist
│ └── Catches additional patterns not in our regex set
│
▼
Git push
│
├── [Layer 3] GitHub Push Protection
│ └── Server-side block for 200+ known token types
│
├── [Layer 4] GitHub Secret Scanning
│ └── Full-history scan across all branches
│
▼
Pull Request / CI (GitHub Actions)
│
├── [Layer 5] devsec-vault scan ── file + directory scan, SARIF upload
├── [Layer 6] devsec-vault history ─ full commit history scan
├── [Layer 7] CodeQL ── static analysis (security-and-quality)
└── [Layer 8] pip-audit ── dependency CVE check
│
▼
Release
│
└── [Layer 9] Artifact Attestation + OpenSSF Scorecard
```
## 快速开始
```
# Clone
git clone https://github.com/your-org/devsec-vault
cd devsec-vault
# Install
pip install click rich
# 安装 pre-commit hooks
pip install pre-commit
pre-commit install
# 运行扫描
python src/cli.py scan src/
# 扫描 git 历史
python src/cli.py history --max-commits 200
# 扫描暂存更改
python src/cli.py staged
```
## CLI 参考
### `scan` — 扫描文件或目录
```
python src/cli.py scan [OPTIONS] TARGETS...
Options:
--format [text|json|sarif] Output format (default: text)
--output PATH Write report to file
--baseline PATH Allowlist baseline file
--min-severity LEVEL CRITICAL|HIGH|MEDIUM|LOW (default: LOW)
--fail-on [any|high|critical|never] Exit-1 threshold (default: any)
--no-entropy Disable entropy heuristic
--max-file-size KB Skip files larger than N KB (default: 500)
```
### `staged` — Pre-commit 门禁
```
python src/cli.py staged [--repo PATH] [--format text|json|sarif]
```
如果在暂存区的 diff 中发现密钥,将返回退出代码 1 并阻止提交。
### `history` — 完整的 git 历史扫描
```
python src/cli.py history [--max-commits 500] [--format sarif] [--output history.sarif]
```
检查从所有分支可达的每一次提交。
### `baseline` — 允许列表管理
```
# 基于当前发现生成 baseline(全部标记为 accepted)
python src/cli.py baseline generate src/ --output .devsec-baseline.json
# 显示相对于 baseline 的新内容 (regressions)
python src/cli.py baseline diff src/
# 查看 baseline 内容
python src/cli.py baseline show
```
### `report` — 重新渲染已保存的报告
```
python src/cli.py report report.json --format sarif --output results.sarif
python src/cli.py report report.json --format metrics
```
### `info` — 显示已加载的检测规则
```
python src/cli.py info
```
## 检测覆盖范围
| 规则 | 严重级别 | 捕获内容 |
|------|----------|-----------------|
| `AWS_ACCESS_KEY_ID` | CRITICAL | `AKIA...` AWS 访问密钥 |
| `AWS_SECRET_KEY` | CRITICAL | AWS 秘密访问密钥 |
| `GITHUB_PERSONAL_TOKEN` | CRITICAL | `ghp_...` PATs |
| `GITHUB_OAUTH_TOKEN` | HIGH | `gho_...` OAuth token |
| `GITHUB_APP_TOKEN` | HIGH | `ghs_/ghu_` 应用 token |
| `STRIPE_SECRET_KEY` | CRITICAL | `sk_live_/sk_test_` |
| `RSA_PRIVATE_KEY` | CRITICAL | PEM 私钥头 |
| `OPENSSH_PRIVATE_KEY` | CRITICAL | OpenSSH 私钥 |
| `DB_CONN_STRING` | CRITICAL | `postgres://user:pass@host/db` |
| `GCP_API_KEY` | HIGH | `AIza...` Google API 密钥 |
| `AZURE_CLIENT_SECRET` | CRITICAL | Azure 客户端密钥 |
| `SLACK_TOKEN` | HIGH | `xoxb-/xoxp-` token |
| `JWT_TOKEN` | HIGH | `eyJ...` JWTs |
| `HIGH_ENTROPY` | HIGH | 香农熵 ≥ 4.2 启发式判断 |
| … +10 更多 | MEDIUM–HIGH | Stripe pub, Discord, NPM, PyPI… |
## 分支保护策略
`main` 分支受以下策略保护:
- ✅ 必须提交 Pull Request(1 个批准的审查)
- ✅ 必需的状态检查:`test`, `secret-scan`, `codeql`
- ✅ 签名提交(GPG/SSH)— 未签名的提交将被拒绝
- ✅ 禁止强制推送 · 禁止删除 · 保持线性历史
- ✅ 包含管理员
有关完整的规则集 JSON,请参阅 [`policies/branch-protection.md`](policies/branch-protection.md)。
## 攻击演示
### 被阻止的提交(本地)
```
$ echo 'AWS_KEY=AKIAIOSFODNN7EXAMPLE' >> src/config.py
$ git add src/config.py && git commit -m "test"
DevSec Vault — staged secret scan.......................Failed
- hook id: devsec-vault-staged
- exit code: 1
Severity Rule Line Masked Value
CRITICAL AWS_ACCESS_KEY_ID 1 AKIA****MPLE
✗ Secret(s) detected in staged changes — commit blocked.
```
### 被阻止的推送(GitHub Push Protection)
```
remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: - Push cannot contain secrets
remote: —— Amazon AWS Access Key ID ——
remote: locations: src/config.py:1
remote:
To https://github.com/your-org/devsec-vault
! [remote rejected] feature/add-config -> main (push declined due to repository rule violations)
```
## 威胁模型
有关涵盖资产、威胁行为者和缓解措施的完整威胁模型,请参阅 [`policies/threat-model.md`](policies/threat-model.md)。
## 指标
跟踪一段时间内的安全态势:
```
python src/cli.py report report.json --format metrics
```
```
{
"total_findings": 0,
"by_source": {},
"by_severity": {},
"clean_targets": 42,
"targets_scanned": 42
}
```
| 指标 | 目标 |
|--------|--------|
| 本地捕获的密钥 | 全部 |
| 被 Push Protection 阻止的密钥 | 0 个到达远程 |
| 未修复的依赖 CVE | 0 个 CRITICAL,<5 个 HIGH |
| 未签名的提交 | `main` 上为 0 |
| 待处理的 CodeQL 警报 | 0 个 CRITICAL/HIGH |
## 供应链安全
- 每次发布都会生成**制品证明**(通过 SLSA 实现构建来源证明)
- 仓库中的 **OpenSSF Scorecard** 徽章 — 衡量分支保护、签名发布和 token 权限
- 任何云部署均使用 **OIDC** — 不在 GitHub Secrets 中存储长期有效的凭证
## 运行测试
```
pytest tests/ -v
```
## 许可证
MIT
标签:CI/CD安全扫描, CodeQL, DevSecOps, GitHub Actions, JSONLines, LNA, OpenSSF, Python, SARIF, SAST, StruQ, 上游代理, 依赖项安全检查, 安全助手, 安全评估工具, 密钥泄露防护, 开发安全, 提示注入防御, 无后门, 机器学习安全, 机密信息检测, 源代码安全, 盲注攻击, 策略即代码, 聊天机器人安全, 自动笔记, 逆向工具, 错误基检测, 零信任, 静态代码分析