Gateway
サンドボックス化
OpenClawは、影響範囲を縮小するために、サンドボックスバックエンド内でツールを実行できます。サンドボックス化はデフォルトでは無効で、agents.defaults.sandbox(グローバル)またはagents.list[].sandbox(エージェント単位)で制御します。Gatewayプロセスは常にホスト上に留まり、有効にした場合にツール実行だけがサンドボックスへ移動します。
サンドボックス化されるもの
- ツール実行:
exec、read、write、edit、apply_patch、processなど。 - オプションのサンドボックス化ブラウザー(
agents.defaults.sandbox.browser)。
サンドボックス化されないもの:
- Gatewayプロセス自体。
tools.elevatedによってサンドボックス外での実行が明示的に許可されたツール。昇格されたexecはサンドボックス化を迂回し、設定されたエスケープパス(デフォルトはgateway、execターゲットがnodeの場合はnode)で実行されます。サンドボックス化が無効な場合、execはすでにホスト上で実行されるため、tools.elevatedによる変化はありません。昇格モードを参照してください。
モード、スコープ、バックエンド
サンドボックスの動作は、互いに独立した3つの設定で制御します。
| 設定 | キー | 値 | デフォルト |
|---|---|---|---|
| モード | agents.defaults.sandbox.mode |
off、non-main、all |
off |
| スコープ | agents.defaults.sandbox.scope |
agent、session、shared |
agent |
| バックエンド | agents.defaults.sandbox.backend |
docker、ssh、openshell |
docker |
モードは、サンドボックス化をいつ適用するかを制御します。
off:サンドボックス化しません。non-main:エージェントのメインセッションを除くすべてのセッションをサンドボックス化します。メインセッションキーは常にagent:<agentId>:main(session.scopeが"global"の場合はglobal)であり、変更できません。グループ/チャンネルセッションは独自のキーを使用するため、常に非メインとして扱われ、サンドボックス化されます。all:すべてのセッションをサンドボックス内で実行します。
スコープは、作成するコンテナ/環境の数を制御します。
agent:エージェントごとに1つのコンテナ。session:セッションごとに1つのコンテナ。shared:サンドボックス化されたすべてのセッションで1つのコンテナを共有します(このスコープでは、エージェント単位のdocker/ssh/browserオーバーライドは無視されます)。
バックエンドは、サンドボックス化されたツールを実行するランタイムを制御します。SSH固有の設定はagents.defaults.sandbox.sshに、OpenShell固有の設定はplugins.entries.openshell.configにあります。
| Docker | SSH | OpenShell | |
|---|---|---|---|
| 実行場所 | ローカルコンテナ | SSHでアクセス可能な任意のホスト | OpenShell管理のサンドボックス |
| セットアップ | scripts/sandbox-setup.sh |
SSHキー+ターゲットホスト | OpenShell Pluginを有効化 |
| ワークスペースモデル | バインドマウントまたはコピー | リモートを正とする(初回のみシード) | mirrorまたはremote |
| ネットワーク制御 | docker.network(デフォルト:なし) |
リモートホストに依存 | OpenShellに依存 |
| ブラウザーサンドボックス | 対応 | 非対応 | 現時点では非対応 |
| バインドマウント | docker.binds |
該当なし | 該当なし |
| 最適な用途 | ローカル開発、完全な分離 | リモートマシンへのオフロード | オプションの双方向同期を備えた管理対象リモートサンドボックス |
Dockerバックエンド
サンドボックス化を有効にすると、Dockerがデフォルトのバックエンドになります。Dockerデーモンソケット(/var/run/docker.sock)を介してツールとサンドボックスブラウザーをローカルで実行し、Docker名前空間によって分離します。
デフォルト:network: "none"(外向き通信なし)、readOnlyRoot: true、capDrop: ["ALL"]、イメージopenclaw-sandbox:bookworm-slim。
ホストGPUを公開するには、agents.defaults.sandbox.docker.gpus(またはエージェント単位のオーバーライド)を"all"や"device=GPU-uuid"などの値に設定します。これはDockerの--gpusフラグに渡され、NVIDIA Container Toolkitなど、互換性のあるホストランタイムが必要です。
サンドボックス化されたブラウザー
- ブラウザーツールが必要とすると、サンドボックスブラウザーは自動起動します(CDPに到達可能な状態を確保します)。
agents.defaults.sandbox.browser.autoStart(デフォルトtrue)およびautoStartTimeoutMs(デフォルト12秒)で設定します。 - サンドボックスブラウザーコンテナは、グローバルな
bridgeネットワークではなく、専用のDockerネットワーク(openclaw-sandbox-browser)を使用します。agents.defaults.sandbox.browser.networkで設定します。 agents.defaults.sandbox.browser.cdpSourceRangeは、CIDR許可リスト(例:172.21.0.1/32)を使用して、コンテナ境界でのCDP受信を制限します。- noVNCオブザーバーアクセスはデフォルトでパスワード保護されています。OpenClawは、有効期間の短いトークンURLを生成します。このURLはローカルのブートストラップページを提供し、URLフラグメントにパスワードを含めてnoVNCを開きます(クエリ文字列やヘッダーログには含めません)。
agents.defaults.sandbox.browser.allowHostControl(デフォルトfalse)を有効にすると、サンドボックス化されたセッションからホストブラウザーを明示的にターゲットにできます。- オプションの許可リスト
allowedControlUrls、allowedControlHosts、allowedControlPortsによって、target: "custom"を制限します。
SSHバックエンド
任意のSSHアクセス可能なマシン上でexec、ファイルツール、メディア読み取りをサンドボックス化するには、backend: "ssh"を使用します。
{ agents: { defaults: { sandbox: { mode: "all", backend: "ssh", scope: "session", workspaceAccess: "rw", ssh: { target: "user@gateway-host:22", workspaceRoot: "/tmp/openclaw-sandboxes", strictHostKeyChecking: true, updateHostKeys: true, identityFile: "~/.ssh/id_ed25519", certificateFile: "~/.ssh/id_ed25519-cert.pub", knownHostsFile: "~/.ssh/known_hosts", // または、ローカルファイルの代わりにSecretRefs/インライン内容を使用: // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" }, // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" }, // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" }, }, }, }, },}デフォルト:command: "ssh"、workspaceRoot: "/tmp/openclaw-sandboxes"、strictHostKeyChecking: true、updateHostKeys: true。
- ライフサイクル:OpenClawは、
sandbox.ssh.workspaceRootの下にスコープごとのリモートルートを作成します。作成または再作成後の初回使用時に、ローカルワークスペースからそのリモートワークスペースへ一度だけシードします。その後、exec、read、write、edit、apply_patch、プロンプト内メディアの読み取り、および受信メディアのステージングは、SSH経由でリモートワークスペースに対して直接実行されます。OpenClawはリモートでの変更をローカルワークスペースへ自動的に同期しません。 - 認証情報:
identityFile/certificateFile/knownHostsFileは、既存のローカルファイルを参照します。identityData/certificateData/knownHostsDataは、インライン文字列またはSecretRefsを受け入れます。これらは通常のシークレットランタイムスナップショットを介して解決され、モード0600の一時ファイルに書き込まれ、SSHセッション終了時に削除されます。同じ項目に*Fileと*Dataの両方が設定されている場合、そのセッションでは*Dataが優先されます。 - リモートを正とする場合の影響:初回シード後は、リモートSSHワークスペースが実際のサンドボックス状態になります。シード後にOpenClaw外で行ったホストローカルの編集は、サンドボックスを再作成するまでリモートには反映されません。
openclaw sandbox recreateはスコープごとのリモートルートを削除し、次回使用時にローカルから再度シードします。このバックエンドではブラウザーのサンドボックス化はサポートされず、sandbox.docker.*設定も適用されません。
OpenShellバックエンド
OpenShellが管理するリモート環境内でツールをサンドボックス化するには、backend: "openshell"を使用します。OpenShellは、汎用SSHバックエンドと同じSSHトランスポートおよびリモートファイルシステムブリッジを再利用し、OpenShellのライフサイクル(sandbox create/get/delete/ssh-config)と、オプションのmirrorワークスペース同期モードを追加します。
{ agents: { defaults: { sandbox: { mode: "all", backend: "openshell", scope: "session", workspaceAccess: "rw", }, }, }, plugins: { entries: { openshell: { enabled: true, config: { from: "openclaw", mode: "remote", // mirror | remote }, }, }, },}mode: "mirror"(デフォルト)では、ローカルワークスペースを正として維持します。OpenClawはexecの前にローカルからサンドボックスへ同期し、実行後にサンドボックスからローカルへ同期します。mode: "remote"では、ローカルからリモートワークスペースへ一度だけシードし、その後は同期を戻さずに、リモートワークスペースに対してexec/read/write/edit/apply_patchを直接実行します。シード後のローカル編集は、openclaw sandbox recreateを実行するまで反映されません。scope: "agent"またはscope: "shared"では、そのリモートワークスペースが同じスコープで共有されます。現在の制限:サンドボックスブラウザーはまだサポートされておらず、sandbox.docker.bindsはこのバックエンドには適用されません。
openclaw sandbox list/recreate/pruneはすべて、OpenShellランタイムをDockerランタイムと同様に扱います。pruneロジックはバックエンドを認識します。
完全な前提条件、設定リファレンス、ワークスペースモードの比較、ライフサイクルの詳細については、OpenShellを参照してください。
ワークスペースへのアクセス
agents.defaults.sandbox.workspaceAccessは、サンドボックスから参照できる範囲を制御します。
| 値 | 動作 |
|---|---|
none(既定) |
ツールには ~/.openclaw/sandboxes 配下の隔離されたサンドボックスワークスペースが見えます。 |
ro |
エージェントワークスペースを /agent に読み取り専用でマウントします(write/edit/apply_patch は無効になります)。 |
rw |
エージェントワークスペースを /workspace に読み書き可能でマウントします。 |
OpenShell バックエンドでは、mirror モードは引き続き exec ターン間の正規ソースとしてローカルワークスペースを使用し、remote モードは初回シード後にリモート OpenShell ワークスペースを正規ソースとして使用します。また、workspaceAccess: "ro"/"none" は引き続き同じ方法で書き込み動作を制限します。
受信メディアは、アクティブなサンドボックスワークスペース(media/inbound/*)にコピーされます。
カスタムバインドマウント
agents.defaults.sandbox.docker.binds は、追加のホストディレクトリをコンテナにマウントします。形式:host:container:mode(例:"/home/user/source:/source:rw")。
グローバルとエージェント単位のバインドはマージされます(置換されません)。scope: "shared" では、エージェント単位のバインドは無視されます。
agents.defaults.sandbox.browser.binds は、追加のホストディレクトリを サンドボックスブラウザー コンテナのみにマウントします。設定されている場合([] を含む)、ブラウザーコンテナでは docker.binds を置き換えます。省略した場合、ブラウザーコンテナは docker.binds にフォールバックします。
{ agents: { defaults: { sandbox: { docker: { binds: ["/home/user/source:/source:ro", "/var/data/myapp:/data:ro"], }, }, }, list: [ { id: "build", sandbox: { docker: { binds: ["/mnt/cache:/cache:rw"], }, }, }, ], },}イメージとセットアップ
既定の Docker イメージ:openclaw-sandbox:bookworm-slim
既定のイメージをビルドする
ソースチェックアウトから:
scripts/sandbox-setup.shnpm インストールから(ソースチェックアウトは不要):
docker build -t openclaw-sandbox:bookworm-slim - <<'DOCKERFILE'FROM debian:bookworm-slimENV DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y --no-install-recommends \ bash ca-certificates curl git jq python3 ripgrep \ && rm -rf /var/lib/apt/lists/*RUN useradd --create-home --shell /bin/bash sandboxUSER sandboxWORKDIR /home/sandboxCMD ["sleep", "infinity"]DOCKERFILE既定のイメージには Node が含まれていません。Skill が Node(または他のランタイム)を必要とする場合は、カスタムイメージに組み込むか、sandbox.docker.setupCommand でインストールしてください(ネットワークへの外向き通信、書き込み可能なルート、root ユーザーが必要です)。
openclaw-sandbox:bookworm-slim が見つからない場合でも、OpenClaw が通常の debian:bookworm-slim に暗黙的に置き換えることはありません。同梱イメージにはサンドボックスの書き込み/編集ヘルパー用の python3 が含まれているため、既定のイメージを対象とするサンドボックス実行は、そのイメージをビルドするまでビルド手順を示して即座に失敗します。
任意:共通イメージをビルドする
一般的なツール(たとえば curl、jq、Node 24、pnpm、python3、git)を備えた、より高機能なサンドボックスイメージを使用する場合:
ソースチェックアウトから:
scripts/sandbox-common-setup.shnpm インストールからは、まず既定のイメージをビルドし(上記参照)、次にリポジトリの scripts/docker/sandbox/Dockerfile.common を使用して、その上に共通イメージをビルドします。
次に、agents.defaults.sandbox.docker.image を openclaw-sandbox-common:bookworm-slim に設定します。
任意:サンドボックスブラウザーイメージをビルドする
ソースチェックアウトから:
scripts/sandbox-browser-setup.shnpm インストールからは、リポジトリの scripts/docker/sandbox/Dockerfile.browser を使用してビルドします。
既定では、Docker サンドボックスコンテナはネットワークなしで実行されます。agents.defaults.sandbox.docker.network で上書きできます。
サンドボックスブラウザーの Chromium 既定値
同梱のサンドボックスブラウザーイメージは、コンテナ化されたワークロード向けに保守的な Chromium 起動フラグを適用します。
--remote-debugging-address=127.0.0.1--remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>--user-data-dir=${HOME}/.chrome--no-first-run--no-default-browser-check--disable-dev-shm-usage--disable-background-networking--disable-breakpad--disable-crash-reporter--no-zygote--metrics-recording-only--password-store=basic--use-mock-keychainbrowser.headlessが有効な場合は--headless=new。browser.noSandboxが有効な場合は--no-sandbox --disable-setuid-sandbox。- 既定では
--disable-3d-apis、--disable-gpu、--disable-software-rasterizer。これらのグラフィックス強化フラグは、GPU サポートのないコンテナで役立ちます。ワークロードで WebGL またはその他の 3D 機能が必要な場合は、OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0を設定してください。 - 既定では
--disable-extensions。拡張機能に依存するフローでは、OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0を設定してください。 - 既定では
--renderer-process-limit=2。OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>で制御し、0にすると Chromium の既定値を維持します。
異なるランタイムプロファイルが必要な場合は、カスタムブラウザーイメージを使用し、独自のエントリーポイントを指定してください。ローカル(コンテナ外)の Chromium プロファイルでは、browser.extraArgs を使用して追加の起動フラグを付加します。
ネットワークセキュリティの既定値
network: "host"はブロックされます。network: "container:<id>"は既定でブロックされます(名前空間への参加による迂回リスク)。- 緊急時の上書き:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true。
Docker のインストールとコンテナ化された Gateway については、Dockerを参照してください。
Docker Gateway のデプロイでは、scripts/docker/setup.sh でサンドボックス設定をブートストラップできます。この経路を有効にするには、OPENCLAW_SANDBOX=1(または true/yes/on)を設定します。ソケットの場所は OPENCLAW_DOCKER_SOCKET で上書きできます。完全なセットアップと環境変数のリファレンスについては、Dockerを参照してください。
setupCommand(コンテナの一回限りのセットアップ)
setupCommand は、サンドボックスコンテナの作成後に一度だけ実行されます(実行のたびではありません)。コンテナ内で sh -lc を介して実行されます。
パス:
- グローバル:
agents.defaults.sandbox.docker.setupCommand - エージェント単位:
agents.list[].sandbox.docker.setupCommand
よくある落とし穴
- 既定の
docker.networkは"none"(外向き通信なし)なので、パッケージのインストールは失敗します。 docker.network: "container:<id>"にはdangerouslyAllowContainerNamespaceJoin: trueが必要で、緊急時にのみ使用できます。readOnlyRoot: trueは書き込みを禁止します。readOnlyRoot: falseを設定するか、カスタムイメージに組み込んでください。- パッケージのインストールには
userが root である必要があります(userを省略するか、user: "0:0"を設定します)。 - サンドボックスの exec は、ホストの
process.envを継承しません。Skill の API キーには、agents.defaults.sandbox.docker.env(またはカスタムイメージ)を使用してください。 agents.defaults.sandbox.docker.envの値は、明示的な Docker コンテナ環境変数として渡されます。Docker デーモンへのアクセス権を持つ人は、docker inspectなどの Docker メタデータコマンドでそれらを確認できます。そのメタデータ公開が許容できない場合は、カスタムイメージ、マウントしたシークレットファイル、または別のシークレット配信経路を使用してください。
ツールポリシーと回避手段
ツールの許可/拒否ポリシーは、サンドボックスのルールより先に引き続き適用されます。ツールがグローバルまたはエージェント単位で拒否されている場合、サンドボックス化によって再び利用可能になることはありません。
tools.elevated は、サンドボックス外で exec を実行するための明示的な回避手段です(既定では gateway、exec の対象が node の場合は node)。/exec ディレクティブは許可された送信者にのみ適用され、セッション単位で保持されます。exec を完全に無効化するには、ツールポリシーの deny を使用してください(サンドボックスとツールポリシーと昇格を参照)。
デバッグ:
openclaw sandbox listは、サンドボックスコンテナ、状態、イメージの一致、経過時間、アイドル時間、関連付けられたセッション/エージェントを表示します。openclaw sandbox explain [--session <key>] [--agent <id>]は、有効なサンドボックスモード、ホストワークスペース、ランタイム作業ディレクトリ、Docker マウント、ツールポリシー、修正用の設定キーを調査します。そのworkspaceRootフィールドは設定済みのサンドボックスルートのままであり、effectiveHostWorkspaceRootはアクティブなワークスペースが実際に存在する場所を示します。openclaw sandbox recreate [--all | --session <key> | --agent <id>] [--browser] [--force]はコンテナ/環境を削除し、次回使用時に現在の設定で再作成されるようにします。- 「なぜこれがブロックされるのか」を理解するための考え方については、サンドボックスとツールポリシーと昇格を参照してください。
マルチエージェントの上書き
各エージェントは、agents.list[].sandbox と agents.list[].tools(およびサンドボックスのツールポリシー用の agents.list[].tools.sandbox.tools)でサンドボックスとツールを上書きできます。優先順位については、マルチエージェントのサンドボックスとツールを参照してください。
最小限の有効化例
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", }, }, },}関連項目
- マルチエージェントのサンドボックスとツール -- エージェントごとのオーバーライドと優先順位
- OpenShell -- 管理対象サンドボックスバックエンドのセットアップ、ワークスペースモード、設定リファレンス
- サンドボックス設定
- サンドボックスとツールポリシーと昇格の違い -- 「なぜこれがブロックされるのか?」のデバッグ
- セキュリティ