Skip to main content

プッシュ保護によってブロックされたブランチをプッシュする

プッシュ保護は、積極的にリポジトリ内の機密情報の漏洩から保護します。 ブロックされたプッシュを解決でき、検出されたシークレットが削除されたら、コマンド ラインまたは Web UI から作業ブランチに変更をプッシュできます。

この機能を使用できるユーザーについて

ユーザーのプッシュ保護は既定でオンになっており、個人用アカウント設定で無効にすることができます。

リポジトリと Organization のプッシュ保護は、すべての ユーザー所有 パブリック リポジトリで無料で利用できます。 GitHub Advanced Security のライセンスを持つ GitHub Enterprise Cloud を使用している Organization は、プライベート リポジトリと内部リポジトリでプッシュ保護を有効にすることもできます。

詳細については、「ユーザーのプッシュ保護」と 「リポジトリと組織のプッシュ保護」を参照してください。

プッシュ保護について

プッシュ保護は、変更をリポジトリにプッシュする前にシークレットをスキャンすることで、セキュリティ漏洩を防ぐことができます。

プッシュ保護によってセキュリティ保護されたリポジトリにシークレットをプッシュしようとすると、GitHub によってプッシュがブロックされます。 もう一度プッシュする前に、ブランチからシークレットを削除する必要があります。 ブロックされたプッシュを解決する方法の詳細については、この記事の「コマンド ラインでのブロックされたプッシュの解決」および「Web UI でのブロックされたコミットの解決」を参照してください。

シークレットを許可しても安全であると思われる場合は、保護をバイパスするオプションがあります。 詳細については、「ブロックされたシークレットのプッシュを許可する」および「シークレットのプッシュ保護をバイパスする」を参照してください。

プッシュ保護のためにサポートされるシークレットとサービス プロバイダーの詳細については、「secret scanning パターン」を参照してください。

コマンド ラインでのブロックされたプッシュの解決

サポートされているシークレットをプッシュ保護によって保護されたリポジトリにプッシュしようとすると、GitHub によってプッシュがブロックされます。 ブランチからシークレットを削除するか、指定された URL に従ってプッシュを許可できます。

:

  • Git 構成で現在のブランチだけでなく、複数のブランチへのプッシュがサポートされている場合、追加の意図しない参照がプッシュされるため、プッシュがブロックされる可能性があります。 詳細については、Git ドキュメントの push.default オプションを参照してください。
  • プッシュ時にsecret scanningがタイムアウトした場合でも、GitHub ではプッシュ後もシークレットのコミットをスキャンします。

ブランチでの最新のコミットによって導入されたシークレットの削除

ブロックされたシークレットがブランチ上で最新のコミットによって導入された場合は、次のガイダンスに従うことができます。

  1. コードからシークレットを削除します。
  2. 変更をコミットするには、git commit --amend を実行します。 これにより、新しいコミットを作成する代わりに、シークレットを導入した元のコミットが更新されます。
  3. git push を使用して変更をプッシュします。

ブランチでの以前のコミットによって導入されたシークレットの削除

シークレットが Git 履歴の以前のコミットに表示される場合は、シークレットを削除することもできます。 これを行うには、最初にシークレットを導入したコミットを特定し、対話型のリベースを使用してコミット履歴を変更する必要があります。

  1. ブランチをプッシュしようとしたときに表示されたエラー メッセージを調べてください。このエラー メッセージには、シークレットを含むすべてのコミットがリストされます。

    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
    
  2. 次に、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
    
    
  3. 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.
  4. 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.
  5. In the editor, choose to edit the commit identified in step 3 by changing pick to edit 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
    
  6. エディターを保存して閉じて、対話型リベースを開始します。

  7. コードからシークレットを削除します。

  8. git commit --amend を使用して変更をコミットします。

  9. git rebase --continue を実行して、リベースを完了します。

  10. git push を使用して変更をプッシュします。

Web UI でのブロックされたコミットの解決

Web UI を使用して、サポートされているシークレットをプッシュ保護によって保護されたリポジトリにコミットしようとすると、GitHub によってコミットがブロックされます。

シークレットの場所に関する情報と、シークレットをプッシュできるオプションを含むダイアログ ボックスが表示されます。 簡単に見つけられるように、ファイルではシークレットに下線も引かれています。

Web UI でブロックされたコミットを解決するには、ファイルからシークレットを削除する必要があります。 シークレットを削除すると、変更をコミットできるようになります。

または、シークレットを許可しても安全であると判断した場合は、ダイアログ ボックスに表示されるオプションを使用してプッシュ保護をバイパスします。 Web UI からプッシュ保護をバイパスする方法の詳細については、「リポジトリと組織のプッシュ保護」を参照してください。

参考資料