Credential Leak Prevention
gitleaks + pre-commit を導入し、ローカルコミット時にシークレット(API キー・トークン等)が混入するのを機械的にブロックするスキル。
ワークフロー全体像
Phase 0: 前提ツール確認
Phase 1: 現状スキャン
Phase 2: 自動セットアップ
Phase 3: 動作検証
Phase 0: 前提ツール確認
pre-commit と gitleaks は本スキルの必須前提条件である。
which pre-commit && pre-commit --version
which gitleaks && gitleaks version
どちらかが未インストールの場合、作業を中断してユーザーにインストールを促す:
⚠️ 以下のツールが未インストールです。
インストール方法(Homebrew):
brew install pre-commit gitleaks
インストール後に再度このスキルを実行してください。
両方確認できたら Phase 1 に進む。
Phase 1: 現状スキャン
調査スクリプト scripts/scan.sh を実行し、現状を取得する。
スクリプトは以下の状態を出力する:
pre-commit / gitleaks のインストール状況とバージョン
.pre-commit-config.yaml の有無と gitleaks hook の設定状況
.gitleaks.toml の有無と useDefault = true の設定状況
- git hook が有効か(
core.hooksPath と worktree を考慮した hooks ディレクトリに pre-commit があるか)
core.hooksPath の設定有無(husky 等の既存 hook 管理と競合するか)
スキャン結果をテーブル形式でユーザーに提示する:
| 項目 | 状態 |
|---|
| pre-commit インストール | ✓ / ✗ |
| gitleaks インストール | ✓ / ✗ |
| .pre-commit-config.yaml | 存在 / なし |
| gitleaks hook 設定 | 済 / 未設定 |
| .gitleaks.toml | 存在 / なし |
| useDefault = true | 設定済み / 未設定 |
| git hook 有効化 | 済 / 未実施 |
全て対策済みの場合: その旨を報告し、Phase 3 の検証のみ実行する。
Phase 2: 自動セットアップ
ユーザーに確認を取ってからセットアップスクリプト scripts/setup.sh を実行する。
スクリプトは以下を冪等に実行する:
.pre-commit-config.yaml に gitleaks hook を追加
- ファイルなし → 新規作成
- ファイルあり・gitleaks なし → gitleaks ブロックを末尾に追記
- gitleaks 設定済み → スキップ
.gitleaks.toml を作成(既に存在する場合はスキップ。go.sum があるリポジトリでのみ allowlist に追加)
続けて pre-commit install を実行する。.git/hooks への書き込みはサンドボックスに拒否されるため、最初からサンドボックス外で実行する。
Phase 1 で core.hooksPath が設定済みだった場合は pre-commit install が拒否されるため、実行せずにユーザーへ統合方針を確認する。
注意事項
.gitleaks.toml が既に存在する場合はスキップするため、既存の設定を壊さない
.pre-commit-config.yaml が複雑な構造の場合、追記した gitleaks ブロックの位置が適切か目視確認する
- 詳細は references/gitleaks-guide.md を参照
Phase 3: 動作検証
動作検証用のスクリプト scripts/validate.sh を実行する。
スクリプトはダミーの GitHub PAT を含むファイルを一時作成し、pre-commit run gitleaks でブロックされることを自動確認する。ファイルは検証後に自動削除される。
期待結果: gitleaks hook の出力に Failed が表示され、スクリプトは「✓ シークレットが正しく検出・ブロックされました」を出して exit code 0 で終了する。検出されなかった場合は exit code 1。
検証結果をテーブル形式で報告する:
| 検証項目 | 結果 |
|---|
| gitleaks hook がシークレットを検出してブロック | ✓ / ✗ |
| .gitleaks.toml の useDefault = true | ✓ / ✗ |
| git hook が有効化されている | ✓ / ✗ |
全て ✓ なら導入完了。
Phase 4: バージョンの継続的更新(オプション)
.pre-commit-config.yaml の rev は定期的に更新しないと、フックが陳腐化しセキュリティ上の穴が生じる。
ユーザーに下記を提案して終了する(提案だけ。修正はユーザーに任せる)。
`.pre-commit-config.yaml` の `rev` は定期的に更新しないと、フックが陳腐化しセキュリティ上の穴が生じます。
`pre-commit autoupdate` で手動更新するか、dependabotなどで自動更新してください。
Dependabot による自動更新の設定例↓
---
# `.github/dependabot.yml` に `pre-commit` エコシステムを追加する:
version: 2
updates:
- package-ecosystem: "pre-commit"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
cooldown:
semver-patch-days: 3 # パッチは 3 日後
semver-minor-days: 5 # マイナーは 5 日後
semver-major-days: 7 # メジャーは 7 日後
---
`cooldown` により、リリース直後の不安定なバージョンへの即時更新を防ぐ。