How do I remove sensitive/unwanted content that was pushed to my Bitbucket Data Center instance?

お困りですか?

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

コミュニティに質問

目的

The purpose of this article is to describe the steps that can be taken to remove sensitive or otherwise unwanted information that has been pushed to a repository hosted in Bitbucket Data Center.

背景

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

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

What's more, rewriting history and force pushes can lead to undesirable results and unexpected behaviours in Bitbucket Data Center, which is why we generally discourage this practice if you can avoid it at all.

ソリューション

この機密コンテンツをリポジトリのコミット履歴から削除するには、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 for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    git reflog expire --expire=now --all
    git gc --prune=now

    (warning) These commands should NOT be executed directly against the repository on the Bitbucket Data Center - only your local copy of the repository. Running git gc against Bitbucket's copy of the repository can result in serious data corruption


最近この不要な変更をプル リクエストにマージした場合には、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 for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    git reflog expire --expire=now --all
    git gc --prune=now

    (warning)These commands should NOT be executed directly against the repository on Bitbucket - only your local copy of the repository. Running git gc against Bitbucket's copy of the repository can result in serious data corruption.

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

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

最終更新日 2024 年 9 月 19 日

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

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