コマンド ラインからのプッシュ保護について
プッシュ保護は、サポートされているシークレットなどプッシュをブロックすることで、誤ってシークレットをリポジトリにコミットすることを防ぎます。
サポートされているシークレットをコマンド ラインからプッシュ保護によって保護されたリポジトリにプッシュしようとすると、GitHub によってプッシュがブロックされます。
次のいずれかを行う必要があります。
- ブランチからシークレットを削除します。 詳しくは、「ブロックされたプッシュの解決」を参照してください。
- 表示された URL に従って、プッシュを許可するために使用できるオプションを確認します。 詳細については、「プッシュ保護をバイパスする」と「バイパス特権を要求する」を参照してください。
検出されたシークレットは、コマンド ラインに一度に最大 5 つ表示されます。 リポジトリで特定のシークレットが既に検出されていて、アラートが既に存在する場合、GitHub はそのシークレットをブロックしません。
シークレットが本物で、後で修正する予定であることを確認する場合は、できるだけ早くシークレットの修復を目指す必要があります。 たとえば、シークレットを取り消し、リポジトリのコミット履歴からシークレットを削除できます。 不正アクセスを回避するために、公開されている実際のシークレットを取り消す必要があります。 取り消す前に、まずシークレットをローテーションすることを検討できます。 詳しくは、「リポジトリからの機微なデータの削除」をご覧ください。
メモ
- Git 構成で現在のブランチだけでなく、複数のブランチへのプッシュがサポートされている場合、追加の意図しない参照がプッシュされるため、プッシュがブロックされる可能性があります。 詳細については、Git ドキュメントの push.defaultオプションを参照してください。
- プッシュ時にsecret scanningがタイムアウトした場合でも、GitHub ではプッシュ後もシークレットのコミットをスキャンします。
ブロックされたプッシュの解決
ブロックされたプッシュを解決するには、そのプッシュが表示されるすべてのコミットからシークレットを削除する必要があります。
- シークレットが最新のコミットによって導入された場合は、「ブランチでの最新のコミットによって導入されたシークレットの削除」を参照してください。
- シークレットが以前のコミットに表示される場合は、「ブランチでの以前のコミットによって導入されたシークレットの削除」を参照してください。
メモ
GitHub UI で禁止されたコミットを解決する方法については、「GitHub UI でのプッシュ保護の操作」を参照してください。
ブランチでの最新のコミットによって導入されたシークレットの削除
ブロックされたシークレットがブランチ上で最新のコミットによって導入された場合は、次のガイダンスに従うことができます。
- コードからシークレットを削除します。
- 変更をコミットするには、git commit --amend --allを実行します。 これにより、新しいコミットを作成する代わりに、シークレットを導入した元のコミットが更新されます。
- 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 logto identify which commit comes earliest in your Git history.- In the example, commit 8728dbe67was 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 picktoediton 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 add .を使って変更をステージング領域に追加します。メモ 完全なコマンドは git add .です。- addと- .の間にはスペースがあります。
- スペースの後のピリオドはコマンドの一部です。
 
- 
git commit --amendを使用して変更をコミットします。
- 
git rebase --continueを実行して、リベースを完了します。
- 
git pushを使用して変更をプッシュします。
プッシュ保護をバイパスする
プッシュしても安全であると思われるシークレットを GitHub がブロックする場合、そのシークレットをプッシュすることを許可する理由を指定することで、ブロックをバイパスできます。
シークレットのプッシュを許可すると、 [セキュリティ] タブにアラートが作成されます。シークレットが擬陽性かテスト用のみであれば、GitHub によってアラートが閉じられ、通知が送信されません。 シークレットが実際のものであり、後で修正することを指定した場合、GitHub はセキュリティ アラートを開いたままにし、コミットの作成者とリポジトリ管理者に通知を送信します。 詳しくは、「シークレット スキャンからのアラートの管理」をご覧ください。
共同作成者がシークレットのプッシュ保護ブロックをバイパスすると、GitHub は、メール通知にオプトインした organization 所有者、セキュリティ マネージャー、リポジトリ管理者にもメール アラートを送信します。
ブロックをバイパスするオプションが表示されない場合は、リポジトリ管理者または組織の所有者は、プッシュ保護に関するさらに厳密な制御を構成しています。 代わりに、コミットからシークレットを削除する、またはブロックされたシークレットをプッシュするために "特権のバイパス" 要求を送信する必要があります。 詳しくは、「バイパス特権を要求する」を参照してください。
- 
プッシュがブロックされたら、プッシュを実行したのと同じユーザーとして、GitHub から返される URL にアクセスします。 異なるユーザーがこの URL にアクセスしようとすると、 404エラーが表示されます。
- 
シークレットをプッシュできる理由を最もよく表しているオプションを選択します。 - 
シークレットがテストでのみ使用され、脅威がない場合は、 [テストで使用されます] をクリックします。 
- 
検出された文字列がシークレットでない場合は、 [誤検知です] をクリックします。 
- 
シークレットが本物で、後で修正する予定の場合は、 [後で修正します] をクリックします。 
 メモ リポジトリでシークレット スキャンが有効になっている場合は、プッシュ保護をバイパスする理由を指定する必要があります。 シークレット スキャンが有効になっていない_パブリック_ リポジトリにプッシュする場合でも、ユーザー アカウントに対して既定で有効になっている_ユーザーのプッシュ保護_により、シークレットが誤ってプッシュされることから保護されます。 ユーザーのプッシュ保護により、サポートされているシークレットがプッシュに含まれている場合、GitHub はパブリック リポジトリへのプッシュを自動的にブロックしますが、シークレットを許可する理由を指定する必要はなく、GitHub は許可しません。アラートを生成します。 詳しくは、「ユーザーのプッシュ保護」をご覧ください。 
- 
- 
[このシークレットをプッシュできるようにする] をクリックします。 
- 
3 時間以内にコマンド ラインでプッシュを再試行します。 3 時間以内にプッシュしていない場合は、このプロセスを繰り返す必要があります。 
バイパス特権の要求
プッシュ保護によってプッシュがブロックされていて、シークレットが安全にプッシュされると思われる場合、ブロックをバイパスするアクセス許可を要求できます。 要求は、指定されたレビュー担当者のグループに送信されます。レビュー担当者は、要求を承認または拒否します。
要求は 7 日後に期限切れになります。
- プッシュがブロックされたら、プッシュを実行したのと同じユーザーとして、GitHub から返される URL にアクセスします。 異なるユーザーがこの URL にアクセスしようとすると、404エラーが表示されます。
- [バイパス特権を要求する] で、コメントを追加します。 たとえば、シークレットがプッシュしても安全だと考える理由や、ブロックをバイパスする要求に関するコンテキストを提供する理由を説明できます。
- [要求の送信] をクリックします
- メール通知で要求への応答を確認します。
要求が確認されると、決定を通知する電子メールが届きます。
要求が承認された場合は、シークレットなどコミット (またはコミット) と、同じシークレットを含む将来のコミットをリポジトリにプッシュできます。
要求が拒否された場合は、再度プッシュする前に、シークレットを含むすべてのコミットからシークレットを削除することが必要です。 禁止されたシークレットを削除する方法については、「ブロックされたプッシュの解決」を参照してください。