Bitbucket Server インスタンスにプッシュされた機密コンテンツや不要なコンテンツを削除する方法

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

目的

この記事の目的は、Bitbucket Server にホストされているリポジトリにプッシュされた機密情報やその他の不要な情報を削除するための手順を説明することです。

背景

SSH キーやパスワードなどの機密ファイルや行が git リポジトリにプッシュされた場合、このコンテンツを加えた後にチームがさらにコミットを追加した場合には、最新のコミットのコンテンツを削除するだけでは不十分です。この情報はこのリポジトリのコミット履歴に残るからです。 

機密性の高いコミットがプッシュされたら時点で、このデータは漏洩したものとして扱うべきです。機密情報がすでに手動でコピーされている可能性があるため、パスワードや SSH キーはすぐに変更する必要があります。さらに、このコミットを含むクローンやフォークは、これらの手順の影響を受けません。

さらに、履歴の書き換えや強制プッシュは、Bitbucket Server で望ましくない結果や予期しない動作につながる可能性があるため、できる限りこの方法はお勧めしません。

ソリューション

この機密コンテンツをリポジトリのコミット履歴から削除するには、2つの方法があります。

どちらの方法でも、最終的にはリポジトリの履歴を書き直して、機密性の高いコミットがそもそもプッシュされなかったかのようになります。


git filter-branch を使用する

git stash を使って変更を保存した後で git filter-branch を実行すると、一時退避された変更 (stashed changes) を取り出せなくなります。このコマンドを実行する前に、一時退避された変更をすべて取り出しておく必要があります。

  1. リポジトリをローカルの git クライアントにクローンします
  2. リポジトリのディレクトリに移動し、次のコマンドを実行します。必ず「PATH/TO/SENSITIVE/DATA」を、削除するファイル全体の相対パス (リポジトリのクローン内) に置き換えてください。

    git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH/TO/SENSITIVE/DATA" --prune-empty --tag-name-filter cat -- --all

    NOTE: The slashes in PATH/TO/SENSITIVE/DATA must be "/" rather than "\" when running commands from a Windows client.

  3. (info) 厳密には必要ではありませんが、機密データをリポジトリの .gitignore ファイルに追加し、誤って再度コミットされないようにすることをお勧めします。
  4. ローカル リポジトリの状態を確認したら、次のコマンドを実行して変更を Bitbucket に強制的にプッシュし、リポジトリの既存のコミット履歴を上書きします。

    git push origin --force --all
    git push origin --force --tags
  5. このリポジトリからクローンまたはフォークを作成するユーザーは、古いリポジトリの履歴を含むブランチを git rebase  するようにする必要があります。マージではなく、リベースすることが重要です。マージすると、メイン リポジトリのクリーンな Git 履歴に機密データが再度入っていまう可能性があるためです。 
  6. 最後に、次のコマンドを使用して、ローカル リポジトリ内のすべてのオブジェクトを強制的にガベージ コレクションしてください。

    git reflog expire --expire=now --all
    git gc --prune=now

    (warning) これらのコマンドは、Bitbucket Server のリポジトリに対して直接実行しないでください。リポジトリのローカルコピーに対してのみ実行してください。Bitbucket Server リポジトリのコピーに対して git gc を実行すると、重大なデータ破損につながる可能性があります


最近この不要な変更をプル リクエストにマージした場合には、Bitbucket がプル リクエストに関連する多くの git オブジェクトをサーバー上に保存するため、次の手順についてはアトラシアン サポートにご相談いただくことをお勧めします。マージされたプル リクエストの差分には、依然として機密情報や不要な情報が含まれている可能性があります。これらのプル リクエストからデータを削除するために必要な手順では、外部データベースを手動で変更する必要があります。これは状況によって異なります。これらの変更は、正しく実行されないと悪影響をもたらす可能性があります。そのため、チームに連絡して、これらの方針に沿った追加の支援を求めることをお勧めします。

BFG Repo-Cleaner を使用する

BFG Repo-Cleaner はオープンソースのツールで、git filter-branch コマンドを使用するよりも、リポジトリのコミット履歴から不要なデータを簡単に削除できます。

  • (warning) BFG Repo-Cleaner は、最新のコミットがすでにクリーンであることを前提として動作することに注意してください。つまり、最新のコミットには変更を加えず、それ以前のコミットに対してのみです。BFG Repo-Cleaner を使用する前に、不要な/機密情報を削除する新しいコミットをプッシュ アップし、このクリーンなコミットでコード破損がないことを確認することをお勧めします。

このツールで出来ることについての詳しい説明は、BFG Repo-Cleaner のドキュメント全体をご参照いただくことをお勧めします。

このツールを使って Bitbucket リポジトリからデータを削除する方法の例を以下に示します。

  1. コマンド git clone --mirror を使用して、影響を受けたリポジトリのローカルコピーをクローンを作成します。
  2. (info) BFG Repo-Cleaner を使用して変更を実行する前に、このベア リポジトリのコピーをバックアップすることをお勧めします
  3. (info) また、bfg.jar ファイルがダウンロードされ、自分のディレクトリに移動された後に、java -jar bfg.jar のエイリアスとして bfg エイリアスを設定することをお勧めします。
  4. ダウンロードした bfg.jar を使用して、リポジトリに対して実行できるコマンドの例を以下に示します。

    # Remove any files named 'sensitive_passwords.txt' or 'confidential_passwords.txt' from the repository's commit history
    bfg --delete-files  {sensitive,confidential}_passwords.txt
    # Replace any entries listed in the file 'bobs_credit_cards_and_ssn.txt' with the text ***REMOVED*** wherever they occur in the repository. 
    #     Don't worry, we're also unsure why this was pushed to a git repository.
    bfg --replace-text bobs_credit_cards_and_ssn.txt 

    BFG Repo-Cleaner コマンドの完全なリストは、ツールのドキュメントをご参照ください

  5. (info) 厳密には必要ではありませんが、機密データをリポジトリの .gitignore ファイルに追加し、誤って再度コミットされないようにすることをお勧めします。
  6. ローカル リポジトリの状態を確認したら、変更を Bitbucket に強制的にプッシュして、リポジトリの既存のコミット履歴を上書きします。

    git push origin --force
  7. このリポジトリからクローンまたはフォークを作成するユーザーは、古いリポジトリの履歴を含むブランチを git rebase  するようにする必要があります。マージではなく、リベースすることが重要です。マージすると、メイン リポジトリのクリーンな Git 履歴に機密データが再度入っていまう可能性があるためです。 

  8. 最後に、次のコマンドを使用して、ローカル リポジトリ内のすべてのオブジェクトを強制的にガベージ コレクションしてください。

    git reflog expire --expire=now --all
    git gc --prune=now

    (warning)これらのコマンドは、Bitbucket Server のリポジトリに対して直接実行しないでください。リポジトリのローカルコピーに対してのみ実行してください。Bitbucket サーバーリポジトリのコピーに対してgit gcを実行すると、重大なデータ破損につながる可能性があります。

最近この不要な変更をプル リクエストにマージした場合には、Bitbucket がプル リクエストに関連する多くの git オブジェクトをサーバー上に保存するため、次の手順についてはアトラシアン サポートにご相談いただくことをお勧めします。マージされたプル リクエストの差分には、依然として機密情報や不要な情報が含まれている可能性があります。これらのプル リクエストからデータを削除するために必要な手順では、外部データベースを手動で変更する必要があります。これは状況によって異なります。これらの変更は、正しく実行されないと悪影響をもたらす可能性があります。そのため、チームに連絡して、これらの方針に沿った追加の支援を求めることをお勧めします。

BFG Repo-Cleaner はサードパーティーのユーティリティなため、アトラシアン サポート対象外です。このユーティリティの使用に起因する問題は、アトラシアンはサポートしません。 

最終更新日 2024 年 4 月 2 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.