powered by TechFeed
表示モード
ハウツー

Claude CodeのサンドボックスはSSHキーもAWS認証情報も守らない — 組み込み機能の限界と本当に安全な実行環境の作り方

10月31日、Nirmataが「How to run Claude Code in a sandbox」と題した記事を公開した。AIコーディングエージェント「Claude Code」をサンドボックス環境で安全に実行するための具体的な設定手順を解説した内容で、デフォルト設定のままではSSHキーやAWSクレデンシャルがサンドボックス内から丸見えになるという見落とされがちなリスクを中心に、実践的な対策を示している。

10月31日、Nirmataが「How to run Claude Code in a sandbox」と題した記事を公開した。AIコーディングエージェント「Claude Code」をサンドボックス環境で安全に実行するための具体的な設定手順を解説した内容で、デフォルト設定のままではSSHキーやAWSクレデンシャルがサンドボックス内から丸見えになるという見落とされがちなリスクを中心に、実践的な対策を示している。


Claude Codeはターミナル上で動作するAnthropicのAIコーディングエージェントで、ファイルの読み書きやシェルコマンドの実行を自律的に行う。その性質上、適切な制限なしに実行すると、意図しないファイル変更や外部への通信が発生するリスクがある。AIエージェントが自律的にコードを生成・実行する開発スタイルが広まるにつれ、エージェント自身が悪意あるコード片(プロンプトインジェクションや依存パッケージへの細工など)を介してホスト環境にアクセスするサプライチェーンリスクが、セキュリティコミュニティで注目されている。本記事はそうした背景のもと、バージョンv2.1.307時点のドキュメントをベースに書かれている。

なお、Nirmataはクラウドネイティブ環境向けのポリシー管理・セキュリティ製品を提供する企業で、KubernetesやCI/CDパイプラインのセキュリティに関する技術情報を継続的に発信している。

まず押さえておくべき「サンドボックスの限界」

設定の前に、最も重要な事実を先に述べる。Claude Codeの組み込みサンドボックスは、想定より狭い範囲しかカバーしない。

具体的に保護されないものは以下の4点だ。

  • ファイル・Web操作ツール(Read、Edit、Write、WebFetch、WebSearch)はパーミッションルールに従うが、サンドボックスの管轄外
  • MCPサーバー、コマンドフック、LSPサーバーなどのヘルパープロセスはフルアクセスで動作
  • excludedCommandsに登録したコマンドはサンドボックスなしで実行される
  • サンドボックス内でコマンドが失敗した場合、Claudeはサンドボックスなしでの再実行を提案できる(allowUnsandboxedCommands設定で制御)

組み込みサンドボックスはあくまで「Bash、PowerShell、Monitorコマンドとその子プロセス」に限定したOSレベルの隔離だ。セッション全体を保護したい場合は、後述のdevコンテナやVMが必要になる。

組み込みサンドボックスの有効化

macOSでは追加パッケージ不要だが、LinuxおよびWSL2ではbubblewrapとsocatのインストールが必要だ。

sudo apt-get install bubblewrap socat

インストール後、プロジェクトフォルダでClaude Codeを起動し、/sandboxコマンドを実行する。Ubuntu 24.04では、AppArmorのデフォルトポリシーがbubblewrapのユーザー名前空間をブロックする場合があるため、事前に以下を確認する。値が1の場合はAppArmorプロファイルの追加設定が必要だ。

sysctl kernel.apparmor_restrict_unprivileged_userns

ファイルシステムとネットワークの制限設定

サンドボックスが有効な状態では、コマンドはデフォルトでワーキングディレクトリとユーザーごとの一時ディレクトリにのみ書き込める。ネットワークアクセスはローカルプロキシ経由となり、network.allowedDomainsに登録されたホストのみ通信できる(初期値は空)。

以下は書き込み先と通信先を最小限に追加する設定例だ。

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "allowWrite": ["~/.kube", "/tmp/build"]
    },
    "network": {
      "allowedDomains": ["github.com", "*.npmjs.org"]
    }
  }
}

注意点:allowedDomainsはWebFetchツールには効かない。WebFetchはパーミッションルール側で制御する必要がある。

クレデンシャルファイルを保護する場合はcredentialsブロックを使う。

{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "files": [
        { "path": "~/.aws/credentials", "mode": "deny" },
        { "path": "~/.ssh", "mode": "deny" }
      ],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "deny" },
        { "name": "NPM_TOKEN", "mode": "deny" }
      ]
    }
  }
}

デフォルトでは~/.sshや~/.aws/credentialsはサンドボックス内からでも読めるため、この設定は明示的に行う必要がある。なおfilesystemのdenyReadエントリはReadツールを止められないため、Readツール側にも別途denyルールを追加する必要がある。

設定ファイルの適用優先順位は以下の通り。高い順に:マネージド設定 → コマンドライン → ローカル(.claude/settings.local.json) → プロジェクト(.claude/settings.json) → ユーザー(~/.claude/settings.json)。

チーム全体に強制適用する

個々の開発者がサンドボックスを無効化できないよう、マネージド設定(Linuxでは/etc/claude-code/managed-settings.json)で以下を配布する。

{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false
  }
}

failIfUnavailable: trueを設定すると、起動時にサンドボックスが開始できなければClaude Codeは終了し、セッション中に失敗した場合も該当コマンドが拒否される。

ただし、filesystem.allowWriteやnetwork.allowedDomainsのようなリスト型の設定はスコープをまたいでマージされるため、開発者がエントリを追加できてしまう。ネットワークドメインをマネージド設定のみに固定したい場合はnetwork.allowManagedDomainsOnly: trueを合わせて設定する。

セッション全体を保護するdevコンテナ

--dangerously-skip-permissionsオプションを使った無人実行など、セッション全体に境界が必要な場合はdevコンテナを使う。ファイルツール、MCPサーバー、フックがすべてコンテナ内に収まるためだ。

.devcontainer/devcontainer.jsonに以下を追加してVS CodeからDev Containers: Rebuild Containerを実行する。

{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  }
}

リビルドのたびにサインインが必要になるのを防ぐには、ボリュームマウントで~/.claudeを永続化する。

"mounts": [
  "source=claude-code-config,target=/home/node/.claude,type=volume"
],
"containerEnv": {
  "CLAUDE_CONFIG_DIR": "/home/node/.claude"
}

devコンテナにも限界はある。バインドマウントしたワークスペース内のファイルはホスト側にそのまま反映されるため、悪意あるプロジェクトがコンテナ内で読めるクレデンシャルを外部送信する可能性は残る。~/.sshやクラウドのクレデンシャルファイルはコンテナにマウントしないこと。

アプローチの比較

アプローチ 隔離範囲 Docker不要 セットアップ
組み込みサンドボックス Bash系コマンドと子プロセス ✓ 最小〜低
サンドボックスランタイム(ベータ) ファイルツール・MCP含むClaude Code全体 ✓ 低
devコンテナ 開発環境全体 ✗ 中
VM OS全体 ✓ 高
クラウドセッション(Anthropic提供) OS全体 ✓ なし

比較表に登場する選択肢のうち、2点について補足しておく。

サンドボックスランタイム(ベータ)は、組み込みサンドボックスでは対象外だったファイルツールやMCPサーバーを含むClaude Code全体を隔離できるリサーチプレビュー機能だ。Docker不要でセットアップが軽量な点が魅力だが、ベータ段階であるため本番利用前に動作を十分検証する必要がある。

クラウドセッション(Anthropic提供)は、AnthropicがホストするリモートOS上でClaude Codeを実行する方式で、ローカル環境から完全に切り離されたOS全体の隔離を、追加セットアップなしで利用できる。ローカルのクレデンシャルが直接晒されるリスクを最も根本的に排除できるアプローチだ。


詳細はHow to run Claude Code in a sandboxを参照していただきたい。