
Claude初心者がAutoModeでも安心できるセキュリティ設定をしてみた話
はじめに
Claude Codeで開発していると、コマンドを実行するたびに確認プロンプトが表示され、作業が中断してしまいがちです。この確認を減らし、開発効率を上げるのに便利なのが自動モード(auto mode)です。
自動モードには危険な操作を止めるセーフティ機能も備わっていますが、Claude Codeを使い始めたばかりの私としては「本当に危険な操作を確実に防いでくれるのか?」という不安がありました。「効率化はしたいけれど、破壊的な操作は絶対に防ぎたい」――そう考え、Claude Codeにどのようなセキュリティ機能が備わっているのかを調べてみました。
この記事では、自動モードの仕組みを整理したうえで、Claude Codeのセキュリティ機能(hooks・permissions・サンドボックス)を組み合わせた多層防御の設定内容をご紹介します。
自動モードでできること
自動モードとは、確認プロンプトを都度出す代わりに、別の分類器(Classifier)モデルが実行前の各操作をチェックする権限モードです。
ユーザーの指示範囲を逸脱した操作や、想定外のインフラに対する変更、プロンプトインジェクション(ファイルやWebページに仕込まれた不正な指示)と疑われる挙動などを検知してストップしてくれます。CLIでは Shift+Tab を押すことでモードを切り替えられます(※利用可能なプランやモデルなどの条件は公式ドキュメントをご参照ください)。
初期設定における判定例は以下のとおりです。
| 初期設定で止める例 | 初期設定で許可する例 |
|---|---|
curl | bash など、ダウンロードしてそのまま実行する操作 |
作業ディレクトリ内のファイル操作 |
| force-push(強制プッシュ) | ロックファイル等に記載された依存関係のインストール |
git reset --hard や git clean -fd など、未コミットの変更を破棄する操作 |
.env を読み取り、対応するAPIに認証情報を送信する操作 |
本番環境へのデプロイや cdk destroy などのリソース破壊 |
読み取り専用のHTTPリクエスト |
| 機密データの外部送信 | 作業ブランチへの通常のプッシュ |
どこまで防いでくれるのか
非常に便利な自動モードですが、公式ドキュメントには「権限プロンプトを減らすためのものであり、安全性を保証するものではない」と明記されています。
- AIによる判定の限界:判定を行うのはAI分類器であるため、誤検知や見逃しが起こる可能性があります。
- 指示の消失リスク:会話の中で「プッシュしないで」と伝えていても、コンテキストが圧縮(要約)されると指示が抜け落ちることがあります(※確実に防ぎたい場合はdenyルールの使用が推奨されています)。
- デフォルト許可の存在:
.envの読み取りなど、初期設定のままだと許可されてしまう操作もあります。
つまり、自動モードはあくまで「判断をAIに委ねる層」に過ぎません。絶対に実行されては困る操作は、ルールを明文化して決定論的(確実)にブロックする必要があります。そのための仕組みが、次に紹介する hooks・permissions・サンドボックス です。
参考:権限モードを選択する - Claude Code Docs
Claude Codeのセキュリティ機能
| 仕組み | 役割 |
|---|---|
| hooks | コマンド実行直前などに独自のスクリプトを割り込ませ、内容を解析して判定します。今回は危険なコマンドを deny で遮断し、それ以外は素通りさせる構成にしています。 |
| permissions | 操作を allow(自動実行)・ask(毎回確認)・deny(禁止)の3つに振り分ける許可リストです。deny → ask → allow の優先順位で評価されます。 |
| サンドボックス | Claudeが実行するコマンドやプロセス自体を隔離し、アクセス可能なファイルやネットワーク通信をOSレベルで制限します。隔離レベルに応じていくつかの種類が存在します(後述)。 |
サンドボックスの種類と選び方
公式ドキュメントにおいて、サンドボックスはClaude Codeの実行環境を分離するアプローチの総称として扱われており、分離範囲に応じて複数の選択肢が用意されています。
| アプローチ | 分離する範囲 | Docker | 導入の手間 |
|---|---|---|---|
Bashサンドボックス(/sandbox) |
Bashコマンドとその子プロセス | 不要 | 最小〜低 |
| サンドボックスランタイム | Claude Codeのプロセス全体(Read/Edit等のツール・MCP・hooksを含む) | 不要 | 低 |
| DevContainer/カスタムコンテナ | 開発環境全体 | 必要 | 中〜高 |
| 仮想マシン | OS全体 | 不要 | 高 |
| Web上のClaude Code | OS全体(Anthropicがホスト) | 不要 | なし |
下に行くほど保護できる範囲は広がりますが、そのぶん準備や運用の手間も大きくなります。
参考:サンドボックス環境を選択する - Claude Code Docs
今回「Bashサンドボックス」を選んだ理由
- ローカル環境で画面を見ながら作業するスタイルだから
ドキュメントでも、日常の開発で確認プロンプトを減らしたい場合の第一候補としてBashサンドボックスが挙げられています。確認を一切スキップする--dangerously-skip-permissionsを使う場合はコンテナ等での厳格な隔離が推奨されますが、自動モードにおけるサンドボックスは「追加の防御層」という位置付けです。そのため、今回は環境丸ごとの隔離までは不要と判断しました。 - 導入コストが低く、Dockerも不要
macOSであれば追加のソフトウェアなしで利用でき、settings.jsonに数行設定を追加するだけで有効化できます。まずは仕組みを理解し、試してみたい段階に最適です。 - 管理設定でチームに強制できる
上記の選択肢のうち、Claude Code自身の設定(managed settings)としてチーム全体に強制できるのはBashサンドボックスのみです。DevContainerもリポジトリ単位で環境を統一できますが、ローカルでコンテナ外の実行を防ぐことまではできません。
割り切ったポイント
Bashサンドボックスが保護するのはBashコマンドのみです。Claudeの組み込みツール(Read・Edit・WebFetchなど)はpermissionsのルールで制御され、MCPサーバーやhooksスクリプトはホストOS上で直接動作します。
「Bashサンドボックスでカバーできない穴は、permissionsとhooksを組み合わせて塞ぐ」というのが今回の設計方針です。将来さらに広範な安全性を求めたくなった場合は、DevContainerやサンドボックスランタイムの内側でBashサンドボックスを併用する多重化も可能です。
3つの役割分担
採用した「Bashサンドボックス」「permissions」「hooks」の役割分担を整理すると、以下のようになります。
(◎=主な役割、○=対応、△=技術的には可能(自作スクリプト等が必要)、✕=対象外)
| 項目 | Bashサンドボックス | permissions | hooks |
|---|---|---|---|
| ファイルアクセス制限 | ○(Bashのみ) | ○(組み込みツール) | △ |
| 通信先の制限 | ○(Bashのみ) | ○(組み込みツール) | △ |
| 実行可否の判定 | △(間接的) | ◎ | ○ |
| コマンド内容の解析 | ✕ | ✕ | ◎ |
| チーム共有・強制 | ○ | ○ | ○ |
| 対応OS | macOS・Linux・WSL2 | 全OS | 全OS |
| 導入・保守コスト | 低 | 低 | 中〜高 |
3つは防ぐ対象も動くタイミングも違うため、どれか1つではなく組み合わせて使うことが大切です。なお、Bashサンドボックスは初期状態では無効のため、/sandbox コマンドか sandbox.enabled 設定で有効化が必要です。
実行される順番
以下は公式ドキュメントに掲載されている、Claude Codeの実行ライフサイクルです。コマンド実行に関連するステップ(PreToolUse → PermissionRequest → [tool executes])に、今回導入した3つの機能がそれぞれ対応しています。

出典:Hooks reference - Claude Code Docs
- PreToolUse
hooksで設定したスクリプトが最初に評価されます。仕様上はallow/deny/askの判定を返せますが、今回のスクリプトでは「危険なコマンドを検知したらdenyで遮断、それ以外は素通りさせる」というシンプルな実装にしています。ここでdenyされた場合、コマンドの実行はその場で即時中断され、以降のステップには進みません。 - PermissionRequest
PreToolUseを通過したコマンドに対し、permissions(deny→ask→allowの優先順)が評価されます。git commitやgit pushなどaskに指定したコマンドは、ここで確認プロンプトが表示されます。なお、仮にhooks側がallowを返していても、permissions側でaskに該当していれば確認プロンプトが出ます(hooksのallowはpermissionsのask/denyを上書きしません)。 - [tool executes]
実際にコマンドが実行されるフェーズです。Bashコマンドの場合、ここでOSレベルのBashサンドボックスが機能します。.envの読み取りや未許可ディレクトリへの書き込みなどは、仮にhooksやpermissionsをすり抜けたとしても、この段階でOSレベルでブロックされます(※ReadやEditなどの組み込みツールはサンドボックス対象外のため、permissions側で保護します)。
つまり、「hooksとpermissionsは実行前に論理的に止めるフィルター」「Bashサンドボックスは実行時の物理的なアクセスを制限する最後の砦」という順序で多層防御を構成しています。
なお自動モードを利用している場合は、ステップ2(PermissionRequest)で確認プロンプトを出す代わりにAI分類器が判定を行います(ただし、明示的に ask ルールに設定した操作は自動モードでもプロンプトが出ます)。
参考:
設定ファイル
実際に ~/.claude/settings.json(グローバル設定)に記述した内容の抜粋です。
{
"permissions": {
"allow": [
"Bash(gh *)",
"Bash(git fetch *)",
"Bash(git pull *)"
],
"ask": [
"Bash(git commit *)",
"Bash(git push *)"
]
},
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": [
"**/.env", "**/.env.*",
"~/dev/**/.env", "~/dev/**/.env.*"
// ほかにも秘密鍵・AWS認証情報などを同様のパターンで追加(省略)
],
"allowRead": ["**/.env*.example", "~/dev/**/.env*.example"]
}
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "python3 ~/.claude/hooks/block-destructive-bash.py" }
]
}
]
}
}
permissions.allow:gh・git fetch・git pullなど、環境を破壊するリスクが極めて低いコマンドは確認なしで自動実行させます。permissions.ask:git commit・git pushなど、実行前に内容をレビューしたいコマンドは毎回確認プロンプトを出します。sandbox.filesystem:.envや秘密鍵などの機密ファイルへのアクセスを拒否します。hooks.PreToolUse:Bash実行直前にスクリプトを実行し、破壊的コマンドを検知します。askによる目視確認だけでは見落とすリスクのある、本当に危険な操作を一律で弾きます。
hooksがブロックするコマンド一覧
フック用のPythonスクリプトで検知・ブロックしている主なコマンドは以下のとおりです。
| コマンド | ブロックする理由 |
|---|---|
git reset --hard |
未コミットの変更をすべて破棄してしまうため |
git clean -f(強制削除オプション) |
未追跡ファイルを完全に削除してしまうため |
git checkout . / git restore . |
ワークツリー全体の変更を破棄してしまうため |
git branch -D(強制削除) |
未マージのコミットを失う可能性があるため |
git push --force / --force-with-lease / -f |
対象ブランチを問わず、リモートの履歴を上書きしてしまうため |
--no-verify / --no-gpg-sign / git -c commit.gpgsign=false |
pre-commitフックや署名検証を意図せずスキップしてしまうため |
広範囲またはパス未指定の rm -rf(/、~、ホーム直下のワイルドカードなど) |
想定外の範囲のファイルを一括削除してしまうため |
gh repo delete |
GitHubリポジトリ自体を削除してしまうため |
gh secret delete / gh variable delete |
CI/CDに必要なシークレットや変数を削除してしまうため |
gh release delete / gh gist delete / gh ssh-key delete 等の削除系 |
取り消しが困難なリソース削除操作のため |
gh api -X DELETE / --method DELETE |
専用コマンドを通さず、API経由で直接リソースを削除できてしまうため |
なお、このスクリプトはクォートで文字列を分断する、エイリアスを経由する、オプションの順序を入れ替える、sudo や eval、bash -c / sh -c などのサブシェルでラップするといった、典型的な検知回避パターンにも対応できるように組まれています。
設定手順
~/.claude/settings.jsonを開き、安全なコマンドをpermissions.allowに、確認したいコマンドをpermissions.askに追加します。- 同ファイルの
sandbox.filesystemにdenyRead(読み取り拒否パターン)とallowRead(例外許可パターン)を設定します。開発ディレクトリ配下の全プロジェクトに適用したい場合は、**/.envだけでなく~/dev/**/.envのように起点パスを明示すると確実です。 ~/.claude/hooks/ディレクトリを作成し、破壊的コマンドを検知するPythonスクリプトを配置してchmod +xで実行権限を付与します。settings.jsonのhooks.PreToolUseに、作成したスクリプトを呼び出す設定を追加します。- 新しいClaude Codeセッションを立ち上げ、設定を反映させます。
- 使い捨ての検証用リポジトリを用意し、危険なコマンドや機密ファイルの読み取りが意図通りブロックされるかテストします(※設定しただけで安心せず、必ず実機で動作確認しましょう)。
実装によって実現できたこと
- 3段階の役割分担の確立
「安全なコマンドは自動実行」「要確認コマンドは都度チェック」「破壊的な操作は強制遮断」という明確なポリシーを、permissions.allow・permissions.ask・hooksの3つに綺麗にマッピングできました。 permissions.denyをすり抜ける高度な危険操作のブロック
permissions.denyは単純な文字列パターン一致で判定されるため、オプションの順序変更やbash -cでのラップ等ですり抜けてしまう弱点があります。スクリプトを用いた構文解析を挟むことで、表記揺れや回避手口にも耐えうるガードレールを構築できました。- プロジェクト横断での機密情報アクセスの遮断
Bashサンドボックスを活用することで、cat .envのようなコマンドによる機密情報の漏洩を、開発ディレクトリ配下の全プロジェクトに対して一括で制限できるようになりました。 - 多層防御による安全性の担保
自動モードのAI分類器だけに依存するのではなく、決定論的な静的ルールとサンドボックスを組み合わせることで、「効率化」と「安全性」を両立させることができました。
残る限界・スコープ外としたこと
- 動的なシェル変数展開やコマンド置換の検知
例えばCMD="reset --hard"; git $CMDのような記述は、静的解析の段階では検知できません。これはシェルスクリプトの仕様上、原理的な限界といえます。 - gitやrm以外の削除コマンド
find -deleteや Pythonのshutil.rmtreeなど、ファイルを削除する手段は無数に存在します。これらをスクリプトですべて網羅するのは現実的ではないため、今回は意図的にスコープ外としています。
おわりに
手作業(オーガニック)でコードを書いていた時代は「自分が打つコマンドは自分が責任を持つ」で済みましたが、AIエージェントに自律的なコマンド実行を任せる現在においては、「何をAIに任せ、どこで人間が介入し、何をシステムとして遮断するか」をあらかじめ設計しておくことが欠かせません。
Claude Codeの確認プロンプトの多さに悩んでいる方や、自動モードを導入したいけれど安全性が心配という方の参考になれば幸いです。






