APIキーをGitHubに誤コミットしてしまう問題
AIツールを使った開発が増えるほど、コードに直接APIキーを書くケースが増えています。Claude APIのキー、StripeのシークレットキーをうっかりGitHubにコミットしてしまい、数分後に不正利用されて高額請求が来た——そういう事例は珍しくありません。
この記事では、APIキーの誤コミットを二段階で防ぐOSSコンビ「Gitleaks」と「TruffleHog」を紹介します。
この記事でわかること:
- Gitleaksでコミット前にシークレットを検知してブロックする方法
- TruffleHogでCI/CDに流れてきたキーが「本物かどうか」を検証する方法
- 両ツールの組み合わせ方と、どちらを先に導入すべきか
なぜコミット前に止めないといけないのか
GitHubにAPIキーが一度プッシュされると、たとえすぐに削除してもgitの履歴には残ります。プライベートリポジトリであっても、過去のコミットを掘ればキーは見えます。さらにGitHubは公開リポジトリのシークレットを自動スキャンしており、発見されると即座にサービス側へ通知が飛ぶ仕組みになっています。
「後から消せばいい」という考えが通用しないのは、GitHubのボットや悪意ある自動スキャナがほぼリアルタイムで新しいコミットを監視しているからです。
Gitleaks ── コミット前に150以上のパターンで検知
Gitleaksはコミット前に実行されるpre-commitフックとして動作し、パスワード、APIキー、JWTなど150以上のパターンを正規表現で検知してコミットをブロックします。GoREADMEやアノテーションも解析対象で、ファイルの種類を問わず検査します。
インストールはHomebrewで1行です。
brew install gitleaks
リポジトリにpre-commitフックとして組み込むには、.pre-commit-config.yaml を作成します。
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.1
hooks:
- id: gitleaks
pre-commit install を実行すると、以降はコミットのたびにGitleaksが走ります。シークレットが検出されるとコミット自体がブロックされ、何が引っかかったかを表示します。
GitHub Actionsで使う場合は、公式のgitleaks-actionが用意されています。
name: gitleaks
on: [pull_request, push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Gitleaksが優れているのは、「検知して止める」段階に特化している点です。ルールベースなので高速に動作し、コミット時の待ち時間はほぼゼロです。
TruffleHog ── 「本物のキーかどうか」まで検証する
TruffleHogはGitleaksよりも検出の範囲が広く、キーが実際に有効かどうかまでAPI経由で確認します。これをTruffleHogは「Validation(検証)」と呼んでいます。無効になったキーや形式だけが似ているダミーキーを除外し、本当に危険なものだけを報告します。
対応するシークレットタイプは800以上。AWS、Stripe、GitHub、Slack、Supabase、OpenAIなどの主要なサービスをすべてカバーしています。
インストール方法は複数あります。
# macOS
brew install trufflehog
# インストールスクリプト(Linux含む)
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin
CI/CDでPRに含まれるコミットだけを検査する使い方が典型的です。
trufflehog git file://. --since-commit main --branch feature-1 --results=verified,unknown --fail
--results=verified を指定すると、実際にサービスへの認証が通ったキーだけを報告します。誤検知が大幅に減り、アラート疲れを防げます。
GitHub Actionsでは以下のように組み込みます。
- name: TruffleHog OSS
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}
head: HEAD
extra_args: --results=verified,unknown
TruffleHogは過去のコミット履歴も遡って検査できます。新しくプロジェクトに加わった場合や、既存のリポジトリを初めてスキャンするときに使えます。
trufflehog git https://github.com/your-org/your-repo --results=verified
2つをどう組み合わせるか
Gitleaksは「コミット前のローカル防衛」、TruffleHogは「CI/CDでの二重確認」という役割分担が自然です。
| ツール | タイミング | 役割 |
|---|---|---|
| Gitleaks | コミット前(pre-commit) | 150以上のパターンでブロック |
| TruffleHog | CI/CD(Pull Request時) | 800以上のタイプを検証、本物かどうか確認 |
まずGitleaksをpre-commitフックに入れてコミット時に止める層を作り、次にTruffleHogをGitHub ActionsのPRチェックに追加して漏れを確認する、という順番で導入すると効果的です。
どちらか1つだけ選ぶなら、ローカルで止められるGitleaksを先に入れることを勧めます。リモートに届いてからCIが検知するより、コミットの瞬間に止めるほうがダメージが小さいからです。
料金
Gitleaks、TruffleHogともに無料のOSSです。商用利用も可能で、セルフホストで完結します。
TruffleHogにはエンタープライズ版(TruffleHog Enterprise)もあり、Jira、Slack、Confluence、Microsoft Teamsなどへのスキャン対象拡張や継続モニタリング機能が追加されますが、個人・小規模チームであればOSS版で十分です。
Gitleaksのスター数は約26,400、TruffleHogは約26,000と、どちらも広く実績のあるプロジェクトです(2026年4月時点)。
どのAPIキーがカバーされているか
ツイートで紹介されていたClaude API、Supabase、Stripeはいずれも両ツールのデフォルトルールに含まれています。他にも以下が代表的な検知対象です。
- AWS Access Key / Secret Key
- GitHub Personal Access Token
- OpenAI API Key
- Google Cloud API Key
- Slack Bot Token
- Twilio Auth Token
プロジェクト独自のシークレット形式がある場合、Gitleaksはカスタムルールを.gitleaks.tomlに追加することで対応できます。
まとめに代えて
誤コミットは「気をつければいい」だけでは防げません。Gitleaksをpre-commitに仕込んでコミット時にブロックし、TruffleHogをCIに入れて有効なキーの流出を検証する、この二段構えを整えれば、ヒューマンエラーに依存しない防衛ラインができます。両ツールとも導入は数分で完了し、維持コストもほぼゼロです。