1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeの安全スコア7/19をさらに下げる実践ガイド

1
Last updated at Posted at 2026-02-15

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つのフックの中身

--fixclaude-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は:

  1. 自分で判断する
  2. 不確実なことは~/pending_for_human.mdにログする
  3. 次のタスクに移る

一時的に質問を許可したいときは環境変数で切り替えられます。

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ポイントをカバーするには、プロジェクト固有の運用設計が必要です。ここが「無料フックで十分な人」と「さらに踏み込みたい人」の分岐点になります。

参考リンク


19項目すべてをカバーするフック群(Git自動バックアップ、セッション保存、外部アクション承認、エラートラッキング等)は、CC-Codex Ops Kitにまとめています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?