チュートリアル: コミットからシークレットを削除する
アプリケーションが外部リソースを使用する場合、通常、アプリケーションをsecretで認証する必要があります。もしシークレットがリモートリポジトリにプッシュされた場合、リポジトリへのアクセス権を持つ人は誰でも、あなたやアプリケーションになりすますことができます。誤ってシークレットをコミットしてしまった場合でも、プッシュする前に削除することができます。
このチュートリアルでは、偽のシークレットをコミットし、それをプロジェクトにプッシュする前に、コミット履歴からシークレットを削除します。また、シークレットがリポジトリにプッシュされた場合の対処法も学びます。
このチュートリアルは、GitLab UnfilteredのビデオRemove a secret from your commitsを元に作成されました。
はじめる前
このチュートリアルを完了する前に、以下を準備してください:
- テストプロジェクト。お好みのプロジェクトを使用できますが、このチュートリアル専用のテストプロジェクトを作成することを検討してください。
- コマンドラインGitに関するある程度の知識。
シークレットのコミット
GitLabは、文字、数字、記号の特定のパターンに一致することでシークレットを識別します。これらのパターンは、シークレットのタイプを識別するためにも使用されます。例えば、偽のシークレットglpat-12345678901234567890は、文字列glpat-で始まるため、パーソナルアクセストークンです。
多くのシークレットは形式で識別できますが、リポジトリで作業中に誤ってシークレットをコミットしてしまうことがあります。誤ってシークレットをコミットする状況をシミュレートしてみましょう:
テストリポジトリで、新しいブランチをチェックアウトする:
git checkout -b secret-tutorial以下の内容で新しいテキストファイルを作成します。
-の前後にあるスペースを削除して、パーソナルアクセストークンの正確な形式と一致させてください:fake-secret: glpat - 12345678901234567890 message: hello, world!ファイルをブランチにコミットします:
git add . git commit -m "Add fake secret"
これは問題です: 変更がプッシュされると、テキストファイル内のパーソナルアクセストークンが漏洩してしまいます!先に進む前に、シークレットはコミット履歴から削除する必要があります。
履歴からシークレットを削除する
シークレットを含む唯一のコミットがGit履歴中の最新のコミットである場合、履歴を修正して削除できます:
テキストファイルを開き、偽のシークレットを削除します:
fake-secret: message: hello, world!変更で古いコミットを上書きする:
git add . git commit --amend
シークレットはファイルとコミット履歴から削除され、安全に変更をプッシュできます。
複数のコミットの修正
シークレットが追加されたことに、後になって複数の追加コミットを行った後に気づくことがあります。このような場合、最新のコミットからシークレットを削除するだけでは不十分です。シークレットが追加された後のすべてのコミットに変更を加える必要があります:
偽のシークレットをファイルに追加し、ブランチにコミットします。
少なくとも1つの追加コミットを行います。履歴を調べると、次のようなものが表示されるはずです:
$ git log commit 456def Do other things commit 123abc Add fake secret ...たとえシークレットがコミット
456defから削除されても、まだ履歴内に存在し、変更が今プッシュされると露出します。履歴を修正するには、シークレットが導入されたコミットから対話型リベースを開始します:
git rebase -i 123abc~1編集ウィンドウで、シークレットを含むすべてのコミットについて、
pickをeditに変更します:edit 456def Do other things edit 123abc Add fake secretテキストファイルを開き、偽のシークレットを削除します。
変更をコミットします。
git add . git commit --amendオプション。シークレットを削除すると、コミット内の唯一の差分が削除される可能性があります。この場合、Gitは次のメッセージを表示します:
No changes You asked to amend the most recent commit, but doing so would make it empty.空のコミットを削除します:
git reset HEAD^リベースを続行します。
git rebase --continue次のコミットからシークレットを削除し、リベースを続行します。リベースが完了するまでこのプロセスを繰り返します:
Successfully rebased and updated refs/heads/secret-tutorial
シークレットが削除され、安全に変更をリモートにプッシュできます。
シークレットをプッシュした場合の対処法
変更にシークレットが含まれていることに気づく前に、変更をプッシュしてしまうことがあります。もしシークレットプッシュ保護がプロジェクトで有効になっている場合、プッシュは自動的にブロックされ、問題のあるコミットが表示されます。
しかし、シークレットがリモートリポジトリに正常にプッシュされた場合、それはもはや安全ではなく、直ちに失効する必要があります。多くの人がシークレットにアクセスできないと考えていても、それを交換する必要があります。露出したシークレットは重大なセキュリティリスクです。
次の手順
アプリケーションセキュリティを向上させるには、プロジェクトで少なくとも1つのシークレット検出方法を有効にすることを検討してください。