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

git log が依然として秘密情報を表示する理由: Git Commit 歴史は決して忘れない

git logが「削除」された後でも秘密情報を漏洩させる理由

ファイルから行を削除して commit変更を確定しても、リポジトリから機密データが実際に削除されるわけではありません。そのシークレット、APIキー、認証情報、またはトークンが以前に公開されていた場合、 commitテッド、それはあなたのGit履歴の中にあります。 git log -p, git ショーまたは過去の差分を検査する commits はまだそれを取り出すことができます。

ファイルを上書きしたり、値を置き換えたりしても、 gitログ すべての変更の完全な履歴を保持します。これは意図的な設計です。Git のモデル全体は不変性に基づいています。 commit 履歴と配布されたコピー。つまり、明示的に履歴を書き換えない限り、あなたの秘密はそのまま残ります。 具体的な例を挙げましょう。

⚠️ 教育目的のサンプルです。本番環境では実行しないでください。

もう遅い。 gitログ 初期状態でもそのキーが表示されます commit.

git stashとgit rebaseに関する誤解

多くの開発者は git スタッシュ 秘密を隠したり、隠蔽したりするのに役立つ。これは事実ではない。 git スタッシュ 棚のみ 作業ディレクトリ 一時的に変化します。決して触れることはありません。 commit 歴史。もし秘密がかつて存在したとしたら。 commitテッド、後で変更を保存しても、それをクリーンアップする効果はありません。

どうですか gitリベース歴史を書き換えることはできるが、事前に行う必要があるcisエリー。ただ走っているだけ。 git rebase -i 並べ替えや圧縮 commits は、明示的に編集または削除しない限り、秘密情報を削除しません。また、元のファイルとクローンまたはフォークが 1 つでも存在する場合も同様です。 commitそうです、あなたの秘密は生き続けます。

さらに悪いことに、強制プッシュを正しく行わずにリベースしたり、共同作業者と再調整したりしないと、マージを通じて公開された認証情報が再び持ち込まれる可能性があります。

⚠️ 教育目的の例であり、実際の環境では使用しないでください

⚠️ これは教育的な例であり、本番環境のリポジトリでは実行しないでください。

編集 commit 秘密が詰まっているが、取り除くのを忘れてしまった。 あなたの gitログ かもしれない 見ます 洗浄は完了したが、機密情報は依然として復元可能である。

Git履歴に忘れられた認証情報がもたらす現実世界のリスク

これは理論上の話ではありません。攻撃者は、公開リポジトリとプライベートリポジトリを積極的にスキャンして、隠された秘密情報を探します。 commit 履歴。GitHub フォーク、ミラーリポジトリ、キャッシュ CI/CD pipelineそれらはすべて、忘れ去られたトークンを宿すことができる。

  • 古いAPIキーが漏洩 gitログ あるスタートアップ企業にとって、数千ドルものクラウド料金請求につながった。
  • OAuthトークン committed はその後「削除」され、ユーザーアカウントを乗っ取るために使用されました。
  • オープンソースプロジェクトの派生版に深く埋もれていた秘密が、重大なセキュリティインシデントを引き起こした。

これらの問題は規模が大きくなると CI/CDリポジトリをクローンするすべてのジョブは、 gitログ 内部構造や、あらゆるビルド成果物には、潜在的に漏洩した秘密の痕跡が含まれている可能性がある。

git filter-repo を使用した機密データのクリーンアップ

損傷が発生した場合、それを清掃するための最も信頼できるツールは gitfilter-リポジトリ。 とは異なり gitリベース書き換える 個人 commits, gitfilter-リポジトリ 全体を書き換えることができます commit ファイルパス、パターン、またはコンテンツに基づいた履歴。

例: すべての出現箇所を削除する config.json 秘密が含まれている可能性があるもの:

⚠️ これは教育的な例です。本番環境で使用する前に、テストリポジトリで検証してください。

またはすべてを削除する commit特定の文字列を含むもの(例: AWS_SECRET_ACCESS_KEY):

⚠️ これは教育的な例です。本番環境で使用する前に、テストリポジトリで検証してください。

注意:これは書き換えます commit ハッシュ。強制プッシュしてすべてのコラボレーターに通知する必要があります。 commit ハッシュが壊れます。

また、次のようなツール BFGレポクリーナー 同様の機能を提供するが、柔軟性に劣り、複雑なケースにおいては時代遅れとみなされている。

機密情報がGitに到達する前に漏洩を防ぐ

予防は事後処理に勝る。秘密が明るみに出ないようにする方法をご紹介します。 gitログ:

1. Pre-commit Hooks

のようなツールを使う pre-commit, ギリークスまたは お守り 秘密をスキャンする前に commits:

2. CI/CD Pipeline 執行

統合 秘密検出 CIジョブに組み込みましょう。機密情報が見つかった場合はビルドを失敗させます。これをポリシーとして設定してください。

3. 機密情報の管理

認証情報をハードコーディングしてはいけません。最初から環境変数、保管庫、またはシークレットマネージャーを使用してください。

4. 監査依存関係

サードパーティ製のパッケージを盲目的に信用してはいけません。 秘密は漏洩する可能性がある npm、PyPI、またはDockerレイヤーを介して。

最終修正:git filter-repo を使用してシークレットを削除

コードから機密情報を削除するだけでは不十分だ。 gitログ 意図的に歴史を書き換えない限り、完全な記録を保持します。 git スタッシュ または生焼け gitリベース 試行。 gitfilter-リポジトリ 徹底的なクリーンアップが必要な場合、そして機密情報がリポジトリに到達する前にポリシーを適用し、スキャンを実行する必要があります。

事前の秘密検出には、次のようなツールの使用を検討してください。 ザイゲニ あなたを確保する pipelines、強制する commit 衛生管理を徹底し、高額な損失につながる情報漏洩を未然に防ぎましょう。Gitは決して忘れませんが、そもそもGitがあなたの秘密を記憶しないようにすることは可能です。

sca-tools-ソフトウェア構成分析ツール
ソフトウェアのリスクを優先順位付けし、修復し、保護する
無料アカウントを作成しましょう。
いいえ、クレジットカードは必要ありません。

ソフトウェア開発と納品を安全に

Xygeni製品スイートと共に