GitHub でシークレットスキャニングのプッシュ保護機能が個人アカウントごとの設定で有効化可能になりました(Beta機能)

2023.08.15

こんにちは、CX事業本部 Delivery部の若槻です。

GitHub ではシークレットスキャニングの「プッシュ保護(push protection)」機能により、シークレットが含まれたコミットをブロックするさせることができます。

今回のアップデートにより、以前まではリポジトリ、組織またはエンタープライズレベルでのみ有効化できたプッシュ保護機能が、ユーザー自身が個人のアカウント設定で有効化できるようになりました。

ちなみに本アップデートは現在は Beta 機能ですが、2024年1月にすべての GitHub Free 個人アカウントに対してプッシュ保護をデフォルトで有効にする予定とのことです。

試してみた

Permission を何も付与していない AWS IAM ユーザーで発行したアクセスキーで動作を試してみます。

シークレットスキャニングをサポートしているパートナーの一覧は以下から確認できます。

プライベートリポジトリでのシークレットスキャニングの利用は Advanced Security を契約している場合のみですが、今回はその環境は無かったため、パブリックリポジトリを使います。

設定を有効化

まず GitHub の設定画面からプッシュ保護を有効化します。

個人アカウントの Settings > Code security and analysis > User > Push protection for yourself のメニューが追加されているので、有効化します。

有効化できました。機能を有効化するとメニュー下部にフィードバックフォームが表示されます。フィードバックがある場合は、GitHub に送信することができます。

git push コマンドを試みてみる

ファイルの3行目および4行目に AWS のアクセスキー ID とシークレットを記載します。

$  git diff
diff --git a/README.md b/README.md
index 6bcb1b9..c5b696b 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,4 @@
 # public_test
+
+- dummyAccessKeyId:`AKIAQA2IFJE3MPUNZT6M`
+- dummySecretAccessKey:`gsR2i9DyGtzLXigRMVcDHeuS7Neg6vd0rCCd3W3F`
git add . && git commit -m "add dummy aws access key and secret"

リモートリポジトリに git push コマンドを試みてみると、push が拒否されました。

$ git push origin HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 401 bytes | 401.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error GH009: Secrets detected! This push failed.
remote: 
remote:             GITHUB PUSH PROTECTION
remote: ——————————————————————————————————————————————————————
remote:  Resolve the following secrets before pushing again.
remote: 
remote:  (?) Learn how to resolve a blocked push
remote:  https://docs.github.com/code-security/secret-scanning/pushing-a-branch-blocked-by-push-protection
remote: 
remote: 
remote: —— Amazon AWS Access Key ID ——————————————————————————
remote:  locations:
remote:    - commit: 9639a4beaf54117f28d12175fcc4e2c1454e3026
remote:      path: README.md:3
remote: 
remote:  (?) To push, remove secret from commit(s) or follow this URL to allow the secret.
remote:  https://github.com/cm-rwakatsuki/public_test/security/secret-scanning/unblock-secret/2TyxJE5gaeqesqrkd0y0wCiMYE5
remote: 
remote: 
remote: —— Amazon AWS Secret Access Key ——————————————————————
remote:  locations:
remote:    - commit: 9639a4beaf54117f28d12175fcc4e2c1454e3026
remote:      path: README.md:4
remote: 
remote:  (?) To push, remove secret from commit(s) or follow this URL to allow the secret.
remote:  https://github.com/cm-rwakatsuki/public_test/security/secret-scanning/unblock-secret/2TyxJH5nbyjx8VHROK1hsuk41J3
remote: 
remote: 
remote: 
To https://github.com/cm-rwakatsuki/public_test.git
 ! [remote rejected] HEAD -> main (push declined due to a detected secret)
error: failed to push some refs to 'https://github.com/cm-rwakatsuki/public_test.git'

README.mdの3行目に AWS のアクセスキー ID が、4行目にシークレットが記載されていることが原因で push が拒否されている旨がメッセージに表示されています。

git resetでコミットをリセットすると、再度プッシュ可能となりました。

$ git reset --hard HEAD^
HEAD is now at ad4c659 Update README.md
$ git push origin HEAD  
Everything up-to-date

コンソールからコミットを試みてみる

GitHub コンソールからも試してみます。

ファイルの3行目および4行目に AWS のアクセスキー ID とシークレットを記載します。

上記変更のコミットを試みてみます。

すると AWS のアクセスキー ID が3行目で見つかった旨の警告がダイアログで表示されました。ダイアログ右下の Allow Secret をクリックしてみます。

Push protection for secrets found a Amazon AWS Access Key ID secret on line 3.
Allowing this secret risks exposure. Instead, consider removing the secret from your commit and commit history.

シークレットのコミットが許可されてコミット可能となったようです。

Secret allowed. You can now commit these changes.

シークレットを残したまま再度コミットを試みると、次は4行目にあるシークレットについての警告が表示されました。コミットの許可は行ごとに行う必要があるようです。

Push protection for secrets found a Amazon AWS Secret Access Key secret on line 4.

Allow Secret をクリックしてシークレットのコミットを許可し、再度コミットを試みると、今度はコミットをすることができました。

コンソールからの場合は完全ブロックとはならず、許可さえすればコミットが可能となるので、git push コマンドとは異なり抜け道があるので注意が必要そうです。

おわりに

GitHub でシークレットスキャニングのプッシュ保護機能が個人アカウントごとの設定で有効化可能になったのでご紹介しました。

プッシュしてしまった後にアラートを発出するのではなく、プッシュしてしまう前にシークレットスキャニングを実行してコミットをブロックしてくれるのはとてもありがたい機能ですね。開発をしているリポジトリや組織でプッシュ保護が有効になっているとは限らないので、とりあえず個人アカウントで有効にしておくのが良いのではないでしょうか。

参考

以上