Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

誤って機密情報を公開しないためにGitHub Push Protectionを活用しよう

こんにちは、MLBお兄さんこと松村です。
お盆休みは子供と一緒に家で過ごしつつ、(何もすることがなくて)時間がゆっくり流れるような日常を過ごしました。


GitHub Secret Scanning とは

GitHub Secret Scanning は、リポジトリ内の機密情報(APIキーやパスワードなど)を検出することができる GitHub Advanced Security の機能の一つです。
プッシュ時に自動的にスキャンが行われ、機密情報が含まれている場合は警告が表示されます。
これにより、誤って機密情報を公開してしまうリスクを軽減できます。

docs.github.com

他にも、リポジトリにプッシュするデータに機密情報が含まれている場合に、プッシュを拒否する Push Protection という機能があります。

docs.github.com

設定方法

Secret Scanning が利用できるリポジトリでは、設定画面の「Advanced Security」のページで有効にすることができます。

  • Secret Scanning が無効の場合
  • Secret Scanning が有効の場合

それではプッシュするデータに実際に機密情報が含まれているときの、Push Protection の挙動を見てみましょう。

プッシュする機密情報

今回は GitHub の Personal Access Token (PAT) を機密情報として使用します。
リポジトリの README.md にトークンを書き込み、プッシュしてみます。

token='github_pat_xxx'

Secret Scanning は様々なパターンのシークレットを検出できます。
クラウドサービスや SaaS で発行されるキーなどが対象となっています。

サポートされている機密情報のパターンについては、GitHub のドキュメントを参照してください。
ただし、すべてのパターンが Push Protection の対象ではないことに注意してください。

docs.github.com

Visual Studio Code の場合

Visual Studio Code で機密情報を含むブランチをリポジトリにプッシュしようとすると、このようなエラーが発生します。

このダイアログに沿って Git のログを確認すると、次のような内容が出力されます。
プッシュするデータに機密情報が含まれているため、リモートリポジトリでプッシュがブロックされたことがわかります。

> git push -u origin pat
remote: error: GH013: Repository rule violations found for refs/heads/pat.        
remote: 
remote: - GITHUB PUSH PROTECTION        
remote:   —————————————————————————————————————————        
remote:     Resolve the following violations before pushing again        
remote: 
remote:     - Push cannot contain secrets        
remote: 
remote:             
remote:      (?) Learn how to resolve a blocked push        
remote:      https://docs.github.com/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line#resolving-a-blocked-push        
remote:             
remote:             
remote:       —— GitHub Personal Access Token ——————————————————————        
remote:        locations:        
remote:          - commit: f6688d84a3c7fe7b192a4e4eb4f5b5190695a4c8        
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/tsubakimoto/ghas-secret-scanning-playground/security/secret-scanning/unblock-secret/31WmHUPJwmXocsxMPJjnrgcyHsu        
remote:             
remote: 
remote: 
To https://github.com/tsubakimoto/ghas-secret-scanning-playground.git
 ! [remote rejected] pat -> pat (push declined due to repository rule violations)
error: failed to push some refs to 'https://github.com/tsubakimoto/ghas-secret-scanning-playground.git'

Visual Studio の場合

続いて Visual Studio で同じ操作を行った場合、Git 変更ウィンドウにエラーが表示されます。
同様に Git のログから、プッシュがブロックされたことが把握できます。

pat をプッシュしています
Enumerating objects: 5, done.
Delta compression using up to 8 threads
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Remote: Error: GH013: Repository rule violations found for refs/heads/pat.        
Remote: 
Remote: - GITHUB PUSH PROTECTION        
Remote:   —————————————————————————————————————————        
Remote:     Resolve the following violations before pushing again        
Remote: 
Remote:     - Push cannot contain secrets        
Remote: 
Remote:             
Remote:      (?) Learn how to resolve a blocked push        
Remote:      https://docs.github.com/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line#resolving-a-blocked-push        
Remote:             
Remote:             
Remote:       —— GitHub Personal Access Token ——————————————————————        
Remote:        locations:        
Remote:          - commit: f6688d84a3c7fe7b192a4e4eb4f5b5190695a4c8        
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/tsubakimoto/ghas-secret-scanning-playground/security/secret-scanning/unblock-secret/31WmHUPJwmXocsxMPJjnrgcyHsu        
Remote:             
Remote: 
Remote: 
To https://github.com/tsubakimoto/ghas-secret-scanning-playground.git
Error: pat -> pat (push declined due to repository rule violations)
failed to push some refs to 'https://github.com/tsubakimoto/ghas-secret-scanning-playground.git'

リモート リポジトリにプッシュできませんでした。詳細については、出力ウィンドウを参照してください。
リモート リポジトリへのプッシュ中にエラーが発生しました: リモート リポジトリにプッシュできませんでした。詳細については、出力ウィンドウを参照してください。

ログに含まれる URL

プッシュがブロックされたときの Git のログには、このようなメッセージが含まれています。

To push, remove secret from commit(s) or follow this URL to allow the secret.

このメッセージ直後の URL にアクセスすると、プッシュがブロックされた理由が表示されます。
画面には選択肢が3つあり、いずれかの理由を選択すると、リスクを承知でプッシュを行うことができます。

  1. テストで使用している機密情報であるためプッシュする
  2. 誤検知であるためプッシュする
  3. あとで機密情報を修正するためプッシュする


GitHub Secret Scanning はパブリックリポジトリでは無料で利用できます。
プライベートリポジトリでは GitHub Advanced Security のライセンスが必要となります。(アクティブコミッター1人につき月額19ドル)
ソースコードの安全性を保つために役立つため、ぜひ使ってみましょう。

また、実際に機密情報がプッシュされてしまい Secret Scanning のアラートが発生した場合、それをイベントとして Webhook で受信することができます。
詳しくは以前の記事をご覧ください。

aadojo.alterbooth.com