【第11回】Claude Code Hooks で事故を防ぐ — git secrets / 本番DB保護の実装

「Claude が暴走したらどうしよう」——これは Claude Code を本格運用する誰もが考える不安です。
筆者はこの不安を Hooks で解消しました。9つの安全装置を組み合わせた多層防御を構築し、本番事故をゼロにしています。この記事では、その9つの Hooks をすべて実コード付きで公開します。
前半は無料パートで「事故が起きる典型パターン」、後半(有料パート)で具体的な Hook の実装を全公開します。
結論:本番事故は「9つの安全装置」で完全に防げる
Claude Code を本格運用していて起きる事故は、ほぼすべて次の9パターンに集約されます。
- 本番 DB の TRUNCATE / DELETE
- API キーのコミット
.envのリポジトリへの混入- production ブランチへの直接 push
rm -rfで大量ファイル削除- 依存パッケージの不正な追加
- CI/CD 設定の無断変更
- GitHub Token の漏洩
- 本番 Stripe キーでのテスト
これら9つすべてに対して、Hooks による安全装置を1対1で対応させます。
なぜ Hooks なのか
「気を付ける」「ルールを文書化する」では事故は防げません。Claude Code は確率論的に動くので、稀に間違ったコマンドを実行します。
Hooks は「実行を物理的に止める」唯一の手段 です。Claude が間違ったコマンドを生成しても、Hook が exit 1 を返せば実行されません。
事故が起きる典型パターン
パターンA:本番 DB 操作の事故
「ローカルで DELETE FROM users WHERE id = 1 をやろうとしたら、DATABASE_URL が本番に向いていた」というパターン。気付いたときには手遅れです。
パターンB:シークレット漏洩
.env.production を git add してしまう、API キーをハードコードしたままコミットする、などの事故。一度公開リポジトリに入ると、削除しても履歴に残ります。
パターンC:CI 設定の暴走
Claude が .github/workflows/ を勝手に書き換えて、無限ループの GitHub Actions を作ってしまう。気付かないと月数万円の請求が来ます。
これらをすべて Hooks で防ぎます。
Claude Code を本格活用するなら Max プラン(月$100〜、定額でトークン使い放題)が必須です。このシリーズの全実装例は Max プランで動作確認済みです。
9つの安全装置の実装
ここから有料パートです。9つの Hooks すべてを ~/.claude/settings.json に設定する実コードで解説します。
完全な settings.json
まず全体像を示します。詳細は後述します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/bash-safety-check.sh"
}
]
},
{
"matcher": "Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/file-safety-check.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/post-edit-scan.sh"
}
]
}
]
}
}
3つのシェルスクリプトに処理を分けます。順に実装します。
安全装置1〜3:bash-safety-check.sh
~/.claude/hooks/bash-safety-check.sh を作成します。
#!/bin/bash
# bash-safety-check.sh
# Bash コマンド実行前のチェック
INPUT="$CLAUDE_TOOL_INPUT"
# 装置1: 本番 DB 操作の検出
if echo "$INPUT" | grep -qE '(DROP TABLE|TRUNCATE|DELETE FROM users|DELETE FROM orders)' && echo "$INPUT" | grep -qE '(prod|production|PROD)'; then
echo "BLOCKED: Production DB destructive operation detected" >&2
exit 1
fi
# 装置2: rm -rf の保護
if echo "$INPUT" | grep -qE 'rm -rf (/|\$HOME|~)'; then
echo "BLOCKED: Dangerous rm -rf detected" >&2
exit 1
fi
# 装置3: 本番 Stripe キーの使用検出
if echo "$INPUT" | grep -qE 'sk_live_[a-zA-Z0-9]+'; then
echo "BLOCKED: Live Stripe key in command" >&2
exit 1
fi
exit 0
実行権限を付けます。
chmod +x ~/.claude/hooks/bash-safety-check.sh
安全装置4〜6:file-safety-check.sh
ファイル編集前のチェック。
#!/bin/bash
# file-safety-check.sh
FILE_PATH="$CLAUDE_FILE_PATH"
# 装置4: .env を直接編集させない
if [[ "$FILE_PATH" =~ \.env$ ]] || [[ "$FILE_PATH" =~ \.env\.production$ ]]; then
echo "BLOCKED: Direct .env file edit. Use .env.example instead." >&2
exit 1
fi
# 装置5: CI/CD 設定の変更を警告
if [[ "$FILE_PATH" =~ \.github/workflows/ ]]; then
echo "WARNING: Editing CI workflow. This requires manual review." >&2
# ブロックはせず警告のみ。完全ブロックしたければ exit 1
fi
# 装置6: シークレット系ファイルのブロック
if [[ "$FILE_PATH" =~ (credentials|secret|private_key|\.pem) ]]; then
echo "BLOCKED: Editing sensitive file: $FILE_PATH" >&2
exit 1
fi
exit 0
安全装置7〜9:post-edit-scan.sh
ファイル編集後の検証。
#!/bin/bash
# post-edit-scan.sh
FILE_PATH="$CLAUDE_FILE_PATH"
# 装置7: API キーのハードコード検出
if [[ "$FILE_PATH" =~ \.(ts|tsx|js|jsx|py)$ ]]; then
if grep -qE '(sk_live_|sk_test_|AKIA[0-9A-Z]{16}|ghp_[a-zA-Z0-9]{36}|xox[baprs]-)' "$FILE_PATH" 2>/dev/null; then
echo "BLOCKED: Hard-coded secret detected in $FILE_PATH" >&2
exit 1
fi
fi
# 装置8: 環境変数のリテラル代入を検出
if grep -qE 'process\.env\.[A-Z_]+ *= *"[^"]+"' "$FILE_PATH" 2>/dev/null; then
echo "WARNING: Direct env var assignment. Use .env file instead." >&2
fi
# 装置9: console.log( に password|secret|token が含まれている
if grep -qE 'console\.log\([^)]*(password|secret|token|api_?key)' "$FILE_PATH" 2>/dev/null; then
echo "BLOCKED: Sensitive data in console.log: $FILE_PATH" >&2
exit 1
fi
exit 0
実行権限を付けて完了です。
chmod +x ~/.claude/hooks/post-edit-scan.sh
CI/CD への組み込み
Hooks はローカルだけでなく、GitHub Actions 内でも有効です。CI 環境用の .claude/settings.json をリポジトリに置けば、Ep.08 で扱った Issue 駆動開発でも安全装置が働きます。
# .github/workflows/claude-implement.yml の中で
- name: Setup Claude hooks
run: |
mkdir -p ~/.claude/hooks
cp .claude/hooks/*.sh ~/.claude/hooks/
chmod +x ~/.claude/hooks/*.sh
cp .claude/settings.json ~/.claude/settings.json
これで GitHub Actions 上で動く Claude も、ローカルと同じ9つの安全装置で守られます。
Anthropic 公式の Hooks ドキュメントは、PreToolUse の permissionDecision に deny を設定することで「Claude のツール実行を物理的にブロックできる」設計を明示しています。
これは「気を付ける」「ドキュメント化する」では得られない、確実な安全装置です。Anthropic 自身、社内の Security Engineering チームが Claude Code を「設計ドキュメント → コード → リファクタ → 諦めてテスト未書き」という従来フローから、「擬似コード → TDD → 定期チェックイン」という安全なフローに切り替えた事例を「How Anthropic teams use Claude Code」レポートで紹介しています。
Hooks はこのような「安全装置の自動化」を実現する基盤であり、コミュニティでも claude-code-hooks-mastery や claude-code-hooks-multi-agent-observability といった事故防止特化のリポジトリが公開されています。
出典: Hooks reference - Claude Code Docs / How Anthropic teams use Claude Code (Security Engineering section) / claude-code-hooks-mastery
運用上の注意
1. Hook が誤検知したときの抜け道
Hook が間違って正当な操作をブロックすることがあります。その場合は 一時的に Hook を無効化 する必要があります。
# 一時的に無効化
mv ~/.claude/settings.json ~/.claude/settings.json.disabled
# 作業終了後
mv ~/.claude/settings.json.disabled ~/.claude/settings.json
ただし、無効化中の事故は責任を負えないので、最小限の時間だけにしてください。
2. パフォーマンスへの影響
Hook の実行は1〜2秒程度の遅延を発生させます。9つすべて入れると体感で3〜5秒の遅延。これは事故防止のコストとして許容範囲です。
3. 環境変数への依存
Hooks は $CLAUDE_TOOL_INPUT や $CLAUDE_FILE_PATH を参照します。これらの環境変数名は Claude Code のバージョンで変わる可能性があるので、リリースノートを確認してください。
で、どう稼ぐ? — 安全装置がビジネスに直結する理由
Hooks の経済価値は 「事故損失の回避 = 純粋な利益」 です。
1. 1回の本番事故で月収以上を失う
本番 DB の事故1回で復旧に1〜2日、信用回復まで数ヶ月。受託案件なら契約解除のリスクもあります。事故1回の損失は月収以上になることが普通です。
2. クライアントへの安心材料
「Claude Code を使って開発しています、ただし9つの安全装置で本番事故を防いでいます」と言えれば、クライアントは安心します。AI 活用に懐疑的なクライアントを説得する材料になります。
3. SaaS 運営の信頼性
自社 SaaS の運営でも、本番事故ゼロは信頼に直結します。一度の事故でユーザーが大量離脱することがあります。これを防ぐのが Hooks です。
まとめ
Hooks による本番事故防止の重要ポイントは次のとおり。
- 9つの安全装置を多層防御で組む:bash チェック、ファイル編集チェック、編集後スキャン
- CI/CD にも同じ Hooks を組み込む:ローカルと本番で同じ守りを実現
- 誤検知時の無効化手順 を予め用意しておく
最後のエピソード Ep.12 は 有料記事 です。ここまでの全技術を統合した「自走するClaude 自動化」の完成形を解説します。シリーズの最終話、最も重要な内容です。
【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード
▸▾ // see all 13 episodes
- №01【第1回】Claude Code Skills 入門 — 自作スキルで開発効率を2倍にする実装ガイド
- №02Claude Code から自作 MCP サーバーを呼び出す — TypeScript で書く最小実装と詰まりポイント
- №03【第3回】Claude Code サブエージェント設計パターン — 並列タスクで時給を上げる実践ガイド
- №04【第4回】Claude Code Hooks 完全ガイド — 保存時自動整形・コミット前チェックの実装
- №05【第5回】Claude Code リモートサーバー運用術 — VPS 常駐型 Claude 自動化環境の構築
- №06【第6回】Claude Code で SaaS を 1 週間で組む開発フロー — Skill × MCP の統合設計
- №07【第7回】Claude Code トークン節約運用 — Pro プランの範囲で並列エージェントを回す 9 つの工夫
- №08【第8回】Claude Code で GitHub Issue から PR まで自動化する実装ガイド
- №09【第9回】Claude Code サブエージェント並列実行 — 本番で使った5パターン
- №10【第10回】Claude Code × Supabase で管理画面を30分で生成する Skill 実装ガイド
- №11【第11回】Claude Code Hooks で事故を防ぐ — git secrets / 本番DB保護の実装
- №12【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード¥1,000
- №13Claude Code で 0→MVP を1日で作る全記録 — recipe-ai Build in Public
Next Step
次に読むならこの導線です
【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード
Claude Codeラボ全12話の集大成。Skills/MCP/サブエージェント/Hooks/リモート運用を統合した「自走する Claude 自動化」を、月 ¥5K の実コストで動かす全構成を公開。寝てる間に競合調査・記事下書き・PR まで自動化する 6 層アーキテクチャの完成版。
Claude Code hookをauto-recapより先に試すべき3パターン — commit漏れ・文脈消失・危険操作を自動検知した実録
auto-recapを入れる前に試すべきClaude Code hookが3つあった。Stop hookでuntracked 84件を発覚させ、PreCompactで会話ログを自動退避し、UserPromptSubmitで危険操作前にgit情報を自動注入した実装記録。
Claude Code の Hooks は settings.json 保存後すぐ動く — 「次セッションから」は間違いだった
UserPromptSubmit hook を settings.json に追加した同セッション内で即発火を確認した。再起動・再セッション不要という発見と、settings.json hot reload の仕組みを実測ログから解説する。
Claude Codeを音声入力で操作したい! — macOS 音声入力 4 択 × 実用セットアップ 2026
Claude Code で対話量が多くタイピングがボトルネックになる本業エンジニア向けに、macOS 標準 / Wispr Flow / Superwhisper / VoiceInk の 4 つを比較。コードと自然言語で入力手段を分ける実用的な運用フローを解説します。
次の実験記録も追う
Claude Code × 個人開発の実験ログ、失敗、判断変更をまとめて追いたい人向けに、月次でLab Freeを届けます。
masatoman のメルマガ — 毎週月曜の朝に 1 通
masatoman.net で今週公開した記事の中から 1 本を、読者目線で深掘りした手紙が届きます。「自分も同じことやってる」「ここで詰まってた」が見つかる予告編。
この記事が役に立ったらシェア