gitleaks × pre-commit で機密情報のうっかりコミットを防ぐ

こんにちは、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 で都度調整していけば、運用の負荷も大きくなりません。

「うっかり」を仕組みで防げると、レビューでコードそのものに集中できるようになりました。

同じような課題を持っている方の参考になれば幸いです。