こんにちは、MLBお兄さんこと松村です。
MLB はプレーオフ争いが白熱しておりますが、残念ながら我がニューヨーク・ヤンキースは(察し)な状況です。
GitHub Secret scanning
GitHub が提供するコードについてのセキュリティ機能である「Secret scanning」というのはご存知でしょうか?
Secret scanning とは、リポジトリをスキャンすることでリポジトリのコードに誤ってコミットされたシークレットを検知する機能です。
また、シークレットがプッシュされることを防ぐ機能もあります。 (Push protection)
Secret scanning はパブリックリポジトリであれば無料で利用することができます。
GitHub Advanced Security のライセンスを有していれば、プライベートリポジトリでも利用することができます。
何をスキャンするか
Secret scanning が検出する対象は「シークレット」です。
一般的にシークレットとは「秘匿情報」であり、アプリケーションコードにおいては DB の接続文字列や API キーなどが該当します。
Secret scanning でサポートされているシークレットのパターンはドキュメントにて公開されています。
例えば私がよく使う技術のうち、該当しているものもいくつかあります。
- Azure : サービスプリンシパルのクライアントシークレット
- Azure : Functions の認証コード
- Azure : データベースの接続文字列
Secret scanning を有効にする
リポジトリが Secret scanning 機能を利用することができる場合、リポジトリの設定画面から有効にすることができます。
[Settings] タブ > [Code security and analysis] > [Secret scanning] > [Enable]
シークレットスキャンアラートを見る
Secret scanning を有効にするとリポジトリのスキャンが始まります。
検出されたシークレットが存在する場合、[Security] タブ > [Secret scanning] にシークレットスキャンアラートが表示されます。
以下の画像では Azure Functions の認証コードが検出された状態となっています。
このまま認証コードが含まれた状態でいるのは良くないため、該当箇所を変更するなどの対策を行う必要があります。
シークレットスキャンアラートはリポジトリ管理者と組織のオーナーには、メールにてアラートが届きます。
個人的にはメールでの通知は見落としやすく、別の方法での通知受け取りを模索したかったです。
そこで Webhook によるシークレットスキャンアラートを受け取る方法があったため、ご紹介します。
Secret scanning の Webhook
GitHub は様々なイベントを Webhook にて送信することができます。ドキュメントはこのあたり。
Secret scanning のイベントは2種類あります。
これらの値はX-GitHub-Event
ヘッダーにも含まれます。
secret_scanning_alert
- シークレットスキャンアラートの情報が含まれる
secret_scanning_alert_location
secret_scanning_alert
が発生した際の、該当するシークレットの場所についての情報が含まれる
Webhook を登録する
Secret scanning の Webhook は組織またはリポジトリに登録することができます。
- 組織 : https://github.com/organizations/{organization}/settings/hooks/
- リポジトリ : https://github.com/{organization}/{repository}/settings/hooks/
イベントは Send me everything
(全イベント) か、個別に選択します。
設定を行い、実際にシークレットスキャンアラートが発生すると Webhook が送信されます。
送信された履歴や内容は GitHub にて確認することができます。
Webhook を受信しただけでは十分ではないため、GitHub Actions と連携したり、チャットツールに投稿したりなどしましょう。
シークレットは「混入しないこと」ももちろん大事ですが、「混入にすばやく気付く」ことも大事ですので、Secret scanning は積極的に使っていきたいですね。