Claude Code 安全運用 研修 / モジュール 1(公開版)

モジュール 1: 取り返しのつかない操作を止める

削除とデータ破壊を、実行の手前で機械的に止める。実際の事故と、手を動かす演習で学びます。

このモジュールの到達目標。 再帰的な削除、本番データベースの破壊、履歴の改変を、実行の手前で止める hook を、自分で設定し、危険なコマンドが実際に止まることを実機で確認できる。

これは研修の公開のモジュールです。そのまま読んで手を動かせます。残りのモジュール(機密の保護、費用の管理、サブエージェントの制御、組織の baseline、事故対応)の構成はカリキュラムをご覧ください。

1. なぜ AI エージェントは破壊的な操作を実行するのか

Claude Code のようなエージェントは、人の確認を待たずにコマンドを実行できます。「危険な操作はしないで」と CLAUDE.md に書いても、その指示は文章であり、文脈の圧で素通りされることがあります。実際に、CLAUDE.md の指示を素通りして機密が漏れた事故が報告されています(#2142)。

だから、取り返しのつかない操作は、人の注意力や文章の指示ではなく、実行の手前で機械的に止める層(hook)で守ります。hook は、コマンドが実行される直前にその中身を検査し、危険なら終了コード 2 で止めます。これは自動承認(auto)モードでも効きます。

2. 実際の事故を読む

抽象論ではなく、番号で辿れる実際の事故で学びます。各事故について「何が起きたか」「なぜ起きたか」「何が止めたはずか」を見ます。

本番データベースの約60テーブルが消えた(#27063

何が起きたか
強制的なマイグレーション(drizzle push --force 系)で、本番のスキーマの約60のテーブルが消失。
なぜ起きたか
破壊的なマイグレーションのコマンドを止める層がなく、バックアップも無かったため、戻せませんでした。
何が止めたはずか
データ消失を伴うマイグレーションを実行の手前で止める hook(prisma-migrate-guard など)。

データ消失を伴う db push#14411

何が起きたか
prisma db push --accept-data-loss が実行され、データが失われた。
何が止めたはずか
--accept-data-loss を含むマイグレーションを遮断する hook。

auto モードのワイルドカードの削除(#64559

何が起きたか
自動承認のモードで、ワイルドカードの削除が対象外のファイルを巻き添えにした。
何が止めたはずか
再帰的な削除と、ホームや絶対パスへのワイルドカードの削除を止める hook(rm-safety-net)。hook は自動承認とは別の層で効きます。

下層の .env の削除(#65034

何が起きたか
コードベースの中の .env が削除された。秘密と設定の喪失。
何が止めたはずか
下層のパス(backend/.env など)を含めて .env の削除を止める hook(rm-safety-net)。

3. 演習: 止める層を入れる

実際に hook を入れて、危険なコマンドが止まることを確認します。所要およそ10分。

手順 1. hook の一式を入れる

cc-safe-setup(無料・MIT)が、削除・データ破壊・機密の防御の hook を1コマンドで入れます。

npx cc-safe-setup

これで rm-safety-net / prisma-migrate-guard / git-history-rewrite-guard を含む hook が ~/.claude/settings.json に登録されます。仕組みを理解するために、登録の形だけ示します(PreToolUse の Bash の hook)。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "~/.claude/hooks/rm-safety-net.sh" }
        ]
      }
    ]
  }
}

手順 2. 止まることを実機で確認する

hook は、コマンドを JSON で受け取り、危険なら終了コード 2 を返します。次のように、危険なコマンドが実際に止まることを確かめます(実際には消さずに、hook の判定だけを見ます)。

# 再帰的な削除が止まる(終了コード 2 = 遮断)
echo '{"tool_input":{"command":"rm -rf /home/me/project"}}' \
  | ~/.claude/hooks/rm-safety-net.sh ; echo "exit=$?"

# 下層の .env の削除も止まる(#65034 の対策)
echo '{"tool_input":{"command":"rm backend/.env"}}' \
  | ~/.claude/hooks/rm-safety-net.sh ; echo "exit=$?"

# データ消失を伴うマイグレーションが止まる
echo '{"tool_input":{"command":"prisma db push --accept-data-loss"}}' \
  | ~/.claude/hooks/prisma-migrate-guard.sh ; echo "exit=$?"

いずれも BLOCKED: ... の表示とともに exit=2 になれば、止める層が効いています。

手順 3. 通常の作業が妨げられないことを確認する

防御は、普段の作業を止めてはいけません。安全な対象は通過します。

# 安全な削除は通過(終了コード 0)
echo '{"tool_input":{"command":"rm -rf node_modules"}}' \
  | ~/.claude/hooks/rm-safety-net.sh ; echo "exit=$?"

exit=0 になれば、通常の削除は妨げられていません。

確認(このモジュールの修了の判定)。 次のすべてに「はい」と答えられれば修了です。

4. 自社への適用

次のモジュールと、研修の全体

このモジュールは「止める層」の入口です。研修の全体(約12時間・7モジュール)では、機密と認証情報の保護、費用と利用枠の管理、サブエージェントと auto モードの制御、組織の baseline と CI のゲート、事故対応と復旧までを、同じように手を動かして学びます。

研修のカリキュラム全体を見る 法人での実施・費用の相談

本モジュールは公開版です。引用した事故はすべて番号で辿れる実際の報告で、演習で使う hook はすべて cc-safe-setup(無料・MIT)に実在します。個人での利用は無料のままです。