GitleaksでGitとGitHubでの機密情報漏洩を防ぐ方法

Gitleaksとは

GitleaksはGitリポジトリ内のコミット履歴や作業ディレクトリをスキャンし、ハードコードされたパスワード、APIキー、トークンなどの機密情報を検出するオープンソースの静的解析ツールです。

Go言語で書かれており、大規模なリポジトリでも高速でスキャンして、APIキーなどが含まれている場合は下図のように詳細が表示されます。

Gitleaks terminal command.

Gitleaksのインストール手順

macOS (Homebrew)

brew install gitleaks

Windows

GitHubのReleasesから「gitleaks_x.xx.x_windows_x64.zip」をダウンロードしてインストールします。(表示されていないときは「Show all」をクリックして表示)

https://github.com/gitleaks/gitleaks/releases

インストールが完了したら、ルートディレクトリで「gitleaks detect」または「gitleaks protect」を実行すれば機密情報が含まれるか、Gitleaksで確認できます。

$ gitleaks protect

    
    │╲
     
     
        gitleaks

4:52PM INF 0 commits scanned.
4:52PM INF scanned ~0 bytes (0) in 92.7ms
4:52PM INF no leaks found

Gitleaksのdetectとprotectの違い

detect は「過去から現在までを広く探す」、protect は「今まさに起きようとしている変更を守る」ためのコマンドです。

比較項目 gitleaks detect gitleaks protect
主な目的 履歴の監査・全体スキャン リアルタイムの流出防止
スキャン対象 全コミット履歴、または指定ディレクトリ 未コミットの変更(ステージング済みの差分)
実行速度 履歴の長さに依存(やや遅い) 非常に高速(現在の差分のみ)
主な利用シーン CI/CDパイプライン、導入時の初期スキャン ローカル開発、pre-commit フック
コマンドの性質 「過去」も含めた全量調査向き 「今」この瞬間の流出阻止向き

Gitleaksのpre-commitへの設定

Gitleaksはコミット前に実行するようにすれば、機密情報をコミットしてリポジトリに含めてしまう事故を回避できます。

やり方は、ルートディレクトリの .git/hooks/pre-commit ファイルに以下のコードを追加するだけです。

pre-commit
#!/bin/sh

# Gitleaksで機密情報の漏洩防止
gitleaks protect --staged -v

if [ $? -ne 0 ]; then
  echo "Gitleaks: 機密情報が検出されたため、コミットを中止しました。"
  exit 1
fi

これでGitのコミット時に「gitleaks protect --staged -v」が実行されて、機密情報が含まれるかチェックされます。

クレジットカード番号と携帯電話番号を検出する設定

Gitleaksはクレジットカード番号や携帯電話番号を標準では検出できないため、ルートディレクトリに.gitleaks.tomlファイルを作成して追加を推奨します。

.gitleaks.toml
[extend]
useDefault = true

[[rules]]
id = "credit-card"
description = "クレジットカード番号"
regex = '''\b(?:\d{4}[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}|\d{4}[ -]?\d{6}[ -]?\d{5})\b'''

[[rules]]
id = "japanese-mobile-phone-number"
description = "日本の携帯電話番号(060/070/080/090)を検出します"
regex = '''0[6789]0-?\d{4}-?\d{4}'''
keywords = ["060", "070", "080", "090"]

Gitleaksで検出可能な機密情報は、GoogleやAWSなどのAPIキーやトークンが中心です。

Gitleaksで検出されないものは、必ず.gitleaks.tomlファイルに追加してください。

pre-commit側も以下のように修正して、.gitleaks.tomlの設定を読み込みます。

pre-commit
#!/bin/sh

# Gitleaksで機密情報の漏洩防止
gitleaks protect --staged -v --config .gitleaks.toml

if [ $? -ne 0 ]; then
  echo "Gitleaks: 機密情報または禁止ワードが検出されたため、コミットを中止しました。"
  exit 1
fi

GitHub ActionsにもGitleaksを設定する

GitHub ActionsにもGitleaksを設定することで機密情報の漏洩防止がより強化されます。

設定するにはルートディレクトリに .github/workflows/gitleaks.yml を作成して、以下のコードを保存してGitHubにプッシュします。

gitleaks.yml
name: gitleaks

on:
  pull_request:
  push:
    branches: [main]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Gitleaks Scan
        uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Gitleaksをローカルだけに設定しても、複数人で作業している場合はあまり意味がないので、会社では必ずGitHub Actionsのほうも設定したほうが良いです。

pre-commitにファイル名とサイズのチェック処理を追加すると、機密情報漏洩のチェックがさらに強固になるのでオススメです。