git log - git stash - git rebase - git filter-repo

为什么 git log 仍然会泄露你的秘密:Git Commit 历史永远不会忘记

为什么 git log 即使在“删除”后仍会暴露秘密

从文件中删除一行 commit更改实际上并不会从你的仓库中删除敏感数据。如果该机密信息(API 密钥、凭证或令牌)曾经 committed,它存在于你的 Git 历史记录中。任何运行 git log -p, git 显示或检查过去的差异 commit仍然可以检索它。

即使你覆盖文件或替换值, 混帐日志 保留所有变更的完整沿袭。这是设计使然。Git 的整个模型基于不可变的 commit 历史和分布式副本。所以,除非你明确地重写历史,否则你的秘密仍然存在。 以下是一个实际案例:

git commit -m "Added config with AWS_SECRET_KEY"
# Realize mistake
git rm config.json
git commit -m "Removed secret file"

⚠️ 教育示例,请勿在生产环境中运行

太晚了。 混帐日志 仍然显示初始键 commit.

关于 git stash 和 git rebase 的误解

许多开发者认为 git存储 帮助隐藏或清除秘密。不对。 git存储 只有货架 工作目录 暂时改变;它永远不会触及 commit 历史。如果一个秘密曾经 committed,之后存储更改并不能清理它。

关于什么 混帐变基?虽然它可以改写历史,但必须事先cisely。只是跑步 git rebase -i 并重新排序或压缩 commit除非你明确编辑或删除机密,否则 s 不会删除它们。即使只有一个克隆或分支与原始版本存在 commits,你的秘密依然存在。

更糟糕的是,如果在重新定基时没有正确强制推送或与合作者重新协调,则可能会通过合并重新引入暴露的凭据。

git commit -m "Added config with AWS_SECRET_KEY"

⚠️ 教育示例,请勿在真实环境中使用

git rebase -i HEAD~3

⚠️ 教育示例,请勿在生产仓库上运行

编辑 commit 包含秘密,但忘记删除它。 您的 混帐日志 可能 更干净,但敏感内容仍然可以恢复。

忘记 Git 历史记录中的凭证所带来的现实风险

这并非理论上的。攻击者会主动扫描公共和私人存储库,寻找隐藏的秘密 commit 历史。GitHub 分支、镜像仓库和缓存 CI/CD pipeline都可以藏匿那些被遗忘的令牌。

  • 一个来自旧 混帐日志 为一家初创公司带来了数千美元的云计费。
  • OAuth 令牌 committed,随后被“删除”,被用来劫持用户账户。
  • 开源项目分支中深藏的秘密引发了重大安全事件。

这些问题逐渐显现 CI/CD. 克隆 repo 的每个作业都会运行 混帐日志 在底层,每个构建工件都可能包含暴露的秘密的痕迹。

使用 git filter-repo 清理敏感数据

如果已经造成损坏,最可靠的清理工具是 git 过滤器仓库。 不像 混帐变基,重写 个人 commits, git 过滤器仓库 可以重写整个 commit 基于文件路径、模式或内容的历史记录。

示例:清除所有出现的 配置文件 可能包含秘密:

pip install git-filter-repo

# Backup your repo first
cp -r my-repo my-repo-backup

cd my-repo
git filter-repo --path config.json --invert-paths

⚠️ 教育示例,在生产中使用之前在测试仓库中验证

或者删除所有 commit包含特定字符串(例如, AWS_SECRET_ACCESS_KEY):

git filter-repo --replace-text <(echo 'AWS_SECRET_ACCESS_KEY==REDACTED')

⚠️ 教育示例,在生产中使用之前在测试仓库中验证

小心:这将重写 commit 哈希值。您需要强制推送并通知所有协作者。任何与 commit 哈希将会被破坏。

此外,像 BFG 回购清洁剂 提供类似的功能,但灵活性较差,现在被认为对于复杂的情况来说已经过时了。

在秘密泄露到 Git 之前阻止其泄露

预防胜于清理。以下是如何防止秘密泄露的方法 混帐日志:

1. Pre-commit Hooks

使用像 pre-commit, gitleaks护身符 扫描秘密 commits:

# .pre-commit-config.yaml
- repo: https://github.com/zricethezav/gitleaks
rev: v8.15.0
hooks:
- id: gitleaks

2. CI/CD Pipeline 政策执行

整合 秘密侦测 纳入你的 CI 作业。一旦发现机密信息,构建就会失败。请将此作为一项政策。

3. 机密管理

切勿对凭证进行硬编码。从第一天起就使用环境变量、保险库或机密管理器。

4. 审计依赖关系

不要盲目相信第三方软件包。 秘密可能泄露 通过 npm、PyPI 或 Docker 层。

最终解决方案:使用 git filter-repo 清除机密

从代码中删除秘密是不够的。 混帐日志 除非你故意采取行动改写历史,否则不会保留完整的记录。不要依赖 git存储 或半生不熟 混帐变基 尝试。使用 git 过滤器仓库 当您需要深度清理时,请在机密信息到达您的存储库之前强制执行策略和扫描。

对于主动秘密检测,考虑使用以下工具 西吉尼 以确保您的 pipelines,执行 commit 确保安全卫生,防止代价高昂的泄密事件发生。Git 永远不会忘记,但你可以确保它从一开始就不会记住你的秘密。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件