メインコンテンツへスキップ
← 記事一覧に戻る
·運営·12 min read

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

Claude CodeHooksセキュリティ個人開発
【第11回】Claude Code Hooks で事故を防ぐ — git secrets / 本番DB保護の実装

「Claude が暴走したらどうしよう」——これは Claude Code を本格運用する誰もが考える不安です。

筆者はこの不安を Hooks で解消しました。9つの安全装置を組み合わせた多層防御を構築し、本番事故をゼロにしています。この記事では、その9つの Hooks をすべて実コード付きで公開します。

前半は無料パートで「事故が起きる典型パターン」、後半(有料パート)で具体的な Hook の実装を全公開します。

結論:本番事故は「9つの安全装置」で完全に防げる

Claude Code を本格運用していて起きる事故は、ほぼすべて次の9パターンに集約されます。

  1. 本番 DB の TRUNCATE / DELETE
  2. API キーのコミット
  3. .env のリポジトリへの混入
  4. production ブランチへの直接 push
  5. rm -rf で大量ファイル削除
  6. 依存パッケージの不正な追加
  7. CI/CD 設定の無断変更
  8. GitHub Token の漏洩
  9. 本番 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 の permissionDecisiondeny を設定することで「Claude のツール実行を物理的にブロックできる」設計を明示しています。 これは「気を付ける」「ドキュメント化する」では得られない、確実な安全装置です。Anthropic 自身、社内の Security Engineering チームが Claude Code を「設計ドキュメント → コード → リファクタ → 諦めてテスト未書き」という従来フローから、「擬似コード → TDD → 定期チェックイン」という安全なフローに切り替えた事例を「How Anthropic teams use Claude Code」レポートで紹介しています。 Hooks はこのような「安全装置の自動化」を実現する基盤であり、コミュニティでも claude-code-hooks-masteryclaude-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 自動化」の完成形を解説します。シリーズの最終話、最も重要な内容です。

// continue the lab
12
// next episode

【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード

// see all 13 episodes
  1. 01【第1回】Claude Code Skills 入門 — 自作スキルで開発効率を2倍にする実装ガイド
  2. 02Claude Code から自作 MCP サーバーを呼び出す — TypeScript で書く最小実装と詰まりポイント
  3. 03【第3回】Claude Code サブエージェント設計パターン — 並列タスクで時給を上げる実践ガイド
  4. 04【第4回】Claude Code Hooks 完全ガイド — 保存時自動整形・コミット前チェックの実装
  5. 05【第5回】Claude Code リモートサーバー運用術 — VPS 常駐型 Claude 自動化環境の構築
  6. 06【第6回】Claude Code で SaaS を 1 週間で組む開発フロー — Skill × MCP の統合設計
  7. 07【第7回】Claude Code トークン節約運用 — Pro プランの範囲で並列エージェントを回す 9 つの工夫
  8. 08【第8回】Claude Code で GitHub Issue から PR まで自動化する実装ガイド
  9. 09【第9回】Claude Code サブエージェント並列実行 — 本番で使った5パターン
  10. 10【第10回】Claude Code × Supabase で管理画面を30分で生成する Skill 実装ガイド
  11. 11【第11回】Claude Code Hooks で事故を防ぐ — git secrets / 本番DB保護の実装
  12. 12【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード¥1,000
  13. 13Claude Code で 0→MVP を1日で作る全記録 — recipe-ai Build in Public

Next Step

次に読むならこの導線です

すべての記事を見る
有料で次へ進む¥1,000

【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード

Claude Codeラボ全12話の集大成。Skills/MCP/サブエージェント/Hooks/リモート運用を統合した「自走する Claude 自動化」を、月 ¥5K の実コストで動かす全構成を公開。寝てる間に競合調査・記事下書き・PR まで自動化する 6 層アーキテクチャの完成版。

次の実験記録も追う

Claude Code × 個人開発の実験ログ、失敗、判断変更をまとめて追いたい人向けに、月次でLab Freeを届けます。

masatoman のメルマガ — 毎週月曜の朝に 1 通

masatoman.net で今週公開した記事の中から 1 本を、読者目線で深掘りした手紙が届きます。「自分も同じことやってる」「ここで詰まってた」が見つかる予告編。

この記事が役に立ったらシェア