isaaaac-2/secrets-audit-cli
GitHub: isaaaac-2/secrets-audit-cli
一款面向 DevSecOps 的 CLI 工具,递归扫描代码库中的硬编码 secrets 并通过本地数据库全程跟踪修复状态,同时以自门控流水线阻断不安全推送。
Stars: 1 | Forks: 0
# secrets-audit-cli
一款安全优先的 CLI 工具,用于扫描代码库中的硬编码 secrets、API keys、private keys 以及配置错误的 environment variables。扫描结果会记录在本地 SQLite 数据库中,包含严重性分级、修复状态和风险接受说明,为团队提供从检测到解决的清晰审计追踪。
本项目作为一个 DevSecOps 作品集项目构建,旨在演示安全开发实践、CI/CD pipeline 门控、容器安全扫描和基础设施即代码(infrastructure-as-code)加固。
## 我在解决什么问题?
Secrets 不断泄露到代码库中。大多数团队是在部署后、审计期间,甚至更糟的违规事件发生后才发现它们。现有工具要么只标记问题而不跟踪修复情况,要么需要昂贵的 SaaS 平台。本项目填补了这一空白,提供了一个轻量级、自包含的扫描器,可直接作为安全门禁集成到 CI/CD pipeline 中。
## 为什么这很重要?
只有将安全扫描融入开发人员已经在使用的工作流中,它才能发挥作用。独立的扫描器往往会被忽视;而一个能够阻止不安全推送、并全程跟踪扫描结果直至解决的 pipeline 门禁,才能真正改变行为。本项目证明了:安全可以是自动化的、可审计的、对开发人员友好的,且不会增加阻力。
## 功能
- 递归扫描目录以查找多种类型的 secret(AWS keys、通用 API keys、private keys、连接字符串、硬编码密码、env var 泄露)
- 可配置的基于 regex 的检测,带有严重性级别(Critical、High、Medium、Low)
- 跟踪修复生命周期:open → in-progress → resolved / risk-accepted
- 存储审查人员备注,并在写入数据库前对检测到的值进行掩码处理
- 按严重性和状态生成摘要报告
- 通过 GitHub Actions 实现的自门控 CI/CD pipeline,可阻止包含未解决 critical 发现的推送
- 使用 Docker 进行容器化,并使用 Trivy 作为构建门禁进行扫描
- 每次推送时均使用 Semgrep(p/security-audit 规则集)进行静态分析
## 技术栈
- 后端:FastAPI
- CLI:Typer
- 数据库:SQLite(带有 CHECK 约束和自动时间戳)
- 容器化:Docker
- CI/CD:GitHub Actions(自门控安全 pipeline)
- 安全工具:Trivy(容器镜像扫描),Semgrep(SAST)
## 快速开始
1. 克隆仓库
```
git clone https://github.com/isaaaac-2/secrets-audit-cli.git
cd secrets-audit-cli
```
2. 创建并激活虚拟环境
```
python -m venv secret-cli
# Linux / macOS
source secret-cli/bin/activate
# Windows (PowerShell)
secret-cli\Scripts\Activate.ps1
```
3. 安装依赖项
```
pip install -r requirements.txt
```
## 使用说明
扫描目录以查找 secrets:
```
python -m app.cli scan ./your-project
```
列出所有发现:
```
python -m app.cli list
```
按状态过滤列出发现:
```
python -m app.cli list --status open
```
附带修复说明解决一个发现:
```
python -m app.cli resolve --notes "Rotated API key via AWS Secrets Manager"
```
生成摘要报告:
```
python -m app.cli report
```
## 检测模式
模式定义在 `app/secret-patterns.json` 中,并由扫描器预编译。每个模式都包含一个严重性级别,并且无需修改代码即可进行扩展:
- AWS Access Keys:`AKIA[0-9A-Z]{16}` (Critical)
- 通用 API Keys:`api[_-]?key|apikey` (High)
- Private Keys:`-----BEGIN.*PRIVATE KEY-----` (Critical)
- 连接字符串:`mongodb://|postgres://|mysql://` (High)
- Environment Variables:`os\.environ\[|os\.getenv\(` (Medium)
- 硬编码密码:`password\s*=\s*['\"]` (High)
在 `app/secret-patterns.json` 中添加或修改模式。无需更改代码。
## 架构
```
User runs CLI command
│
▼
┌──────────────────────────────────┐
│ app/cli.py │
│ Typer Commands │
│ scan | list | resolve | report │
│ │
└──────────────┬───────────────────┘
│
┌────────────┴────────────┐
▼ ▼
┌───────────────────────┐ ┌───────────────────────┐
│ app/scanner.py │ │ app/models.py │
│ Detection Engine │ │ Database Layer │
│ │ │ │
│ • Loads regex patterns│ │ • SQLite schema │
│ • Line-by-line scan │ │ • _mask_secret() │
│ • Returns raw findings│ │ • CRUD operations │
└───────────┬───────────┘ │ • Summary reports │
│ └───────────┬───────────┘
│ │
▼ ▼
┌───────────────────────┐ ┌───────────────────────┐
│ secret-patterns.json │ │ SQLite DB │
│ Regex + Severity │ │ secret_findings │
└───────────────────────┘ └───────────────────────┘
Security Controls:
• Plaintext secrets never stored or displayed
• CHECK constraints on severity and status
• Auto-updating timestamp trigger
• .gitignore excludes *.db, .env, venv
```
## CI/CD Pipeline
GitHub Actions 工作流(`.github/workflows/ci.yml`)在每次推送到 main 分支时运行三个安全门控:
1. Secret 扫描器针对测试 fixtures 运行,以验证检测逻辑
2. 构建 Docker 镜像并使用 Trivy 扫描容器漏洞
3. Semgrep 使用 p/security-audit 规则集执行静态分析
任何 HIGH 或 CRITICAL 发现都会导致构建失败。没有可用补丁的未修复 OS 级漏洞及其理由都会记录在 `.trivyignore` 中。这反映了生产级 DevSecOps 团队处理漏洞管理的方式:尽可能修复,无法修复的则记录在案并予以接受。
## 安全设计决策
- 掩码处理发生在数据库层(models.py 中的 `_mask_secret()`),以确保明文凭据永远不会到达持久化存储,无论扫描器传入什么内容
- `test/` 目录有意包含用于验证的虚拟 secrets(例如 `AKIAIOSFODNN7EXAMPLE`)。这些显然是伪造的,可以安全提交
- `.gitignore` 排除了运行时产生的文件(`*.db`、`.env`、虚拟环境目录),以防止意外的凭据或状态泄露
- Trivy 忽略文件使用 CVE ID 和理由记录了已接受的风险,遵循行业标准的漏洞管理实践
- Starlette DoS CVE(CVE-2025-62727、CVE-2026-48818、CVE-2026-54283)被接受,因为这是一个没有运行 HTTP 服务器的 CLI 工具;这些漏洞需要活动的 web endpoint 才能被利用
## 已知权衡
- 通过 .trivyignore 接受的 Starlette 漏洞:本项目是一个 CLI 扫描器,而不是 web 服务器。这三个 Starlette CVE 需要活动的 HTTP endpoint 才能被利用,在此不适用。已记录而非全局抑制。
- Debian 基础镜像中的 OS 级漏洞:perl、ncurses 和 util-linux 中的几个 HIGH/CRITICAL CVE 目前没有可用的补丁。这些是上游问题,并非由本项目引入。在 .trivyignore 中使用 ignore-unfixed 标志进行跟踪,以便 pipeline 仅在可操作的发现上失败。
- 提交到仓库的测试 fixtures:test/ 文件夹包含用于验证的有意设置的虚拟 secrets。生产环境的部署将使用挂载卷或独立的测试基础设施来代替。
- 使用 SQLite 进行存储:选择它是为了便携性和零配置设置。生产系统将使用 PostgreSQL 或类似数据库以实现并发访问和可扩展性。
## 项目结构
```
secrets-audit-cli/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── scanner.py
│ ├── models.py
│ ├── cli.py
│ └── secret-patterns.json
├── test/
│ ├── sample.py
│ └── test_api.py
├── .github/workflows/ci.yml
├── Dockerfile
├── docker-compose.yml
├── .trivyignore
├── requirements.txt
├── .gitignore
└── README.md
```
## 许可证
Apache 2.0
标签:DevSecOps, GPT, StruQ, 上游代理, 安全助手, 漏洞管理, 请求拦截, 逆向工具