title: "Claude Codeの安全スコア7/19をさらに下げる実践ガイド"
tags: ClaudeCode AI セキュリティ LLM 自律運用
private: false
はじめに
前回の記事では、curl1行で自分のClaude Code環境の安全スコアを測定し、--fixで4つの無料フックを導入して16/19 CRITICAL → 7/19 HIGHまで改善しました。
今回は「7/19をさらに下げるには?」がテーマです。
-
--fixで入った4つのフックの中身 - やりがちな落とし穴3つ
- 残り7ポイントの正体と対処法
手順が主役なので、サクッといきます。
--fixで入った4つのフックの中身
--fixはclaude-code-ops-starterから4つのシェルスクリプトを~/.claude/hooks/にコピーします。それぞれ何をしているか見てみましょう。
1. decision-warn.sh(破壊コマンド警告)
トリガー: PreToolUse(Bash)
Bashコマンドが実行される直前に、危険なパターンがないかチェックします。
# チェック対象のパターン
RISKY_PATTERNS=(
"rm -rf"
"git reset --hard"
"git clean -fd"
"git push --force"
"git push -f"
"drop table"
"DROP TABLE"
"truncate"
"TRUNCATE"
)
マッチしたら警告メッセージを出力します。デフォルトでは警告のみ(exit 0)で、実行自体はブロックしません。 ハードブロックにしたい場合はスクリプト内のexit 1をアンコメントします。
# exit 1 # ← この行をアンコメントすると実行自体をブロック
2. syntax-check.sh(自動構文チェック)
トリガー: PostToolUse(Edit, Write)
ファイルを編集・作成した直後に、拡張子に応じた構文チェックを自動実行します。
| 拡張子 | チェック方法 |
|---|---|
.py |
python -m py_compile |
.sh, .bash
|
bash -n |
.json |
jq empty |
構文エラーがあればSYNTAX ERROR: <ファイルパス>と表示されます。ブロックはしません(exit 0)が、エラーが出力に表示されるのでAIが即座に修正に動けます。
注意: jqが入っていないとフック入力のパースができず、サイレントスキップになります(エラーにはなりません)。
3. context-monitor.sh(コンテキスト残量監視)
トリガー: PostToolUse(全ツール)
ツール呼び出し回数を/tmp/cc-context-monitor-countでカウントし、3段階で警告します。
| 閾値 | レベル | 動作 |
|---|---|---|
| 80回 | SOFT | 「大きなタスクは後回しに」と通知 |
| 120回 | HARD | 「タスクを締めてハンドオフ準備を」と通知 |
| 150回 | CRITICAL | チェックポイントファイルを自動生成 |
オーバーヘッド削減のため、通常は5回に1回だけチェックします(CRITICALレベルでは10回に1回リマインド)。
4. no-ask-human.sh(自律実行中の質問ブロック)
トリガー: PreToolUse(AskUserQuestion)
AIが「続けますか?」「どちらのアプローチにしますか?」などの質問を投げようとしたとき、exit 1でブロックします。代わりにAIは:
- 自分で判断する
- 不確実なことは
~/pending_for_human.mdにログする - 次のタスクに移る
一時的に質問を許可したいときは環境変数で切り替えられます。
export CC_ALLOW_QUESTIONS=1 # 質問を一時的に許可
よくある落とし穴3つ
落とし穴1: --fixしたのにフックが動かない
原因: フックファイルを~/.claude/hooks/に置くだけでは動きません。settings.jsonにどのタイミングでどのフックを実行するかの登録が必要です。
--fix(=install.sh)はフックファイルのコピーとsettings.json用のJSONの表示までは行いますが、settings.jsonへの書き込みは行いません。
以下を~/.claude/settings.jsonに追加してください。
{
"hooks": {
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [{"type": "command", "command": "~/.claude/hooks/no-ask-human.sh"}]
},
{
"matcher": "Bash",
"hooks": [{"type": "command", "command": "~/.claude/hooks/decision-warn.sh"}]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{"type": "command", "command": "~/.claude/hooks/syntax-check.sh"}]
},
{
"matcher": "",
"hooks": [{"type": "command", "command": "~/.claude/hooks/context-monitor.sh"}]
}
]
}
}
ポイント:
-
PreToolUseはツール実行前、PostToolUseは実行後 -
matcherが空文字("")の場合は全ツールにマッチ -
matcherは|で複数指定可能(例:"Edit|Write")
落とし穴2: context-monitorの閾値が合わない
デフォルトの閾値(80/120/150)は、平均的なセッションの長さを想定しています。しかし:
- 短いタスクを繰り返す場合: 80回で警告が来て煩わしい → 閾値を上げる
- 長時間の自律実行: 150回では手遅れ → HARD警告を早める
context-monitor.shの冒頭3行を直接編集します。
# --- Configurable thresholds ---
SOFT_WARNING=80 # ← 短いタスク中心なら120に
HARD_WARNING=120 # ← 長時間実行なら100に下げる
CRITICAL=150 # ← 最終防衛ライン
また、カウンターは/tmp/cc-context-monitor-countにあるので、新セッションの開始時にリセットしたい場合は:
rm -f /tmp/cc-context-monitor-count /tmp/cc-context-monitor-state
落とし穴3: CLAUDE.mdが空のまま運用
--fixはCLAUDE.mdテンプレートを設置しますが、既にCLAUDE.mdがある場合はスキップします。また、テンプレートのままだと自分のプロジェクトに最適化されていません。
最低限書くべき3項目:
1. 禁止操作の明示
## 禁止操作
- `rm -rf` 禁止
- `git reset --hard` 禁止
- `git push --force` 禁止
decision-warn.shが警告を出しても、CLAUDE.mdで明示的に禁止しておくとAIが「そもそもやらない」方向に動きます。フックは最後の防衛線。CLAUDE.mdは最初の抑止力です。
2. エラー時の行動指針
## エラー対処
- エラーが出たら自分で調査・修正(3回まで)
- 3回失敗したら ~/pending_for_human.md に記録して次のタスクへ
no-ask-human.shが質問をブロックしても、AIの「次にどうするか」が未定義だと迷走します。
3. Git運用ルール
## Git
- 作業の区切りごとにコミット
- 変更前にバックアップブランチを作成
7/19→さらに下げるには
残り7ポイントの内訳と対処法を見てみます。
| チェック項目 | 配点 | 対処法 |
|---|---|---|
| Git自動バックアップ | 2 | 変更前にgit checkout -b backup/...を自動実行するフック |
| セッション状態保存 | 1 | セッション終了時にタスク状態をファイルに書き出すフック |
| 外部アクション承認 | 2 |
git pushやAPI呼び出し前に承認を求めるゲート |
| エラートラッキング | 1 | エラー内容・原因・対処をログに記録するフック |
| settings.json | 1 | 落とし穴1で解説した設定ファイルの作成 |
このうちsettings.json(1ポイント)は今すぐ対処可能です。前章の「落とし穴1」に従って設定するだけで、7/19 → 6/19になります。
残りの6ポイントはそれぞれ専用のフックが必要です。例として「Git自動バックアップ」は、Bashコマンド実行前にgitの変更を検知してバックアップブランチを作成する仕組みです。これは単純なシェルスクリプトでは実装が難しく(どのタイミングでブランチを切るか、頻度の制御など)、運用設計が必要になります。
まとめ
| ステップ | スコア | 難易度 |
|---|---|---|
| 未対策 | 16/19 CRITICAL | — |
--fix 実行 |
7/19 HIGH | curl 1行 |
| settings.json設定 | 6/19 HIGH | JSONコピペ |
| CLAUDE.md最適化 + 閾値調整 | 6/19 HIGH(質的改善) | 10分 |
| 残り6項目のフック追加 | 0〜2/19 LOW〜MODERATE | 要設計 |
無料の4フックとsettings.jsonの設定でCRITICALからHIGHまで来られます。CLAUDE.mdの最適化やcontext-monitorの閾値調整はスコアには直接反映されませんが、実運用の安定性に直結します。
残り6ポイントをカバーするには、プロジェクト固有の運用設計が必要です。ここが「無料フックで十分な人」と「さらに踏み込みたい人」の分岐点になります。
参考リンク
- risk-score.sh(Gist) — 診断ツール本体
- claude-code-ops-starter(GitHub) — 無料フック4つ + セットアップガイド
- Claude Code Hooks 公式ドキュメント — Hooksの仕組み
- 前回の記事: Claude Code環境の安全スコアを測ってみた — Part 1
19項目すべてをカバーするフック群(Git自動バックアップ、セッション保存、外部アクション承認、エラートラッキング等)は、CC-Codex Ops Kitにまとめています。