
こんにちは、AIイノベーション推進チームの黒木です。
リポジトリからの機密情報漏洩は、もはや他人事ではありません。
弊社では gitleaks と pre-commit でコミット時の自動チェックを導入しています。
この記事ではその内容を紹介します。
なぜ機密情報のコミットを防ぎたいのか
機密情報を一度 push してしまうと、削除しても完全には消えません。 コミット履歴に残り続け、GitHub の PR からも確認できてしまいます。
気を付けていても、誤ってコミットしてしまうことはあります。
弊社ではコミットされる前に「自動で止める」仕組みを用意しているので、そちらを共有させていただきます。
仕組みの全体像
機密情報のコミットをダブルチェックする構成にしました。 ローカルが早期検知、GitHub Actions が最終チェックです。
- ローカルで commit 前に自動チェックする(Git hooks)
- PR 作成時に CI でも再チェックする(GitHub Actions)
ローカルのチェックだけでは、各自の環境設定に依存してしまいます。
そのため、GitHub Actions 側でも同じチェックを実行し、取りこぼしを防ぐ構成にしました。
使うツールの紹介
- gitleaks: ソースコードや Git 履歴から、APIキー・トークンなどそれっぽい文字列を検出してくれる OSS です。
- pre-commit: commit の直前に「フック」と呼ばれる自動チェックを走らせるためのフレームワークです。設定ファイルに書いたチェッカーをまとめて呼び出してくれます。
この 2 つを組み合わせて、コミット直前に gitleaks を自動で走らせていきます。
導入手順
1. gitleaks と pre-commit をインストールする
% brew install gitleaks
% pip install pre-commit
2. gitleaks の設定を追加する
リポジトリのルートに .gitleaks.toml を作成します。
[extend] useDefault = true
まずはデフォルトのルールで動かします。
誤検知が出てきたら [allowlist] に追記していく運用にしました。
[allowlist] の書き方はこのような形です。
[allowlist] description = "テスト用のダミー値を許可する" regexes = ['''DUMMY_API_KEY''']
3. pre-commit の設定を追加する
リポジトリのルートに .pre-commit-config.yaml を作成します。
repos: - repo: https://github.com/gitleaks/gitleaks rev: v8.30.1 hooks: - id: gitleaks args: - --config=.gitleaks.toml
4. pre-commit を有効化する
各自のリポジトリで、一度だけ次のコマンドを実行します。
% pre-commit install
これで .git/hooks にフックが仕込まれ、commit 時に gitleaks が自動で走るようになります。
5. GitHub Actions を追加する
pre-commit install を忘れている人がいても CI でカバーできるよう、Actions でも同じ .pre-commit-config.yaml を使って実行します。
CI 側では Python 環境の用意を簡単にするため、uv の uvx 経由で pre-commit を呼び出しています。
name: "Secret Scan" on: pull_request: permissions: contents: read jobs: secret-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 - run: uvx pre-commit run gitleaks --all-files
ローカルと CI で同じ設定ファイルを参照するので、ルールにズレが出ません。
動作確認
commit 時に機密情報が含まれていない場合
機密情報が含まれていなければ、commit はそのまま通ります。
% git commit -m "fix: 表示崩れを修正" Detect hardcoded secrets.................................................Passed
commit 時に機密情報を検知した場合
機密情報らしき値が含まれていると、hook のチェックが失敗して commit がブロックされます。
検出された行・ファイル・ルールも一緒に出力されるので、どこを直せば良いかすぐに分かります。
% git commit -m "test: gitleaks の動作確認" Detect hardcoded secrets.................................................Failed - hook id: gitleaks - exit code: 1 Finding: api_key = "REDACTED" Secret: REDACTED RuleID: generic-api-key Entropy: 5.459432 File: gitleaks-test.txt Line: 1 Fingerprint: gitleaks-test.txt:generic-api-key:1
commit 時の自動チェックに加えて、手動で実行して確認することもできます。
手動で gitleaks を実行する
履歴も含めてまとめてスキャンするコマンドです。導入時に一度実行して、既存の履歴に機密情報が混ざっていないか確認しておくと安心です。
% gitleaks git --config .gitleaks.toml --redact
手動で pre-commit を実行する
普段の commit と同じ条件でチェックできます。
% uvx pre-commit run gitleaks --all-files
まとめ
gitleaks と pre-commit を組み合わせて、ローカルと CI のダブルチェックで機密情報のコミットを止める仕組みを導入しています。
設定は最低限でも十分に効果があります。
誤検知が出てきたら allowlist で都度調整していけば、運用の負荷も大きくなりません。
「うっかり」を仕組みで防げると、レビューでコードそのものに集中できるようになりました。
同じような課題を持っている方の参考になれば幸いです。