サンドボックス化
OpenClawは、影響範囲を減らすためにサンドボックスバックエンド内でツールを実行できます。 これは任意機能で、設定(agents.defaults.sandbox または
agents.list[].sandbox)で制御されます。サンドボックス化がオフの場合、ツールはホスト上で実行されます。
Gatewayはホスト上に残り、ツール実行は有効時に分離されたサンドボックス内で行われます。
これは完全なセキュリティ境界ではありませんが、モデルが何か愚かなことをしたときに、ファイルシステムとプロセスへのアクセスを実質的に制限します。
何がサンドボックス化されるか
- ツール実行(
exec、read、write、edit、apply_patch、processなど)。 - 任意のサンドボックス化されたブラウザー(
agents.defaults.sandbox.browser)。- デフォルトでは、ブラウザーツールが必要とするときにサンドボックスブラウザーが自動起動し(CDPに到達可能であることを保証)、設定は
agents.defaults.sandbox.browser.autoStartとagents.defaults.sandbox.browser.autoStartTimeoutMsで行います。 - デフォルトでは、サンドボックスブラウザーコンテナはグローバルな
bridgeネットワークではなく、専用のDockerネットワーク(openclaw-sandbox-browser)を使用します。agents.defaults.sandbox.browser.networkで設定します。 - 任意の
agents.defaults.sandbox.browser.cdpSourceRangeでは、CIDR allowlist(たとえば172.21.0.1/32)でコンテナ境界のCDP ingressを制限できます。 - noVNCのオブザーバーアクセスはデフォルトでパスワード保護されます。OpenClawは短命のトークンURLを発行し、ローカルのブートストラップページを配信して、URLフラグメント内のパスワードでnoVNCを開きます(query/headerログには残りません)。
agents.defaults.sandbox.browser.allowHostControlにより、サンドボックス化されたセッションが明示的にホストブラウザーを対象にできます。- 任意のallowlistで
target: "custom"を制御できます:allowedControlUrls、allowedControlHosts、allowedControlPorts。
- デフォルトでは、ブラウザーツールが必要とするときにサンドボックスブラウザーが自動起動し(CDPに到達可能であることを保証)、設定は
- Gatewayプロセス自体。
- 明示的にサンドボックス外で実行を許可されたツール(例:
tools.elevated)。- elevated execはサンドボックス化をバイパスし、設定されたエスケープパス(デフォルトは
gateway、execターゲットがnodeの場合はnode)を使用します。 - サンドボックス化がオフの場合、
tools.elevatedは実行を変更しません(すでにホスト上です)。Elevated Mode を参照してください。
- elevated execはサンドボックス化をバイパスし、設定されたエスケープパス(デフォルトは
モード
agents.defaults.sandbox.mode は、いつサンドボックス化を使用するかを制御します:
"off": サンドボックス化しません。"non-main": non-main セッションのみサンドボックス化します(通常のチャットをホスト上に残したい場合のデフォルト)。"all": すべてのセッションをサンドボックスで実行します。 注:"non-main"はagent idではなくsession.mainKey(デフォルト"main")に基づきます。 グループ/チャネルセッションは独自のキーを使うため、non-mainとして扱われ、サンドボックス化されます。
スコープ
agents.defaults.sandbox.scope は、いくつコンテナを作成するかを制御します:
"agent"(デフォルト): agentごとに1コンテナ。"session": sessionごとに1コンテナ。"shared": すべてのサンドボックス化セッションで1コンテナを共有。
バックエンド
agents.defaults.sandbox.backend は、どのランタイムがサンドボックスを提供するかを制御します:
"docker"(デフォルト): ローカルDockerベースのサンドボックスランタイム。"ssh": 汎用SSHベースのリモートサンドボックスランタイム。"openshell": OpenShellベースのサンドボックスランタイム。
agents.defaults.sandbox.ssh 配下にあります。
OpenShell固有の設定は plugins.entries.openshell.config 配下にあります。
バックエンドの選択
| Docker | SSH | OpenShell | |
|---|---|---|---|
| 実行場所 | ローカルコンテナ | SSHでアクセス可能な任意のホスト | OpenShell管理サンドボックス |
| セットアップ | scripts/sandbox-setup.sh | SSHキー + 対象ホスト | OpenShellプラグインを有効化 |
| ワークスペースモデル | Bind-mountまたはコピー | リモートを正とする(最初に一度seed) | mirror または remote |
| ネットワーク制御 | docker.network(デフォルト: none) | リモートホスト依存 | OpenShell依存 |
| ブラウザーサンドボックス | 対応 | 非対応 | まだ非対応 |
| Bind mounts | docker.binds | N/A | N/A |
| 最適な用途 | ローカル開発、完全な分離 | リモートマシンへのオフロード | 任意の双方向同期付き管理されたリモートサンドボックス |
SSHバックエンド
任意のSSHアクセス可能なマシン上で、OpenClawにexec、ファイルツール、メディア読み取りをサンドボックス化させたい場合は backend: "ssh" を使用します。
- OpenClawは
sandbox.ssh.workspaceRoot配下に、スコープごとのリモートrootを作成します。 - 作成または再作成後の最初の使用時に、OpenClawはローカルワークスペースからそのリモートワークスペースへ一度だけseedします。
- その後、
exec、read、write、edit、apply_patch、プロンプトメディア読み取り、および受信メディアのステージングは、SSH経由で直接そのリモートワークスペースに対して実行されます。 - OpenClawは、リモートの変更をローカルワークスペースへ自動同期しません。
identityFile、certificateFile、knownHostsFile: 既存のローカルファイルを使い、OpenSSH設定を通して渡します。identityData、certificateData、knownHostsData: インライン文字列またはSecretRefを使います。OpenClawは通常のsecretsランタイムスナップショット経由でそれらを解決し、0600で一時ファイルに書き出し、SSHセッション終了時に削除します。- 同じ項目に対して
*Fileと*Dataの両方が設定されている場合、そのSSHセッションでは*Dataが優先されます。
- seedステップ後にOpenClaw外で行われたホストローカル編集は、サンドボックスを再作成するまでリモートには反映されません。
openclaw sandbox recreateはスコープごとのリモートrootを削除し、次回使用時にローカルから再度seedします。- SSHバックエンドではブラウザーサンドボックス化はサポートされません。
sandbox.docker.*設定はSSHバックエンドには適用されません。
OpenShellバックエンド
OpenShell管理のリモート環境でツールをサンドボックス化したい場合は、backend: "openshell" を使用します。完全なセットアップガイド、設定リファレンス、およびワークスペースモード比較については、専用の
OpenShellページ を参照してください。
OpenShellは、汎用SSHバックエンドと同じコアSSHトランスポートおよびリモートファイルシステムブリッジを再利用し、OpenShell固有のライフサイクル
(sandbox create/get/delete、sandbox ssh-config)に加えて、任意の mirror
ワークスペースモードを追加します。
mirror(デフォルト): ローカルワークスペースが正のままです。OpenClawはexec前にローカルファイルをOpenShellへ同期し、exec後にリモートワークスペースをローカルへ同期し戻します。remote: サンドボックス作成後はOpenShellワークスペースが正になります。OpenClawはローカルワークスペースから一度だけリモートワークスペースをseedし、その後はファイルツールとexecが変更を戻し同期せずに、直接そのリモートサンドボックスに対して実行されます。
- OpenClawは
openshell sandbox ssh-config <name>経由で、サンドボックス固有のSSH設定をOpenShellに要求します。 - コアはそのSSH設定を一時ファイルに書き出し、SSHセッションを開き、
backend: "ssh"で使われるのと同じリモートファイルシステムブリッジを再利用します。 mirrorモードではライフサイクルのみが異なります:exec前にローカルからリモートへ同期し、その後に同期し戻します。
- サンドボックスブラウザーはまだサポートされていません
sandbox.docker.bindsはOpenShellバックエンドではサポートされていませんsandbox.docker.*配下のDocker固有ランタイムノブも、引き続きDockerバックエンドにのみ適用されます
ワークスペースモード
OpenShellには2つのワークスペースモデルがあります。実際には、ここが最も重要な部分です。mirror
ローカルワークスペースを正に保ちたい場合は、plugins.entries.openshell.config.mode: "mirror" を使用します。
動作:
exec前に、OpenClawはローカルワークスペースをOpenShellサンドボックスへ同期します。exec後に、OpenClawはリモートワークスペースをローカルワークスペースへ同期し戻します。- ファイルツールは引き続きサンドボックスブリッジ経由で動作しますが、ターン間ではローカルワークスペースが信頼できる情報源のままです。
- OpenClaw外でローカルにファイルを編集し、その変更を自動的にサンドボックスへ反映させたい
- OpenShellサンドボックスの動作を、できるだけDockerバックエンドに近づけたい
- 各execターン後に、ホストワークスペースへサンドボックスの書き込みを反映させたい
- execの前後に追加の同期コストが発生します
remote
OpenShellワークスペースを正にしたい場合は、plugins.entries.openshell.config.mode: "remote" を使用します。
動作:
- サンドボックスが最初に作成されるとき、OpenClawはローカルワークスペースからリモートワークスペースへ一度だけseedします。
- その後、
exec、read、write、edit、apply_patchは直接リモートOpenShellワークスペースに対して動作します。 - OpenClawは
exec後にリモート変更をローカルワークスペースへ同期し戻しません。 - プロンプト時のメディア読み取りは引き続き動作します。これは、ファイルツールとメディアツールがローカルホストパスを前提にせず、サンドボックスブリッジ経由で読み取るためです。
- トランスポートは、
openshell sandbox ssh-configが返すOpenShellサンドボックスへのSSHです。
- seedステップ後にOpenClaw外でホスト上のファイルを編集しても、リモートサンドボックスはそれらの変更を自動では見ません。
- サンドボックスを再作成すると、リモートワークスペースは再びローカルワークスペースからseedされます。
scope: "agent"またはscope: "shared"では、そのリモートワークスペースも同じスコープで共有されます。
- サンドボックスを主にリモートOpenShell側で存続させたい
- ターンごとの同期オーバーヘッドを下げたい
- ホストローカル編集でリモートサンドボックス状態が黙って上書きされることを避けたい
mirror を選んでください。
サンドボックスを実際のワークスペースと考えるなら remote を選んでください。
OpenShellライフサイクル
OpenShellサンドボックスも、通常のサンドボックスライフサイクルで管理されます:openclaw sandbox listはDockerランタイムだけでなくOpenShellランタイムも表示しますopenclaw sandbox recreateは現在のランタイムを削除し、次回使用時にOpenClawが再作成できるようにします- pruneロジックもバックエンド対応です
remote モードでは、recreateが特に重要です:
- recreateはそのスコープの正となるリモートワークスペースを削除します
- 次回使用時に、ローカルワークスペースから新しいリモートワークスペースをseedします
mirror モードでは、ローカルワークスペースが正のままなので、
recreateは主にリモート実行環境をリセットします。
ワークスペースアクセス
agents.defaults.sandbox.workspaceAccess は、サンドボックスが何を見られるかを制御します:
"none"(デフォルト): ツールは~/.openclaw/sandboxes配下のサンドボックスワークスペースを見ます。"ro": agentワークスペースを/agentに読み取り専用でmountします(write/edit/apply_patchを無効化)。"rw": agentワークスペースを/workspaceに読み書き可能でmountします。
mirrorモードでは、execターン間でもローカルワークスペースが正のソースのままですremoteモードでは、初回seed後はリモートOpenShellワークスペースが正のソースになりますworkspaceAccess: "ro"と"none"でも、同様に書き込み動作を制限します
media/inbound/*)にコピーされます。
Skillsに関する注記: read ツールはサンドボックスroot基準です。workspaceAccess: "none" では、
OpenClawは対象のSkillsをサンドボックスワークスペース(.../skills)にミラーし、
そこから読み取れるようにします。"rw" では、ワークスペース内のSkillsは
/workspace/skills から読み取れます。
カスタムBind mounts
agents.defaults.sandbox.docker.binds は追加のホストディレクトリをコンテナにmountします。
形式: host:container:mode(例: "/home/user/source:/source:rw")。
グローバルbindとagentごとのbindは、置き換えではなくマージされます。scope: "shared" では、agentごとのbindは無視されます。
agents.defaults.sandbox.browser.binds は追加のホストディレクトリをサンドボックスブラウザーコンテナのみにmountします。
- 設定されている場合(
[]を含む)、ブラウザーコンテナではagents.defaults.sandbox.docker.bindsを置き換えます。 - 省略されている場合、ブラウザーコンテナは
agents.defaults.sandbox.docker.bindsにフォールバックします(後方互換)。
- bindはサンドボックスファイルシステムを迂回します: 設定したモード(
:roまたは:rw)でホストパスを公開します。 - OpenClawは危険なbindソース(例:
docker.sock、/etc、/proc、/sys、/dev、およびそれらを公開しうる親mount)をブロックします。 - OpenClawは
~/.aws、~/.cargo、~/.config、~/.docker、~/.gnupg、~/.netrc、~/.npm、~/.sshなどの一般的なホームディレクトリ認証情報rootもブロックします。 - bind検証は単なる文字列一致ではありません。OpenClawはソースパスを正規化し、その後で最も深い既存祖先を通して再解決してから、ブロック対象パスと許可rootを再チェックします。
- つまり、最終リーフがまだ存在しなくても、symlink親を使ったエスケープは安全側で失敗します。例:
run-linkがそこを指している場合、/workspace/run-link/new-fileは依然として/var/run/...として解決されます。 - 許可ソースrootも同じ方法で正規化されるため、symlink解決前はallowlist内に見えるだけのパスでも、
outside allowed rootsとして拒否されます。 - 機密性の高いmount(secrets、SSHキー、サービス認証情報)は、絶対に必要でない限り
:roにするべきです。 - ワークスペースへの読み取りアクセスだけが必要なら、
workspaceAccess: "ro"と組み合わせてください。bindモードは独立したままです。 - bindとツールポリシーおよびelevated execの相互作用については、Sandbox vs Tool Policy vs Elevated を参照してください。
イメージ + セットアップ
デフォルトDockerイメージ:openclaw-sandbox:bookworm-slim
一度だけビルドします:
sandbox.docker.setupCommand 経由でインストールしてください(ネットワークegress + 書き込み可能なroot +
rootユーザーが必要です)。
curl、jq、nodejs、python3、git などの一般的なツールを含む、より実用的なサンドボックスイメージが必要な場合は、次をビルドします:
agents.defaults.sandbox.docker.image を
openclaw-sandbox-common:bookworm-slim に設定します。
サンドボックスブラウザーイメージ:
agents.defaults.sandbox.docker.network で上書きできます。
同梱のサンドボックスブラウザーイメージは、コンテナ化ワークロード向けに保守的な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-3d-apis--disable-gpu--disable-dev-shm-usage--disable-background-networking--disable-extensions--disable-features=TranslateUI--disable-breakpad--disable-crash-reporter--disable-software-rasterizer--no-zygote--metrics-recording-only--renderer-process-limit=2noSandboxが有効な場合は--no-sandboxと--disable-setuid-sandbox。- 3つのgraphics hardeningフラグ(
--disable-3d-apis、--disable-software-rasterizer、--disable-gpu)は任意であり、 コンテナに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のデフォルトを維持します。
browser.extraArgs を使って追加の起動フラグを付加します。
セキュリティデフォルト:
network: "host"はブロックされます。network: "container:<id>"はデフォルトでブロックされます(namespace joinバイパスのリスク)。- 緊急時のoverride:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true。
scripts/docker/setup.sh がサンドボックス設定をブートストラップできます。
この経路を有効にするには OPENCLAW_SANDBOX=1(または true/yes/on)を設定します。
ソケット位置は OPENCLAW_DOCKER_SOCKET で上書きできます。完全なセットアップとenv
リファレンス: Docker
setupCommand(1回限りのコンテナセットアップ)
setupCommand は、サンドボックスコンテナ作成後に1回だけ実行されます(毎回ではありません)。
コンテナ内で sh -lc により実行されます。
パス:
- グローバル:
agents.defaults.sandbox.docker.setupCommand - agentごと:
agents.list[].sandbox.docker.setupCommand
- デフォルトの
docker.networkは"none"(egressなし)なので、パッケージインストールは失敗します。 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(またはカスタムイメージ)を使ってください。
ツールポリシー + エスケープハッチ
ツールのallow/denyポリシーは、サンドボックスルールより前に引き続き適用されます。ツールがグローバルまたはagent単位で拒否されている場合、サンドボックス化しても復活しません。tools.elevated は、exec をサンドボックス外で実行するための明示的なエスケープハッチです(デフォルトは gateway、execターゲットが node の場合は node)。
/exec ディレクティブは認可済み送信者にのみ適用され、sessionごとに永続化されます。exec を完全に無効化したい場合は、
ツールポリシーdenyを使ってください(Sandbox vs Tool Policy vs Elevated を参照)。
デバッグ:
- 有効なサンドボックスモード、ツールポリシー、および修正用設定キーを確認するには
openclaw sandbox explainを使用します。 - 「なぜこれがブロックされるのか?」という理解のために、Sandbox vs Tool Policy vs Elevated を参照してください。 制限は厳しく保ってください。
マルチエージェント上書き
各agentはサンドボックスとツールを上書きできます:agents.list[].sandbox と agents.list[].tools(加えてサンドボックスツールポリシー用の agents.list[].tools.sandbox.tools)。
優先順位については Multi-Agent Sandbox & Tools を参照してください。
最小の有効化例
関連ドキュメント
- OpenShell — 管理されたサンドボックスバックエンドのセットアップ、ワークスペースモード、および設定リファレンス
- Sandbox Configuration
- Sandbox vs Tool Policy vs Elevated — 「なぜこれがブロックされるのか?」のデバッグ
- Multi-Agent Sandbox & Tools — agentごとの上書きと優先順位
- Security