こんにちは、MLBお兄さんこと松村です。
お盆休みは子供と一緒に家で過ごしつつ、(何もすることがなくて)時間がゆっくり流れるような日常を過ごしました。
GitHub Secret Scanning とは
GitHub Secret Scanning は、リポジトリ内の機密情報(APIキーやパスワードなど)を検出することができる GitHub Advanced Security の機能の一つです。
プッシュ時に自動的にスキャンが行われ、機密情報が含まれている場合は警告が表示されます。
これにより、誤って機密情報を公開してしまうリスクを軽減できます。
他にも、リポジトリにプッシュするデータに機密情報が含まれている場合に、プッシュを拒否する Push Protection という機能があります。
設定方法
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 の対象ではないことに注意してください。
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つあり、いずれかの理由を選択すると、リスクを承知でプッシュを行うことができます。
- テストで使用している機密情報であるためプッシュする
- 誤検知であるためプッシュする
- あとで機密情報を修正するためプッシュする
GitHub Secret Scanning はパブリックリポジトリでは無料で利用できます。
プライベートリポジトリでは GitHub Advanced Security のライセンスが必要となります。(アクティブコミッター1人につき月額19ドル)
ソースコードの安全性を保つために役立つため、ぜひ使ってみましょう。
また、実際に機密情報がプッシュされてしまい Secret Scanning のアラートが発生した場合、それをイベントとして Webhook で受信することができます。
詳しくは以前の記事をご覧ください。