プッシュ保護について
プッシュ保護は、変更をリポジトリにプッシュする前にシークレットをスキャンすることで、セキュリティ漏洩を防ぐことができます。
プッシュ保護によってセキュリティ保護されたリポジトリにシークレットをプッシュしようとすると、GitHub によってプッシュがブロックされます。 もう一度プッシュする前に、ブランチからシークレットを削除する必要があります。 ブロックされたプッシュを解決する方法の詳細については、この記事の「コマンド ラインでのブロックされたプッシュの解決」および「Web UI でのブロックされたコミットの解決」を参照してください。
シークレットを許可しても安全であると思われる場合は、保護をバイパスするオプションがあります。 詳細については、「ブロックされたシークレットのプッシュを許可する」および「シークレットのプッシュ保護をバイパスする」を参照してください。
プッシュ保護のためにサポートされるシークレットとサービス プロバイダーの詳細については、「secret scanning パターン」を参照してください。
コマンド ラインでのブロックされたプッシュの解決
サポートされているシークレットをプッシュ保護によって保護されたリポジトリにプッシュしようとすると、GitHub によってプッシュがブロックされます。 ブランチからシークレットを削除するか、指定された URL に従ってプッシュを許可できます。
注:
- Git 構成で現在のブランチだけでなく、複数のブランチへのプッシュがサポートされている場合、追加の意図しない参照がプッシュされるため、プッシュがブロックされる可能性があります。 詳細については、Git ドキュメントの
push.default
オプションを参照してください。 - プッシュ時にsecret scanningがタイムアウトした場合でも、GitHub ではプッシュ後もシークレットのコミットをスキャンします。
ブランチでの最新のコミットによって導入されたシークレットの削除
ブロックされたシークレットがブランチ上で最新のコミットによって導入された場合は、次のガイダンスに従うことができます。
- コードからシークレットを削除します。
- 変更をコミットするには、
git commit --amend
を実行します。 これにより、新しいコミットを作成する代わりに、シークレットを導入した元のコミットが更新されます。 git push
を使用して変更をプッシュします。
ブランチでの以前のコミットによって導入されたシークレットの削除
シークレットが Git 履歴の以前のコミットに表示される場合は、シークレットを削除することもできます。 これを行うには、最初にシークレットを導入したコミットを特定し、対話型のリベースを使用してコミット履歴を変更する必要があります。
-
ブランチをプッシュしようとしたときに表示されたエラー メッセージを調べてください。このエラー メッセージには、シークレットを含むすべてのコミットがリストされます。
remote: —— GitHub Personal Access Token —————————————————————— remote: locations: remote: - commit: 8728dbe67 remote: path: README.md:4 remote: - commit: 03d69e5d3 remote: path: README.md:4 remote: - commit: 8053f7b27 remote: path: README.md:4
-
次に、
git log
を実行して、ブランチ上のすべてのコミットの完全な履歴と、対応するタイムスタンプを表示します。test-repo (test-branch)]$ git log commit 8053f7b27 (HEAD -> main) Author: Octocat <1000+octocat@users.noreply.github.com Date: Tue Jan 30 13:03:37 2024 +0100 my fourth commit message commit 03d69e5d3 Author: Octocat <1000+octocat@users.noreply.github.com> Date: Tue Jan 30 13:02:59 2024 +0100 my third commit message commit 8728dbe67 Author: Octocat <1000+octocat@users.noreply.github.com Date: Tue Jan 30 13:01:36 2024 +0100 my second commit message commit 6057cbe51 Author: Octocat <1000+octocat@users.noreply.github.com Date: Tue Jan 30 12:58:24 2024 +0100 my first commit message
-
Focusing only on the commits that contain the secret, use the output of
git log
to identify which commit comes earliest in your Git history.- In the example, commit
8728dbe67
was the first commit to contain the secret.
- In the example, commit
-
Start an interactive rebase with
git rebase -i <COMMIT-ID>~1
.- For
<COMMIT-ID>
, use the commit identified in step 3. For example,git rebase -i 8728dbe67~1
.
- For
-
In the editor, choose to edit the commit identified in step 3 by changing
pick
toedit
on the first line of the text.edit 8728dbe67 my second commit message pick 03d69e5d3 my third commit message pick 8053f7b27 my fourth commit message
-
エディターを保存して閉じて、対話型リベースを開始します。
-
コードからシークレットを削除します。
-
git commit --amend
を使用して変更をコミットします。 -
git rebase --continue
を実行して、リベースを完了します。 -
git push
を使用して変更をプッシュします。
Web UI でのブロックされたコミットの解決
Web UI を使用して、サポートされているシークレットをプッシュ保護によって保護されたリポジトリにコミットしようとすると、GitHub によってコミットがブロックされます。
シークレットの場所に関する情報と、シークレットをプッシュできるオプションを含むダイアログ ボックスが表示されます。 簡単に見つけられるように、ファイルではシークレットに下線も引かれています。
Web UI でブロックされたコミットを解決するには、ファイルからシークレットを削除する必要があります。 シークレットを削除すると、変更をコミットできるようになります。
または、シークレットを許可しても安全であると判断した場合は、ダイアログ ボックスに表示されるオプションを使用してプッシュ保護をバイパスします。 Web UI からプッシュ保護をバイパスする方法の詳細については、「リポジトリと組織のプッシュ保護」を参照してください。