首页/开发/CI/CD 与发布速查/提交与历史中的密钥扫描
环境与配置管理60 条

提交与历史中的密钥扫描

对仓库内容与历史做密钥检测:平台内置扫描(GitHub secret scanning / GitLab secret detection)叠加预提交钩子,发现即轮换。

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

密钥扫描是什么

对仓库内容与历史做密钥检测:提交前钩子、平台内置扫描(GitHub secret scanning / GitLab secret detection)与历史全量扫描三层叠加。密钥一旦「进过」仓库就视为已泄露,正确处置顺序是判定有效性、立即轮换、视情况清理历史,而不是赌有没有人看到。

基本信息

层次提交前(pre-commit)、推送时(平台扫描)、历史(全量扫描)
处置判定有效性 → 立即轮换 → 清理历史(视情况)
姿势密钥「进过」仓库就视为已泄露,不要赌是否被看到
扫描器gitleaks、平台内置、pre-commit 钩子
协作平台扫描命中会通知贡献者与安全团队

典型使用场景

  • 开发本地:pre-commit 钩子在上游拦截明文密钥
  • 平台托管:启用内置扫描,推送即检测
  • 历史清理:对全历史跑扫描,找出存量泄漏
  • 入门评估:新团队先做一次全量基线扫描
  • 事件响应:发现泄漏后走轮换流程并复核其他仓库

实践要点

  • 误报处理:规则加白名单要评审,别把真密钥一起放过
  • 排除文件:锁文件与测试样本按规则排除,降低噪音
  • 范围完整:私有与公开仓库都要扫,内部仓库同样有外泄路径
  • 规则更新:密钥特征库持续演进,保持工具版本跟进
  • 告警接入:扫描结果进安全告警通道,避免沉睡
  • 基线先行:存量仓库先跑一遍基线,把历史问题量化
  • 密钥轮换联动:扫描发现即触发轮换工单,形成处置闭环

全历史扫描

全历史扫描
gitleaks detect --source . --redact
# 平台侧:
# GitHub → Settings → Code security → Secret scanning

三层防护

层次时机工具
提交前本地提交pre-commit 钩子
推送时进入远端平台内置扫描
历史定期或一次性gitleaks 全量
发现密钥后应优先轮换,而不是删文件:删除不能撤回已发生的暴露。
扫描的价值在处置闭环:告警有响应人、有轮换记录,才算真正生效。

易错点

  • 只在 PR 扫描不管历史:历史里的旧密钥仍在生效,安排一次性历史扫描
  • 扫描告警当成噪音:把有效性验证与轮换流程接到告警上
  • 把清理历史当处置终点:force push 不改写镜像与克隆,轮换才是根本
  • 忽略归档仓库与 fork:不在默认扫描范围,纳入资产清点
  • 只依赖平台扫描:自建仓库没有内置能力,需自行部署扫描流水线

数据来源与参考

  • GitHub Docs《Secret scanning》
  • GitLab Docs《Secret Detection》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌