【ツール活用|実務向け】CI/CDの「水際」で防ぐ:GitHub Secret ScanningとPush Protection導入による機密漏洩対策

1. 導入:なぜ今、Secret Scanningが必要なのか

現代のDevOps環境において、ソースコードの管理は開発の要です。しかし、開発者が誤ってAWSアクセスキーやSlackのAPIトークンなどの「機密情報(シークレット)」をコードに含めたままプッシュしてしまう事故は後を絶ちません。一度パブリックリポジトリにプッシュされたシークレットは、たとえ後から削除しても履歴(Git History)に残ります。これを検知して防ぐのが「Secret Scanning」と「Push Protection」です。本記事では、この機能を活用し、CI/CDパイプライン以前の「水際」で事故を未然に防ぐ仕組みを解説します。

2. 基礎知識:Secret ScanningとPush Protectionの仕組み

・Secret Scanning:GitHubがリポジトリ内のコードをスキャンし、既知のフォーマット(AWSキー、Google Cloudトークン等)と一致する文字列を検出する機能です。
・Push Protection:プッシュの直前にGitHub側でスキャンを行い、機密情報が含まれていると判断された場合に「拒否(Reject)」する機能です。これにより、リモートリポジトリへ機密情報が到達する前にローカルで開発者が気づくことができます。

3. 実装・解決策:GitHubでの設定手順

この機能はGitHubのリポジトリ設定から数クリックで有効化できます。
1. リポジトリの [Settings] を開く。
2. [Code security and analysis] を選択。
3. [Secret scanning] の [Enable] をクリック。
4. [Push protection] の [Enable] をクリック。
これで、該当のリポジトリに対してPush Protectionが適用され、誤ったコミットをプッシュしようとするとエラーが返るようになります。

4. サンプルプログラム:検知されるコード例と対策

以下のようなコードをプッシュしようとすると、Push Protectionが作動し、ターミナルでエラーが発生します。

// サンプル:AWSのアクセスキーがハードコードされた悪い例
const awsConfig = {
// このようなキーを直接記述するとPush Protectionでブロックされます
accessKeyId: “AKIAIOSFODNN7EXAMPLE”,
secretAccessKey: “wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY”
};

/
対策方法:
1. 修正:機密情報を環境変数に移行する
2. 修正:.envファイルを作成し、.gitignoreに追加する
3. コミット履歴から削除:git filter-repo や BFG Repo-Cleaner を使用する
/

console.log(“設定完了”);

5. 応用・注意点:現場で陥りやすい罠と運用

・ローカル環境での防御:Push ProtectionはあくまでGitHubへのプッシュ時が対象です。より安全性を高めるには、開発者のローカル環境で pre-commit フックを使用し、コミット前に検知する「gitleaks」などのツールを導入することを強く推奨します。
・例外処理:どうしてもダミーデータとしてキーを記載しなければならない場合は、シークレットの無効化を先に行うか、`allow` コメントを付与することで一時的に回避可能です。ただし、これは最終手段であり、可能な限り環境変数(AWS Secrets ManagerやGitHub Secrets)での管理を徹底してください。
・自動無効化:万が一漏洩してしまった場合は、即座に該当キーを無効化(削除・再生成)し、AWS等の管理コンソールから漏洩の事実を把握し、監査ログを確認するフローをチーム内で確立しておきましょう。

タイトルとURLをコピーしました