Sandboxing
OpenClaw dapat menjalankan tool di dalam backend sandbox untuk mengurangi dampak jika terjadi masalah. Ini opsional dan dikendalikan oleh konfigurasi (agents.defaults.sandbox atau
agents.list[].sandbox). Jika sandboxing dimatikan, tool berjalan di host.
Gateway tetap berjalan di host; eksekusi tool berjalan di sandbox terisolasi
saat diaktifkan.
Ini bukan batas keamanan yang sempurna, tetapi secara nyata membatasi
akses filesystem dan proses saat model melakukan sesuatu yang keliru.
Apa yang di-sandbox
- Eksekusi tool (
exec,read,write,edit,apply_patch,process, dll.). - Browser sandbox opsional (
agents.defaults.sandbox.browser).- Secara default, browser sandbox memulai otomatis (memastikan CDP dapat dijangkau) saat tool browser membutuhkannya.
Konfigurasikan melalui
agents.defaults.sandbox.browser.autoStartdanagents.defaults.sandbox.browser.autoStartTimeoutMs. - Secara default, container browser sandbox menggunakan jaringan Docker khusus (
openclaw-sandbox-browser) alih-alih jaringanbridgeglobal. Konfigurasikan denganagents.defaults.sandbox.browser.network. agents.defaults.sandbox.browser.cdpSourceRangeopsional membatasi ingress CDP di tepi container dengan allowlist CIDR (misalnya172.21.0.1/32).- Akses observer noVNC dilindungi kata sandi secara default; OpenClaw mengeluarkan URL token singkat yang menyajikan halaman bootstrap lokal dan membuka noVNC dengan kata sandi di fragmen URL (bukan log query/header).
agents.defaults.sandbox.browser.allowHostControlmemungkinkan sesi sandbox menargetkan browser host secara eksplisit.- Allowlist opsional membatasi
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
- Secara default, browser sandbox memulai otomatis (memastikan CDP dapat dijangkau) saat tool browser membutuhkannya.
Konfigurasikan melalui
- Proses Gateway itu sendiri.
- Tool apa pun yang secara eksplisit diizinkan berjalan di luar sandbox (misalnya
tools.elevated).- Elevated exec melewati sandboxing dan menggunakan jalur escape yang dikonfigurasi (
gatewaysecara default, ataunodesaat target exec adalahnode). - Jika sandboxing dimatikan,
tools.elevatedtidak mengubah eksekusi (sudah berjalan di host). Lihat Elevated Mode.
- Elevated exec melewati sandboxing dan menggunakan jalur escape yang dikonfigurasi (
Mode
agents.defaults.sandbox.mode mengontrol kapan sandboxing digunakan:
"off": tanpa sandboxing."non-main": sandbox hanya sesi non-main (default jika Anda ingin chat normal berjalan di host)."all": setiap sesi berjalan di sandbox. Catatan:"non-main"didasarkan padasession.mainKey(default"main"), bukan agent id. Sesi grup/channel menggunakan key mereka sendiri, sehingga dihitung sebagai non-main dan akan di-sandbox.
Scope
agents.defaults.sandbox.scope mengontrol berapa banyak container yang dibuat:
"agent"(default): satu container per agent."session": satu container per sesi."shared": satu container dibagi oleh semua sesi yang di-sandbox.
Backend
agents.defaults.sandbox.backend mengontrol runtime mana yang menyediakan sandbox:
"docker"(default saat sandboxing diaktifkan): runtime sandbox lokal berbasis Docker."ssh": runtime sandbox remote generik berbasis SSH."openshell": runtime sandbox berbasis OpenShell.
agents.defaults.sandbox.ssh.
Config khusus OpenShell berada di plugins.entries.openshell.config.
Memilih backend
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Tempat berjalan | Container lokal | Host apa pun yang dapat diakses via SSH | Sandbox terkelola OpenShell |
| Penyiapan | scripts/sandbox-setup.sh | SSH key + host target | Plugin OpenShell diaktifkan |
| Model workspace | Bind-mount atau salin | Remote-canonical (seed sekali) | mirror atau remote |
| Kontrol jaringan | docker.network (default: none) | Bergantung pada host remote | Bergantung pada OpenShell |
| Browser sandbox | Didukung | Tidak didukung | Belum didukung |
| Bind mount | docker.binds | T/A | T/A |
| Terbaik untuk | Dev lokal, isolasi penuh | Memindahkan beban ke mesin remote | Sandbox remote terkelola dengan sinkronisasi dua arah opsional |
Backend Docker
Sandboxing dimatikan secara default. Jika Anda mengaktifkan sandboxing dan tidak memilih backend, OpenClaw menggunakan backend Docker. Ia menjalankan tool dan browser sandbox secara lokal melalui socket daemon Docker (/var/run/docker.sock). Isolasi container sandbox
ditentukan oleh namespace Docker.
Batasan Docker-out-of-Docker (DooD):
Jika Anda men-deploy OpenClaw Gateway sendiri sebagai container Docker, ia mengorkestrasi container sandbox sejajar menggunakan socket Docker milik host (DooD). Ini memperkenalkan batasan pemetaan path tertentu:
- Config Memerlukan Path Host: Konfigurasi
workspacediopenclaw.jsonHARUS berisi path absolut milik Host (misalnya/home/user/.openclaw/workspaces), bukan path internal container Gateway. Saat OpenClaw meminta daemon Docker untuk memunculkan sandbox, daemon mengevaluasi path relatif terhadap namespace OS Host, bukan namespace Gateway. - Paritas FS Bridge (Peta Volume Identik): Proses native OpenClaw Gateway juga menulis file heartbeat dan bridge ke direktori
workspace. Karena Gateway mengevaluasi string yang sama persis (path host) dari dalam lingkungan container-nya sendiri, deployment Gateway HARUS menyertakan peta volume identik yang menautkan namespace host secara native (-v /home/user/.openclaw:/home/user/.openclaw).
EACCES saat mencoba menulis heartbeat di dalam lingkungan container karena string path yang sepenuhnya terkualifikasi itu tidak ada secara native.
Backend SSH
Gunakanbackend: "ssh" saat Anda ingin OpenClaw men-sandbox exec, tool file, dan pembacaan media pada
mesin apa pun yang dapat diakses melalui SSH.
- OpenClaw membuat root remote per-scope di bawah
sandbox.ssh.workspaceRoot. - Pada penggunaan pertama setelah create atau recreate, OpenClaw melakukan seed workspace remote dari workspace lokal satu kali.
- Setelah itu,
exec,read,write,edit,apply_patch, pembacaan media prompt, dan staging media masuk berjalan langsung terhadap workspace remote melalui SSH. - OpenClaw tidak menyinkronkan perubahan remote kembali ke workspace lokal secara otomatis.
identityFile,certificateFile,knownHostsFile: gunakan file lokal yang sudah ada dan teruskan melalui config OpenSSH.identityData,certificateData,knownHostsData: gunakan string inline atau SecretRef. OpenClaw me-resolve-nya melalui snapshot runtime secrets normal, menuliskannya ke file sementara dengan0600, lalu menghapusnya saat sesi SSH berakhir.- Jika
*Filedan*Datakeduanya diatur untuk item yang sama,*Datamenang untuk sesi SSH tersebut.
- Edit lokal host yang dilakukan di luar OpenClaw setelah langkah seed tidak terlihat di remote sampai Anda membuat ulang sandbox.
openclaw sandbox recreatemenghapus root remote per-scope dan melakukan seed lagi dari lokal pada penggunaan berikutnya.- Browser sandbox tidak didukung pada backend SSH.
- Pengaturan
sandbox.docker.*tidak berlaku untuk backend SSH.
Backend OpenShell
Gunakanbackend: "openshell" saat Anda ingin OpenClaw men-sandbox tool dalam
lingkungan remote yang dikelola OpenShell. Untuk panduan penyiapan lengkap, referensi
konfigurasi, dan perbandingan mode workspace, lihat
halaman OpenShell khusus.
OpenShell menggunakan kembali transport SSH inti dan bridge filesystem remote yang sama seperti
backend SSH generik, serta menambahkan lifecycle khusus OpenShell
(sandbox create/get/delete, sandbox ssh-config) ditambah mode workspace
mirror opsional.
mirror(default): workspace lokal tetap kanonis. OpenClaw menyinkronkan file lokal ke OpenShell sebelum exec dan menyinkronkan workspace remote kembali setelah exec.remote: workspace OpenShell menjadi kanonis setelah sandbox dibuat. OpenClaw melakukan seed workspace remote satu kali dari workspace lokal, lalu tool file dan exec berjalan langsung terhadap sandbox remote tanpa menyinkronkan perubahan kembali.
- OpenClaw meminta config SSH khusus sandbox dari OpenShell melalui
openshell sandbox ssh-config <name>. - Core menulis config SSH itu ke file sementara, membuka sesi SSH, dan menggunakan kembali bridge filesystem remote yang sama seperti
backend: "ssh". - Dalam mode
mirrorhanya lifecycle yang berbeda: sinkronkan lokal ke remote sebelum exec, lalu sinkronkan kembali setelah exec.
- browser sandbox belum didukung
sandbox.docker.bindstidak didukung pada backend OpenShell- knob runtime khusus Docker di bawah
sandbox.docker.*tetap hanya berlaku untuk backend Docker
Mode workspace
OpenShell memiliki dua model workspace. Ini adalah bagian yang paling penting dalam praktiknya.mirror
Gunakan plugins.entries.openshell.config.mode: "mirror" saat Anda ingin workspace lokal tetap kanonis.
Perilaku:
- Sebelum
exec, OpenClaw menyinkronkan workspace lokal ke sandbox OpenShell. - Setelah
exec, OpenClaw menyinkronkan workspace remote kembali ke workspace lokal. - Tool file tetap beroperasi melalui bridge sandbox, tetapi workspace lokal tetap menjadi sumber kebenaran di antara giliran.
- Anda mengedit file secara lokal di luar OpenClaw dan ingin perubahan itu otomatis muncul di sandbox
- Anda ingin sandbox OpenShell berperilaku semirip mungkin dengan backend Docker
- Anda ingin workspace host mencerminkan penulisan sandbox setelah setiap giliran exec
- ada biaya sinkronisasi tambahan sebelum dan sesudah exec
remote
Gunakan plugins.entries.openshell.config.mode: "remote" saat Anda ingin workspace OpenShell menjadi kanonis.
Perilaku:
- Saat sandbox pertama kali dibuat, OpenClaw melakukan seed workspace remote dari workspace lokal satu kali.
- Setelah itu,
exec,read,write,edit, danapply_patchberoperasi langsung terhadap workspace OpenShell remote. - OpenClaw tidak menyinkronkan perubahan remote kembali ke workspace lokal setelah exec.
- Pembacaan media saat prompt tetap berfungsi karena tool file dan media membaca melalui bridge sandbox alih-alih mengasumsikan path host lokal.
- Transport menggunakan SSH ke sandbox OpenShell yang dikembalikan oleh
openshell sandbox ssh-config.
- Jika Anda mengedit file di host di luar OpenClaw setelah langkah seed, sandbox remote tidak akan melihat perubahan tersebut secara otomatis.
- Jika sandbox dibuat ulang, workspace remote akan di-seed dari workspace lokal lagi.
- Dengan
scope: "agent"atauscope: "shared", workspace remote tersebut dibagikan pada scope yang sama.
- sandbox seharusnya hidup terutama di sisi OpenShell remote
- Anda ingin overhead sinkronisasi per giliran lebih rendah
- Anda tidak ingin edit lokal host diam-diam menimpa status sandbox remote
mirror jika Anda menganggap sandbox sebagai lingkungan eksekusi sementara.
Pilih remote jika Anda menganggap sandbox sebagai workspace yang sebenarnya.
Lifecycle OpenShell
Sandbox OpenShell tetap dikelola melalui lifecycle sandbox normal:openclaw sandbox listmenampilkan runtime OpenShell maupun runtime Dockeropenclaw sandbox recreatemenghapus runtime saat ini dan membiarkan OpenClaw membuatnya lagi pada penggunaan berikutnya- logika prune juga sadar-backend
remote, recreate sangat penting:
- recreate menghapus workspace remote kanonis untuk scope tersebut
- penggunaan berikutnya melakukan seed workspace remote baru dari workspace lokal
mirror, recreate terutama mereset lingkungan eksekusi remote
karena workspace lokal tetap kanonis.
Akses workspace
agents.defaults.sandbox.workspaceAccess mengontrol apa yang dapat dilihat sandbox:
"none"(default): tool melihat workspace sandbox di bawah~/.openclaw/sandboxes."ro": me-mount workspace agent sebagai read-only di/agent(menonaktifkanwrite/edit/apply_patch)."rw": me-mount workspace agent sebagai read/write di/workspace.
- mode
mirrortetap menggunakan workspace lokal sebagai sumber kanonis di antara giliran exec - mode
remotemenggunakan workspace OpenShell remote sebagai sumber kanonis setelah seed awal workspaceAccess: "ro"dan"none"tetap membatasi perilaku penulisan dengan cara yang sama
media/inbound/*).
Catatan Skills: tool read berakar di sandbox. Dengan workspaceAccess: "none",
OpenClaw mencerminkan Skills yang memenuhi syarat ke workspace sandbox (.../skills) sehingga
dapat dibaca. Dengan "rw", Skills workspace dapat dibaca dari
/workspace/skills.
Bind mount kustom
agents.defaults.sandbox.docker.binds me-mount direktori host tambahan ke dalam container.
Format: host:container:mode (misalnya "/home/user/source:/source:rw").
Bind global dan per-agent digabungkan (bukan diganti). Pada scope: "shared", bind per-agent diabaikan.
agents.defaults.sandbox.browser.binds me-mount direktori host tambahan ke dalam container browser sandbox saja.
- Saat diatur (termasuk
[]), ini menggantikanagents.defaults.sandbox.docker.bindsuntuk container browser. - Saat dihilangkan, container browser fallback ke
agents.defaults.sandbox.docker.binds(kompatibel ke belakang).
- Bind melewati filesystem sandbox: mereka mengekspos path host dengan mode apa pun yang Anda atur (
:roatau:rw). - OpenClaw memblokir sumber bind berbahaya (misalnya:
docker.sock,/etc,/proc,/sys,/dev, dan parent mount yang akan mengeksposnya). - OpenClaw juga memblokir root kredensial direktori home yang umum seperti
~/.aws,~/.cargo,~/.config,~/.docker,~/.gnupg,~/.netrc,~/.npm, dan~/.ssh. - Validasi bind bukan hanya pencocokan string. OpenClaw menormalkan path sumber, lalu me-resolve-nya lagi melalui ancestor terdalam yang ada sebelum memeriksa ulang path yang diblokir dan root yang diizinkan.
- Ini berarti escape parent-symlink tetap fail-closed bahkan ketika leaf akhir belum ada. Contoh:
/workspace/run-link/new-filetetap di-resolve sebagai/var/run/...jikarun-linkmenunjuk ke sana. - Root sumber yang diizinkan juga dikanonisasi dengan cara yang sama, jadi path yang hanya tampak berada di dalam allowlist sebelum resolusi symlink tetap ditolak sebagai
outside allowed roots. - Mount sensitif (secret, SSH key, service credential) sebaiknya
:rokecuali benar-benar diperlukan. - Gabungkan dengan
workspaceAccess: "ro"jika Anda hanya membutuhkan akses baca ke workspace; mode bind tetap independen. - Lihat Sandbox vs Tool Policy vs Elevated untuk cara bind berinteraksi dengan tool policy dan elevated exec.
Image + penyiapan
Image Docker default:openclaw-sandbox:bookworm-slim
Build sekali:
sandbox.docker.setupCommand (memerlukan network egress + root yang dapat ditulis +
pengguna root).
Jika Anda menginginkan image sandbox yang lebih fungsional dengan tool umum (misalnya
curl, jq, nodejs, python3, git), build:
agents.defaults.sandbox.docker.image ke
openclaw-sandbox-common:bookworm-slim.
Image browser sandbox:
agents.defaults.sandbox.docker.network.
Image browser sandbox bawaan juga menerapkan default startup Chromium yang konservatif
untuk workload dalam container. Default container saat ini mencakup:
--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=2--no-sandboxdan--disable-setuid-sandboxsaatnoSandboxdiaktifkan.- Tiga flag hardening grafis (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) bersifat opsional dan berguna saat container tidak memiliki dukungan GPU. AturOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0jika workload Anda memerlukan WebGL atau fitur browser/3D lainnya. --disable-extensionsdiaktifkan secara default dan dapat dinonaktifkan denganOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0untuk alur yang bergantung pada extension.--renderer-process-limit=2dikendalikan olehOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, di mana0mempertahankan default Chromium.
browser.extraArgs untuk menambahkan flag startup tambahan.
Default keamanan:
network: "host"diblokir.network: "container:<id>"diblokir secara default (risiko bypass namespace join).- Override break-glass:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
scripts/docker/setup.sh dapat melakukan bootstrap config sandbox.
Atur OPENCLAW_SANDBOX=1 (atau true/yes/on) untuk mengaktifkan jalur tersebut. Anda dapat
mengoverride lokasi socket dengan OPENCLAW_DOCKER_SOCKET. Referensi env dan penyiapan lengkap:
Docker.
setupCommand (penyiapan container satu kali)
setupCommand berjalan sekali setelah container sandbox dibuat (bukan pada setiap run).
Ia dieksekusi di dalam container melalui sh -lc.
Path:
- Global:
agents.defaults.sandbox.docker.setupCommand - Per-agent:
agents.list[].sandbox.docker.setupCommand
- Default
docker.networkadalah"none"(tanpa egress), sehingga instalasi package akan gagal. docker.network: "container:<id>"memerlukandangerouslyAllowContainerNamespaceJoin: truedan hanya untuk break-glass.readOnlyRoot: truemencegah penulisan; aturreadOnlyRoot: falseatau gunakan custom image.userharus root untuk instalasi package (hilangkanuseratau aturuser: "0:0").- Sandbox exec tidak mewarisi
process.envhost. Gunakanagents.defaults.sandbox.docker.env(atau custom image) untuk API key skill.
Tool policy + jalur escape
Kebijakan allow/deny tool tetap berlaku sebelum aturan sandbox. Jika sebuah tool ditolak secara global atau per-agent, sandboxing tidak mengaktifkannya kembali.tools.elevated adalah jalur escape eksplisit yang menjalankan exec di luar sandbox (gateway secara default, atau node saat target exec adalah node).
Directive /exec hanya berlaku untuk pengirim yang diotorisasi dan bertahan per sesi; untuk menonaktifkan
exec secara keras, gunakan deny tool policy (lihat Sandbox vs Tool Policy vs Elevated).
Debugging:
- Gunakan
openclaw sandbox explainuntuk memeriksa mode sandbox efektif, tool policy, dan kunci config perbaikan. - Lihat Sandbox vs Tool Policy vs Elevated untuk model mental “mengapa ini diblokir?”. Pertahankan tetap terkunci.
Override multi-agent
Setiap agent dapat mengoverride sandbox + tool:agents.list[].sandbox dan agents.list[].tools (ditambah agents.list[].tools.sandbox.tools untuk tool policy sandbox).
Lihat Multi-Agent Sandbox & Tools untuk prioritas.
Contoh aktivasi minimal
Dokumentasi terkait
- OpenShell — penyiapan backend sandbox terkelola, mode workspace, dan referensi konfigurasi
- Konfigurasi Sandbox
- Sandbox vs Tool Policy vs Elevated — debugging “mengapa ini diblokir?”
- Sandbox & Tools Multi-Agent — override per-agent dan prioritas
- Keamanan