/sandbox コマンドで即有効化。macOS は何もインストール不要(Seatbelt)。Linux は bubblewrap + socat を apt install するだけ。ただし Bashコマンドしか隔離しない(file tools/MCP/hookはホスト直)
sandbox_mode を config.toml で設定。Docker 内では danger-full-access + approval_policy = "never" がベストプラクティス
sbx run codex ~/project だけで動く。Docker Desktop 4.44+ 必須
enableWeakerNestedSandbox: true が必須。bubblewrap はネストして動かないため
| 項目 | Claude Code /sandbox | sandbox-runtime | Codex CLI sandbox_mode | Docker Sandboxes (sbx) |
|---|---|---|---|---|
| 提供元 | Anthropic | Anthropic(experimental) | OpenAI | Docker |
| 対象ツール | Claude Code のみ | Claude Code(他プロセスもラップ可) | Codex CLI のみ | Claude Code / Codex 両対応 |
| 分離レベル | Bashコマンドのみ(file tools/MCP/hookは対象外) | プロセス全体(file tools・MCP・hookも含む) | プロセス(OS sandbox) | microVM(独自カーネル) |
| macOS | Seatbelt 追加DL不要 | Seatbelt | Seatbelt | macOS Docker Desktop 必須 |
| Linux | bubblewrap + socat 要インストール | bubblewrap | Landlock | Linux 対応 |
| Windows | 非対応 WSL2内のみ | 非対応 WSL2内のみ | WSL2 推奨 | 要確認 |
| ネットワーク制限 | ドメイン allowlist(プロキシ経由) | デフォルト全拒否(設定ファイルで許可リスト指定) | デフォルト OFF(設定で制限可) | あり(VM境界) |
| 起動方法 | /sandbox コマンド |
npx @anthropic-ai/sandbox-runtime claude |
config.toml または CLI フラグ | sbx run codex ~/project |
| コスト | 無料(Claude Code 内蔵) | 無料(OSSパッケージ) | 無料(Codex CLI 内蔵) | Docker Desktop 有料プラン |
| 成熟度 | 安定版 | ベータ(研究プレビュー・設定形式が変わる可能性) | 安定版 | 安定版 |
● Claude Code
# 前提: Dev Containers 拡張 # コマンドパレット: Ctrl+Shift+P Dev Containers: Reopen in Container # または左下の "><" アイコン # → "Reopen in Container" # コンテナ起動後 claude
docker run -it --rm \ --cap-add=NET_ADMIN \ --cap-add=NET_RAW \ -e ANTHROPIC_API_KEY \ -v "$HOME/.claude":/home/node/.claude \ -v "$(pwd)":/workspace \ -w /workspace \ <image> claude # 非対話型 docker run --rm ... \ claude -p "タスク説明"
# 初回のみ: APIキー登録 sbx secret set -g anthropic # 起動 sbx run claude ~/my-project # または cd してから cd ~/my-project sbx run claude # 非対話型 sbx run claude . -- \ --dangerously-skip-permissions \ -p "タスク"
● Codex CLI
# 対話型 docker run --rm -it \ -e OPENAI_API_KEY \ -v "$HOME/.codex":/root/.codex \ -v "$(pwd)":/workspace \ ghcr.io/openai/codex-universal:latest \ codex # 言語バージョン固定 -e CODEX_ENV_PYTHON_VERSION=3.12 \ -e CODEX_ENV_NODE_VERSION=22
// .devcontainer/devcontainer.json { "features": { "ghcr.io/dirien/devcontainer-feature-codex/codex:0": { "version": "latest" } }, "mounts": [ "source=${localEnv:HOME}/.codex,target=/home/vscode/.codex,type=bind" ], "remoteEnv": { "OPENAI_API_KEY": "${localEnv:OPENAI_API_KEY}" } }
# 初回のみ: APIキー登録 sbx secret set -g openai # 対話型起動 sbx run codex ~/my-project # 非対話型(CI向け) sbx run codex . -- exec \ --sandbox read-only \ --ask-for-approval never \ "テストを全部通してください"
● Kiro CLI
# 起動(認証は初回のみ) sbx run kiro ~/my-project # 初回ログイン(device flow) sbx run kiro --name my-kiro \ -- login --use-device-flow # → URL と確認コードが表示される # → ブラウザで認証 → 自動セッション開始 # 注意: ホストのユーザー設定は引き継がれない (プロジェクト設定のみ有効)
docker run -it --rm \ -v "$HOME/.local/share/kiro-cli":/root/.local/share/kiro-cli \ -v "$(pwd)":/workspace \ -w /workspace \ kiro-cli:latest kiro # 認証状態は # ~/.local/share/kiro-cli/data.sqlite3 に保存 # → ボリュームマウントで永続化
// .devcontainer/devcontainer.json { "mounts": [ "source=${localEnv:HOME}/.local/share/kiro-cli,target=/home/vscode/.local/share/kiro-cli,type=bind" ] } # 注意: 公式 devcontainer feature は未提供 # Dockerfile で npm install -g kiro が必要
| ツール | 認証方式 | 永続化パス | コンテナでの注意 |
|---|---|---|---|
| Claude Code | API Key (環境変数) | ~/.claude/ | Named Volume か bind mount で永続化 |
| Codex CLI | API Key (環境変数) | ~/.codex/ | bind mount 推奨。OAuth token もここに保存 |
| Kiro CLI | Device Flow(ブラウザ) | ~/.local/share/kiro-cli/ | sqlite3 DB をボリュームマウントで永続化必須 |
# Claude Code を起動して実行するだけ /sandbox # OS 組み込みの Seatbelt が使われる # 何もインストール不要
macOS では Seatbelt(sandbox-exec)が自動的に使われる。
# Ubuntu/Debian sudo apt-get install bubblewrap socat # Fedora sudo dnf install bubblewrap socat # seccomp フィルタ(任意・推奨) npm install -g @anthropic-ai/sandbox-runtime # その後 Claude Code 再起動 → /sandbox
Ubuntu 24.04 は AppArmor 追加設定が必要な場合あり(後述)。
sysctl kernel.apparmor_restrict_unprivileged_userns が 1 の場合、bubblewrap が user namespace を作れない。以下のプロファイルを追加する:
sudo tee /etc/apparmor.d/bwrap <<'EOF' abi <abi/4.0>, include <tunables/global> profile bwrap /usr/bin/bwrap flags=(unconfined) { userns, } EOF sudo systemctl reload apparmor
rm / 等の危険操作は例外でプロンプト/sandbox パネルの Mode タブで切り替え。設定は .claude/settings.local.json(git非管理)に保存される。全PJに適用したい場合は ~/.claude/settings.json に "sandbox": {"enabled": true} を追加。
ファイルシステム制限
~/.aws ~/.ssh も読める!)~/.bashrc 等のシェル設定は書き込み不可settings.json 自体への書き込みは自動ブロックallowWrite / denyRead で拡張可能ネットワーク制限
allowedDomains で事前許可deniedDomains で明示的ブロック~/.aws/credentials、~/.ssh/id_rsa などは デフォルトで読み込み可能。
ブロックするには sandbox.filesystem.denyRead: ["~/.aws", "~/.ssh"] を明示的に設定すること。
// .claude/settings.json(プロジェクトスコープ) { "sandbox": { "enabled": true, "failIfUnavailable": false, // true: 依存不足で起動失敗 "allowUnsandboxedCommands": true, // false: エスケープハッチ無効化 "enableWeakerNestedSandbox": false, // Docker内のみ true にする "filesystem": { "allowWrite": ["~/.kube", "/tmp/build"], // 書き込み許可追加 "denyRead": ["~/.aws", "~/.ssh"], // 読み込みブロック "allowRead": ["."] // denyRead 内の例外 }, "allowedDomains": ["registry.npmjs.org", "api.github.com"], "deniedDomains": ["example.com"], "bwrapPath": "/usr/bin/bwrap", // v2.1.133+ カスタムパス "socatPath": "/usr/bin/socat", "network": { "httpProxyPort": 8080, // カスタムプロキシ "socksProxyPort": 8081 } }, "excludedCommands": ["docker *", "kubectl *"] // sandbox 外で実行 }
パス prefix: / = 絶対パス、~/ = ホーム相対、./ or 無し = プロジェクトルート相対。
docker は sandbox と互換性なし。excludedCommands に追加して sandbox 外で実行させる:
"excludedCommands": ["docker *"]
非特権コンテナ内では bubblewrap が /proc をマウントできない。弱化モードを有効にする:
"enableWeakerNestedSandbox": true
注意:コンテナ自体の分離で補う前提。セキュリティが弱まる。
watchman が sandbox と非互換。jest --no-watchman で実行するか、excludedCommands に追加。
Seatbelt 下で TLS 検証が失敗することがある。対処:
"excludedCommands": ["gh *", "gcloud *", "terraform *"]
@anthropic-ai/sandbox-runtime
/sandbox はBashコマンドしか隔離しない。Read/Edit/WebFetchなどの組み込みツールやMCPサーバー・hookはホスト上で無制限に動く。
Claude Codeプロセス全体を同じSeatbelt/bubblewrap隔離でラップしたい場合、Docker を使わずに sandbox-runtime を使う。
# 起動 npx @anthropic-ai/sandbox-runtime claude
デフォルトは書き込み・ネットワークとも全拒否。~/.srt-settings.json(または--settingsで指定するファイル)で
プロジェクトディレクトリと ~/.claude / ~/.claude.json への書き込み、api.anthropic.com 等の必要なドメインを事前に許可しておく必要がある。
/sandbox(Bashのみ)を使い、
file tools/MCP/hookも含めて丸ごと隔離したい場合にのみ検討する。
--full-auto のデフォルト
--full-auto = approval_policy = "on-request" + sandbox_mode = "workspace-write" のショートカット。ネットワークは別途 sandbox_workspace_write.network_access = true が必要。
# ~/.codex/config.toml(グローバル) # 承認ポリシー: "on-request" | "on-failure" | "never" | "untrusted" approval_policy = "on-request" # sandbox モード: "read-only" | "workspace-write" | "danger-full-access" sandbox_mode = "workspace-write" # workspace-write でのネットワーク許可 [sandbox_workspace_write] network_access = false # true にするとネット接続可 ───────────────────────────────────────── # Docker コンテナ内での推奨設定 approval_policy = "never" sandbox_mode = "danger-full-access" # コンテナ境界がセキュリティ層になる
| approval_policy | 意味 | 使い場面 |
|---|---|---|
| on-request | 毎回確認 | デフォルト。通常の対話作業 |
| on-failure | 失敗時のみ確認 | 自律実行させたい場合 |
| never | 確認なし | コンテナ内・CI環境 |
| untrusted | 全操作に確認 | 最高セキュリティが必要な場合 |
OpenAI が提供する公式 Docker イメージ。Codex クラウドタスクと同じ環境を再現できる。
# 基本的な使い方 docker run --rm -it \ -e OPENAI_API_KEY="$OPENAI_API_KEY" \ -v "$HOME/.codex":/root/.codex \ # OAuth token を永続化 -v "$PWD":/workspace \ ghcr.io/openai/codex-universal:latest codex # 言語バージョンを固定する docker run --rm -it \ -e OPENAI_API_KEY="$OPENAI_API_KEY" \ -e CODEX_ENV_PYTHON_VERSION=3.12 \ -e CODEX_ENV_NODE_VERSION=22 \ -v "$PWD":/workspace \ ghcr.io/openai/codex-universal:latest \ codex --dangerously-bypass-approvals-and-sandbox \ exec "テストを全部通してください"
| 収録ランタイム | バージョン | 環境変数 |
|---|---|---|
| Python | 3.10 / 3.11 / 3.12 / 3.13 / 3.14 | CODEX_ENV_PYTHON_VERSION |
| Node.js | 18 / 20 / 22 / 24 | CODEX_ENV_NODE_VERSION |
| Rust / Go / Java / Ruby / PHP | 複数バージョン | CODEX_ENV_* |
| ビルドツール | uv / pnpm / poetry / cmake / ninja / Bazelisk | — |
sbx CLI(Docker Desktop に同梱)# ── 初回セットアップ(一度だけ)────────────────── sbx secret set -g anthropic # Claude Code 用 sbx secret set -g openai # Codex CLI 用 # Kiro は初回起動時に device flow で認証(API key 不要) # ── Claude Code ─────────────────────────────────── sbx run claude ~/my-project # 対話型 sbx run claude . -- \ --dangerously-skip-permissions \ -p "ユニットテストを追加して" # 非対話型 # ── Codex CLI ───────────────────────────────────── sbx run codex ~/my-project # 対話型 sbx run codex . -- exec \ --sandbox read-only \ --ask-for-approval never \ "テストを全部通してください" # 非対話型 CI 向け # ── Kiro CLI ────────────────────────────────────── sbx run kiro ~/my-project # 対話型 sbx run kiro --name my-kiro \ -- login --use-device-flow # 初回ログイン # → URL と確認コードが表示される → ブラウザで認証 # ※ ホストのユーザー設定は引き継がれない(プロジェクト設定のみ) # ── 名前付きサンドボックスの管理 ───────────────── sbx list # 実行中一覧 sbx stop <name> # 停止 sbx rm <name> # 削除
devcontainerのボリューム構成・~/.claude永続化の設計は コンテナ運用ガイド で詳しく扱う。ここではsandbox設定の推奨値のみ。
// .claude/settings.json { "sandbox": { // bubblewrap はネスト不可なので弱化モード "enableWeakerNestedSandbox": true, // コンテナの iptables が代わりに制限 "enabled": true, // 資格情報へのアクセスをブロック "filesystem": { "denyRead": ["~/.aws", "~/.ssh"] } }, // docker コマンドは除外 "excludedCommands": ["docker *"] }
ネットワーク制限はコンテナの init-firewall.sh が担う。
# ~/.codex/config.toml # コンテナ境界がセキュリティ層なので # 確認なし・制限なしで動かせる approval_policy = "never" sandbox_mode = "danger-full-access" # または CLI フラグで指定 # codex --dangerously-bypass-approvals-and-sandbox # codex --yolo (上記の別名)
コンテナの iptables でネットワーク制限を担わせる設計。
~/.aws ~/.ssh をデフォルトで読める。denyRead で明示ブロック必須CLAUDE_CODE_SUBPROCESS_ENV_SCRUB で資格情報を除去可能最終更新: 2026-07-16 ✦ Claude Code 公式 Docs (code.claude.com/docs/en/sandboxing, /en/sandbox-environments)、Codex CLI Docs (developers.openai.com)、Docker Docs を参照 ✦ WebFetch で確認済み