GitHub 密钥泄漏预防 SOP:Secret scanning、push protection 和本地提交前检查怎么配

把网站项目、自动化脚本或 AI 工具示例推到 GitHub 前,先按这套 SOP 做密钥泄漏预防:本地检查、push protection、告警处理和轮换记录都要有。

把网站项目、自动化脚本或 AI 工具示例推到 GitHub 前,先按这套 SOP 做密钥泄漏预防:本地检查、push protection、告警处理和轮换记录都要有。

  1. 01先读摘要,判断是否与你的场景相关。
  2. 02再看来源,保留继续查证的路径。
  3. 03最后看步骤、风险和可复用动作。

AI 工具、网站发布脚本和自动化项目越来越容易把 API key、Webhook secret、数据库连接串写进示例代码。推到 GitHub 前先做密钥泄漏预防,成本远低于公开后再撤销、轮换和清理历史。

更新日期与来源依据

更新日期:2026-06-28。GitHub Docs 说明,secret scanning 会检测提交到仓库的 API keys、passwords、tokens 等硬编码凭据;公共仓库可自动免费运行。文档还说明 push protection 用于在未来泄漏发生前阻止相关提交,检测到告警时应立即轮换受影响凭据。

公开来源限制为三条:GitHub secret scanning、GitHub push protection、GitHub command line push protection。这里讨论防御性流程,不教绕过检测,也不提供滥用密钥的方法。

适用场景

  • 你要把一个网站项目、自动化脚本、CLI 工具、AI agent 示例或课程代码推到 GitHub。
  • 仓库里曾经出现 `.env`、配置文件、WordPress 应用密码、Cloudflare token、OpenAI key、Webhook secret 或数据库 URL。
  • 团队成员会通过命令行、网页编辑器、Copilot、MCP 工具或自动化脚本提交代码,需要统一处理 push protection 提示。
  • 你维护公开仓库,希望让用户复制示例时不会拿到真实密钥或内部地址。

不适用场景

  • 已经发生生产密钥泄漏且可能被使用,应按事故响应处理:立即撤销、轮换、审日志、查滥用,再谈清理历史。
  • 组织有成熟 Secret Protection、SIEM、审计和强制策略,应把这套 SOP 当个人项目版本,不替代企业安全流程。
  • 需要扫描本机所有文件或他人私有仓库的场景,应先确认权限,不要把安全检查变成越权访问。

准备材料

  • 一份密钥目录:列出项目可能用到的 key、token、webhook secret、应用密码、数据库 URL 和私有证书。
  • 一份忽略规则:`.gitignore` 里明确忽略 `.env`、本地配置、导出备份、日志、临时凭据文件。
  • 本地搜索命令:用 `rg` 查常见关键词和项目特有前缀。
  • GitHub 仓库安全入口:Security and quality 或对应 Secret scanning alerts 页面。
  • 轮换权限:确保你有权限撤销并重建 OpenAI、Cloudflare、GitHub、WordPress、数据库等凭据。

操作步骤

  1. 第 1 步,先从文件系统排除明显风险。确认 `.env`、`*.pem`、数据库 dump、WordPress backup、`config.local.*`、日志和临时导出不在 git 跟踪范围内。
  2. 第 2 步,用本地搜索查关键词。不要只搜 `API_KEY`,还要搜 `token`、`secret`、`password`、`Authorization`、`Bearer`、`DATABASE_URL` 和项目实际服务名。
  3. 第 3 步,检查 git 暂存区。运行 `git diff –cached`,确认即将提交的内容没有真实 key、内部域名、账号邮箱和不可公开路径。
  4. 第 4 步,开启或确认 GitHub secret scanning。公共仓库会自动覆盖一类场景;组织私有仓库要看是否启用 GitHub Secret Protection。
  5. 第 5 步,处理 push protection 提示。如果 GitHub 阻止 push,先判断是真密钥、测试假值还是误报。真密钥必须撤销轮换,不能只把那行删掉再继续推。
  6. 第 6 步,记录修复。把“发现时间、密钥类型、是否已撤销、替代变量名、影响范围、后续复查日期”写入私密安全记录,不写进公开 README。

提交前检查清单

  • `git status –short` 只出现预期文件,没有 `.env`、备份、日志、截图和临时数据。
  • `rg -n “(api[_-]?key|token|secret|password|authorization|bearer|database_url)” .` 查到的结果都为示例名、文档说明或环境变量名。
  • README 只展示变量名,不展示真实值;示例值使用 `YOUR_API_KEY`、`example-token` 这类无效占位。
  • GitHub 仓库 Security 页面没有未处理 secret scanning alert。
  • 团队知道 push protection 被挡住时不能选择“绕过”来省事,除非有被授权的安全理由和记录。

实际例子:内容站自动发布脚本

一个 WordPress 内容站项目需要保存远端 SSH key 路径、WordPress 用户名、OpenAI key、图片生成配置和缓存清理命令。公开仓库里可以保留脚本结构和变量名,但真实值应放在本机密钥管理器、CI secret 或主机环境变量里。

rg -n "(OPENAI|CLOUDFLARE|WORDPRESS|WP_|TOKEN|SECRET|PASSWORD|DATABASE_URL|Authorization|Bearer)" .
git diff --cached
git ls-files | rg "(\.env|\.pem|backup|dump|log|private)"

如果 `rg` 找到 `Authorization: Bearer sk-…` 这类真实值,处理顺序是撤销该 key、重建新 key、替换本地配置、删除提交内容、再提交。不要只清理 git 历史后继续使用旧 key。

常见坑

  • 把 `.env.example` 写成真实 `.env` 的复制品。示例文件只能放变量名和无效示例值。
  • 认为删除一行就安全。只要真实密钥被提交或推送过,就按已泄漏处理并轮换。
  • 把 GitHub partner 自动撤销当成万能保护。GitHub 文档说明 partner secret 可能通知服务商,但你仍要检查自己的告警和凭据状态。
  • 把 push protection 的 bypass 当普通按钮。绕过会留下风险,应该有授权理由和审计记录。

排错路径

  • push 被阻止:看 GitHub 输出的 secret 类型和位置,确认是真值还是假值;真值先撤销轮换。
  • 告警显示历史提交:撤销密钥优先,清理历史是次要动作;历史重写会影响协作者,需要单独计划。
  • 误报太多:用项目自己的假值格式,必要时定义更清晰的示例命名,不要用看起来像真实 token 的字符串。
  • 仓库多人协作:把这份 SOP 放进 CONTRIBUTING 或内部 runbook,并要求 PR 检查前完成本地命令。

可复制事故记录模板

发现时间:
发现方式:local rg / push protection / secret scanning alert
密钥类型:
出现位置:
是否进入远端:
撤销时间:
新密钥保存位置:
影响服务:
需要通知的人:
复查日期:

维护建议:每月抽查一次公开仓库和私有自动化仓库;新增服务、CI、MCP、WordPress 应用密码或图片供应商时,把新的密钥前缀加入本地搜索表。

订阅更新

输入邮箱,订阅站点更新。

参与讨论

你的邮箱不会公开。 标有 * 的为必填项。