JavaLYG

GitHub Secret Scanning 合并门禁:阻止含密钥的 Pull Request 进入主分支

团队最怕的不是代码写错一行,而是把云厂商 Token 一起合进主分支。过去 push protection 主要在 push 阶段拦截,仍可能漏掉某些类型或绕过场景。GitHub 在 2026 年 9 月 9 日公开预览了一个更靠后的闸门:当 Pull Request 引入 secret scanning 告警时,Repository ruleset 可以直接阻止合并。本文不讨论“谁提交了什么”,只讲怎么理解这条链路、怎么配置,以及如何用一个安全的假值验收。

一、这次变化解决什么问题

新规则检查两件事:针对 PR head commit 的 secret scan 是否完成,以及 PR 的提交是否引入仍然开放的 secret 告警。两项都不满足时,未拥有 bypass 权限的参与者不能合并。它是合并前的第二道门,不是对 push protection 的替代。

功能属于 GitHub Advanced Security 相关能力的 public preview,适用范围和可用套餐应以当前组织页面为准。不要把预览功能直接当成所有仓库默认拥有的基础能力。

二、先把几个概念分开

Secret scanning负责发现疑似凭据;Push protection尽量在代码进入远端前拦截;Ruleset则把检查结果变成分支或标签的合并门禁。三者像扫描器、门卫和门锁:少一个都可能留下缝隙。

规则关注的是“本次 PR 引入的告警”,不是要求团队把历史全部清零才允许开发。历史告警仍应按组织流程处理,但不要用关闭一个无关告警的方式绕过当前 PR。

三、配置前的准备

  1. 确认组织或仓库已启用 Secret Protection 能力,并确认操作者拥有配置 ruleset 的权限。
  2. 明确保护对象,例如 default branch 或 release 分支;先在测试仓库验证,不要直接把生产发布分支锁死。
  3. 准备一个不会被任何系统接受的假值,例如 EXAMPLE_ONLY_NOT_A_REAL_TOKEN_123456。不要把真实 Token 写进测试。
  4. 记录绕过权限、告警处理人和异常恢复路径。门禁配置得很严,但没人知道如何修复,最后就会变成“大家一起盯着红灯发呆”。

四、创建 Repository ruleset

进入仓库的 Settings,找到 Rules,创建或编辑针对目标分支的 ruleset。选择分支匹配范围,启用要求 secret scanning 告警被解决的规则;如果界面提供 secret 类型筛选,先从 provider pattern 开始,再根据误报情况评估 custom 或 generic pattern。

保存前检查三点:目标仓库是否正确、目标分支模式是否正确、绕过角色是否最小化。规则集是组织治理配置,不能只截图给同事看,必须在实际 PR 上验证。

五、用安全假值做验收

  1. 从测试分支创建 PR,加入上述假值,放在普通文本文件中即可;不要调用任何云服务。
  2. 等待 head commit 的 secret scan 完成,观察 PR checks 和 ruleset 状态。
  3. 确认出现新增 secret 告警,且合并按钮被 ruleset 阻止。
  4. 删除假值,提交修复,关闭对应告警或按平台流程标记为误报。
  5. 再次等待扫描完成,确认 PR 不再有新增 secret 告警,门禁恢复可合并。

验收重点不是“页面出现了一个红叉”,而是从阻止到修复再到恢复的闭环真的走通。

六、常见失败分支

现象优先检查
没有发现告警扫描是否完成、假值是否匹配已启用的检测类型、PR 是否确实包含新提交
有告警但仍可合并ruleset 是否命中目标分支、规则是否启用、操作者是否拥有 bypass 权限
修复后仍被阻止告警是否仍 open、扫描结果是否刷新、是否还有另一个提交引入同类 secret
误报太多先核对告警类型和验证状态,再调整检测范围;不要为了绿色直接关闭整套扫描

七、为什么不能只依赖一层防护

凭据可能从提交、分支合并、复刻仓库或自动化流程的不同路径进入代码库。push 阶段适合快速反馈,PR 阶段适合结合上下文做治理,运行时还应使用云厂商密钥轮换、最小权限和审计日志。任何扫描器都不是保险柜,真实凭据一旦泄露,第一动作仍然是撤销或轮换,而不是只删除那一行代码。

八、落地清单

  • 目标分支已写入 ruleset,且规则集状态为启用。
  • 测试 PR 的扫描完成状态可见,新增假值告警能阻止合并。
  • 移除假值并处理告警后,门禁能恢复通过。
  • bypass 权限经过最小化,异常时有明确处理人。
  • 文档记录检测范围、例外流程、凭据轮换和审计周期。

九、结语

这项能力的价值不在于多一个按钮,而在于把“凭据安全”从个人习惯变成仓库合并的可验证条件。建议先用测试仓库跑通闭环,再逐步覆盖主分支和发布分支。门禁不是为了让开发更难,而是让秘密不要搭着 Pull Request 的顺风车出门。

Pull Request 秘密泄露拦截链路Ruleset 配置与验收清单
参考:GitHub Changelog《Block pull requests with exposed secrets from merging》、GitHub Rulesets 文档、GitHub Secret scanning 文档。

🔕 评论已关闭