质量门禁与回滚51 条

密钥扫描门禁

在提交与流水线两个层面扫描疑似密钥:命中即阻断并通知;常用工具包括 gitleaks、TruffleHog、GitLab Secret Detection 等。

CI/CD 与发布速查开发更新于 2026-10-13

密钥扫描门禁是什么

在提交与流水线两个层面识别疑似泄露:本地 pre-commit 拦住手滑提交,CI 全量扫描兜底历史与跨文件场景;一旦命中立即阻断并通知。常见工具包括 gitleaks、TruffleHog、GitLab Secret Detection 等。核心价值是把泄露发现时刻从事后左移到提交当下——发现之后的关键动作是轮换:密钥一旦进入 Git 历史,删除文件并不等于解除风险。

基本信息

扫描时机pre-commit 本地扫描 + CI 全量扫描(含历史提交)
判定命中即阻断,同时通知安全负责人
处理吊销并轮换密钥,评估影响后清理历史
基线对历史存量建立基线,聚焦新增泄露
误报治理维护 allowlist 并附说明与期限,定期清理

命中后的处置顺序

步骤动作目的
1吊销并轮换密钥先止血,与历史清理无关
2评估使用范围与日志确认是否已被使用
3清理工作区与历史防止后续克隆传播
4复盘来源并补钩子防同类再犯

典型使用场景

  • 提交前拦截:pre-commit 钩子阻断含密钥的暂存区内容
  • CI 兜底:对完整历史扫描,捕获钩子未装或被跳过的提交
  • 供应商审计:出具无明文密钥入库的证据链
  • 事件响应:确认泄露后按处置顺序执行并留存记录
  • 合规材料:金融、医疗类项目把扫描报告纳入发布材料
  • 历史清理工具链:用 git filter-repo 或 BFG 重写历史后,协调所有协作者重新克隆

gitleaks 扫描示例

gitleaks 扫描示例
# CI 全量扫描,报告脱敏后存档
gitleaks detect --source . --redact --report-format sarif \
  --report-path gitleaks.sarif

# 本地 pre-commit 快速拦截暂存区
gitleaks protect --staged
发现泄露后只删代码不够:密钥已进入历史记录,必须轮换。
轮换要配套:密钥管理系统同步吊销旧凭据、通知依赖方、验证新凭据下发,缺一环等于没轮换完整。

易错点

  • 只扫当前工作区:历史提交中的密钥漏检,CI 全量扫描与基线结合
  • 扫描报告包含明文密钥:报告本身成为新的泄露面,需开启 redact
  • 命中后只清理不轮换:密钥仍在历史与日志里可用,先轮换后清理
  • allowlist 无限增长:为消音挂大量豁免,扫描名存实亡,豁免要带期限与复核
  • CI 日志里回显扫描命中内容:日志成为二次泄露渠道,管好日志访问权限并保持脱敏

数据来源与参考

  • gitleaks 项目文档
  • GitLab Docs《Secret Detection》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌