Gateway
Sandboxing
OpenClaw dapat menjalankan eksekusi alat di dalam backend sandbox untuk mengurangi radius dampak. Sandboxing dinonaktifkan secara default dan dikendalikan oleh agents.defaults.sandbox (global) atau agents.list[].sandbox (per agen). Proses Gateway selalu tetap berada di host; hanya eksekusi alat yang berpindah ke sandbox saat diaktifkan.
Apa yang dimasukkan ke sandbox
- Eksekusi alat:
exec,read,write,edit,apply_patch,process, dan sebagainya. - Browser dalam sandbox opsional (
agents.defaults.sandbox.browser).
Tidak dimasukkan ke sandbox:
- Proses Gateway itu sendiri.
- Alat apa pun yang secara eksplisit diizinkan berjalan di luar sandbox melalui
tools.elevated. Eksekusi dengan hak istimewa yang ditingkatkan melewati sandboxing dan berjalan pada jalur keluar yang dikonfigurasi (gatewaysecara default, ataunodesaat target eksekusi adalahnode). Jika sandboxing dinonaktifkan,tools.elevatedtidak mengubah apa pun karena eksekusi sudah berjalan di host. Lihat Mode dengan Hak Istimewa yang Ditingkatkan.
Mode, cakupan, dan backend
Tiga pengaturan independen mengendalikan perilaku sandbox:
| Pengaturan | Kunci | Nilai | Default |
|---|---|---|---|
| Mode | agents.defaults.sandbox.mode |
off, non-main, all |
off |
| Cakupan | agents.defaults.sandbox.scope |
agent, session, shared |
agent |
| Backend | agents.defaults.sandbox.backend |
docker, ssh, openshell |
docker |
Mode mengendalikan kapan sandboxing diterapkan:
off: tanpa sandboxing.non-main: masukkan setiap sesi ke sandbox kecuali sesi utama agen. Kunci sesi utama selaluagent:<agentId>:main(atauglobalsaatsession.scopeadalah"global"); kunci ini tidak dapat dikonfigurasi. Sesi grup/saluran menggunakan kuncinya sendiri, sehingga selalu dianggap bukan sesi utama dan dimasukkan ke sandbox.all: setiap sesi berjalan di dalam sandbox.
Cakupan mengendalikan jumlah kontainer/lingkungan yang dibuat:
agent: satu kontainer per agen.session: satu kontainer per sesi.shared: satu kontainer yang digunakan bersama oleh semua sesi dalam sandbox (penggantian per agendocker/ssh/browserdiabaikan dalam cakupan ini).
Backend mengendalikan runtime yang mengeksekusi alat dalam sandbox. Konfigurasi khusus SSH berada di bawah agents.defaults.sandbox.ssh; konfigurasi khusus OpenShell berada di bawah plugins.entries.openshell.config.
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Tempat dijalankan | Kontainer lokal | Host apa pun yang dapat diakses melalui SSH | Sandbox yang dikelola OpenShell |
| Penyiapan | scripts/sandbox-setup.sh |
Kunci SSH + host target | Plugin OpenShell diaktifkan |
| Model ruang kerja | Bind mount atau salinan | Kanonis jarak jauh (disemai sekali) | mirror atau remote |
| Kontrol jaringan | docker.network (default: tidak ada) |
Bergantung pada host jarak jauh | Bergantung pada OpenShell |
| Sandbox browser | Didukung | Tidak didukung | Belum didukung |
| Bind mount | docker.binds |
Tidak berlaku | Tidak berlaku |
| Paling sesuai untuk | Pengembangan lokal, isolasi penuh | Memindahkan beban ke mesin jarak jauh | Sandbox jarak jauh terkelola dengan sinkronisasi dua arah opsional |
Backend Docker
Docker adalah backend default setelah sandboxing diaktifkan. Backend ini menjalankan alat dan browser sandbox secara lokal melalui soket daemon Docker (/var/run/docker.sock); isolasi berasal dari namespace Docker.
Default: network: "none" (tanpa akses keluar), readOnlyRoot: true, capDrop: ["ALL"], image openclaw-sandbox:bookworm-slim.
Untuk mengekspos GPU host, atur agents.defaults.sandbox.docker.gpus (atau penggantian per agen) ke nilai seperti "all" atau "device=GPU-uuid". Nilai ini diteruskan ke flag --gpus milik Docker dan memerlukan runtime host yang kompatibel seperti NVIDIA Container Toolkit.
Browser dalam sandbox
- Browser sandbox dimulai secara otomatis (memastikan CDP dapat dijangkau) saat alat browser membutuhkannya. Konfigurasikan melalui
agents.defaults.sandbox.browser.autoStart(defaulttrue) danautoStartTimeoutMs(default 12 dtk). - Kontainer browser sandbox menggunakan jaringan Docker khusus (
openclaw-sandbox-browser), bukan jaringan globalbridge. Konfigurasikan denganagents.defaults.sandbox.browser.network. agents.defaults.sandbox.browser.cdpSourceRangemembatasi akses masuk CDP pada tepi kontainer dengan daftar izin CIDR (misalnya172.21.0.1/32).- Akses pengamat noVNC dilindungi kata sandi secara default; OpenClaw menghasilkan URL token berumur pendek yang menyajikan halaman bootstrap lokal dan membuka noVNC dengan kata sandi di fragmen URL (bukan string kueri atau log header).
agents.defaults.sandbox.browser.allowHostControl(defaultfalse) memungkinkan sesi dalam sandbox menargetkan browser host secara eksplisit.- Daftar izin opsional membatasi
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
Backend SSH
Gunakan backend: "ssh" untuk memasukkan exec, alat berkas, dan pembacaan media ke sandbox pada mesin apa pun yang dapat diakses melalui 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", // Atau gunakan SecretRefs / konten sebaris sebagai pengganti berkas lokal: // 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" }, }, }, }, },}Default: command: "ssh", workspaceRoot: "/tmp/openclaw-sandboxes", strictHostKeyChecking: true, updateHostKeys: true.
- Siklus hidup: OpenClaw membuat root jarak jauh per cakupan di bawah
sandbox.ssh.workspaceRoot. Pada penggunaan pertama setelah dibuat atau dibuat ulang, OpenClaw menyemai ruang kerja jarak jauh tersebut dari ruang kerja lokal satu kali. Setelah itu,exec,read,write,edit,apply_patch, pembacaan media prompt, dan penyiapan media masuk berjalan langsung terhadap ruang kerja jarak jauh melalui SSH. OpenClaw tidak secara otomatis menyinkronkan perubahan jarak jauh kembali ke ruang kerja lokal. - Materi autentikasi:
identityFile/certificateFile/knownHostsFilemerujuk ke berkas lokal yang ada.identityData/certificateData/knownHostsDatamenerima string sebaris atau SecretRefs, yang diselesaikan melalui snapshot runtime rahasia normal, ditulis ke berkas sementara dengan mode0600, dan dihapus saat sesi SSH berakhir. Jika varian*Filedan*Dataditetapkan untuk item yang sama,*Databerlaku untuk sesi tersebut. - Konsekuensi kanonis jarak jauh: ruang kerja SSH jarak jauh menjadi status sandbox yang sebenarnya setelah penyemaian awal. Perubahan lokal host yang dibuat di luar OpenClaw setelah langkah penyemaian tidak terlihat dari jarak jauh hingga Anda membuat ulang sandbox.
openclaw sandbox recreatemenghapus root jarak jauh per cakupan dan menyemai ulang dari lokal pada penggunaan berikutnya. Sandboxing browser tidak didukung pada backend ini, dan pengaturansandbox.docker.*tidak berlaku untuk backend ini.
Backend OpenShell
Gunakan backend: "openshell" untuk memasukkan alat ke sandbox dalam lingkungan jarak jauh yang dikelola OpenShell. OpenShell menggunakan kembali transportasi SSH dan jembatan sistem berkas jarak jauh yang sama seperti backend SSH generik, serta menambahkan siklus hidup OpenShell (sandbox create/get/delete/ssh-config) dan mode sinkronisasi ruang kerja mirror opsional.
{ 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" (default) mempertahankan ruang kerja lokal sebagai kanonis: OpenClaw menyinkronkan ruang kerja lokal ke sandbox sebelum exec dan menyinkronkannya kembali setelahnya. mode: "remote" menginisialisasi ruang kerja jarak jauh satu kali dari ruang kerja lokal, lalu menjalankan exec/read/write/edit/apply_patch langsung pada ruang kerja jarak jauh tanpa menyinkronkannya kembali; perubahan lokal setelah inisialisasi tidak terlihat hingga Anda melakukan openclaw sandbox recreate. Dalam scope: "agent" atau scope: "shared", ruang kerja jarak jauh tersebut dibagikan pada cakupan yang sama. Keterbatasan saat ini: browser sandbox belum didukung, dan sandbox.docker.binds tidak berlaku untuk backend ini.
openclaw sandbox list/recreate/prune semuanya memperlakukan runtime OpenShell sama seperti runtime Docker; logika prune menyadari backend.
Untuk prasyarat lengkap, referensi konfigurasi, perbandingan mode ruang kerja, dan detail siklus hidup, lihat OpenShell.
Akses ruang kerja
agents.defaults.sandbox.workspaceAccess mengontrol apa yang dapat dilihat sandbox:
| Nilai | Perilaku |
|---|---|
none (default) |
Alat melihat ruang kerja sandbox terisolasi di bawah ~/.openclaw/sandboxes. |
ro |
Memasang ruang kerja agen hanya-baca di /agent (menonaktifkan write/edit/apply_patch). |
rw |
Memasang ruang kerja agen baca/tulis di /workspace. |
Dengan backend OpenShell, mode mirror tetap menggunakan ruang kerja lokal sebagai sumber kanonis di antara giliran eksekusi, mode remote menggunakan ruang kerja OpenShell jarak jauh sebagai kanonis setelah inisialisasi awal, dan workspaceAccess: "ro"/"none" tetap membatasi perilaku penulisan dengan cara yang sama.
Media masuk disalin ke ruang kerja sandbox yang aktif (media/inbound/*).
Beberapa folder untuk satu agen
Gunakan pemasangan bind Docker ketika satu agen dalam sandbox memerlukan lebih dari ruang kerja utamanya. Setiap entri memetakan folder host ke jalur kontainer dengan mode akses eksplisit:
host-directory:container-directory:rohost-directory:container-directory:rwromenjadikan folder yang dipasang hanya-baca di dalam sandbox.rwmemungkinkan alat dan proses dalam sandbox mengubah folder host.- Jalur kontainer adalah jalur yang digunakan agen. Jalur host tidak diekspos secara otomatis.
Contoh ini memberi agen research ruang kerja utama yang dapat ditulis, materi referensi hanya-baca di /reference, dan folder keluaran terpisah yang dapat ditulis di /drafts:
{ agents: { defaults: { sandbox: { mode: "all", scope: "agent", }, }, list: [ { id: "research", workspace: "/srv/openclaw/research-workspace", sandbox: { workspaceAccess: "rw", docker: { binds: ["/srv/shared/reference:/reference:ro", "/srv/shared/drafts:/drafts:rw"], // Diperlukan karena sumber-sumber ini berada di luar ruang kerja agen. dangerouslyAllowExternalBindSources: true, }, }, }, ], },}workspaceAccess dan mode bind bersifat independen:
| Pengaturan | Mengontrol |
|---|---|
workspaceAccess: "none" |
Menggunakan ruang kerja sandbox terisolasi; tidak mengekspos ruang kerja agen. |
workspaceAccess: "ro" |
Memasang ruang kerja agen hanya-baca di /agent. |
workspaceAccess: "rw" |
Memasang ruang kerja agen baca/tulis di /workspace. |
Entri docker.binds :ro/:rw |
Hanya mengontrol folder host tambahan tersebut pada jalur kontainer yang dikonfigurasi. |
Mengubah workspaceAccess tidak mengubah bind tambahan dari ro menjadi rw, atau sebaliknya. docker.binds global dan per agen digabungkan. Pertahankan scope: "agent" atau "session" untuk bind per agen; scope: "shared" mengabaikan semua penggantian Docker per agen dan hanya menggunakan bind global.
Pemasangan bind merupakan batas beberapa folder yang didukung karena Docker membentuk tampilan sistem berkas kontainer dengan isolasi pemasangan, dan mode ro/rw berlaku untuk setiap proses dalam sandbox. Batas tersebut mencakup exec, alat sistem berkas, proses anak, dan pustaka tanpa menduplikasi pemeriksaan otorisasi jalur di setiap jalur kode OpenClaw. Daftar izin jalur pada sisi host tidak dapat menyediakan batas lengkap yang sama ketika shell atau dependensi yang diizinkan dapat mengakses berkas secara langsung.
dangerouslyAllowExternalBindSources yang harus diaktifkan secara eksplisit hanya mengizinkan sumber di luar akar ruang kerja. Opsi ini tidak menonaktifkan pemeriksaan OpenClaw terhadap sistem yang diblokir, kredensial, soket Docker, induk symlink, atau target yang dicadangkan. Pilih folder sekecil mungkin, gunakan ro kecuali penulisan diperlukan, dan buat ulang sandbox setelah mengubah pemasangan:
openclaw sandbox recreate --agent researchPerilaku bind lainnya
agents.defaults.sandbox.docker.binds mengonfigurasi pemasangan global. Formatnya menggunakan bentuk host:container:mode yang sama (misalnya, "/home/user/source:/source:rw").
agents.defaults.sandbox.browser.binds memasang direktori host tambahan hanya ke kontainer browser sandbox. Jika ditetapkan (termasuk []), opsi ini menggantikan docker.binds untuk kontainer browser; jika dihilangkan, kontainer browser kembali menggunakan 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"], }, }, }, ], },}Image dan penyiapan
Image Docker default: openclaw-sandbox:bookworm-slim
Bangun image default
Dari checkout sumber:
scripts/sandbox-setup.shDari instalasi npm (tidak memerlukan checkout sumber):
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"]DOCKERFILEImage default tidak menyertakan Node. Jika sebuah skill memerlukan Node (atau runtime lain), buat image khusus yang sudah menyertakannya atau instal melalui sandbox.docker.setupCommand (memerlukan akses jaringan keluar + root yang dapat ditulis + pengguna root).
OpenClaw tidak secara diam-diam mengganti dengan debian:bookworm-slim biasa ketika openclaw-sandbox:bookworm-slim tidak ada. Eksekusi sandbox yang menargetkan image default segera gagal dengan petunjuk pembangunan hingga Anda membangunnya, karena image bawaan menyertakan python3 untuk pembantu penulisan/pengeditan sandbox.
Opsional: bangun image umum
Untuk image sandbox yang lebih fungsional dengan alat umum (misalnya curl, jq, Node 24, pnpm, python3, dan git):
Dari checkout sumber:
scripts/sandbox-common-setup.shDari instalasi npm, bangun image default terlebih dahulu (lihat di atas), lalu bangun image umum di atasnya menggunakan scripts/docker/sandbox/Dockerfile.common dari repositori.
Kemudian tetapkan agents.defaults.sandbox.docker.image ke openclaw-sandbox-common:bookworm-slim.
Opsional: bangun image browser sandbox
Dari checkout sumber:
scripts/sandbox-browser-setup.shDari instalasi npm, bangun menggunakan scripts/docker/sandbox/Dockerfile.browser dari repositori.
Secara default, kontainer sandbox Docker berjalan tanpa jaringan. Ganti perilaku ini dengan agents.defaults.sandbox.docker.network.
Default Chromium browser sandbox
Image browser sandbox bawaan menerapkan flag awal Chromium yang konservatif untuk beban kerja dalam kontainer:
--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-keychain--headless=newsaatbrowser.headlessdiaktifkan.--no-sandbox --disable-setuid-sandboxsaatbrowser.noSandboxdiaktifkan.--disable-3d-apis,--disable-gpu,--disable-software-rasterizersecara default; flag penguatan grafis ini membantu kontainer tanpa dukungan GPU. AturOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0jika beban kerja Anda memerlukan WebGL atau fitur 3D lainnya.--disable-extensionssecara default; aturOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0untuk alur yang bergantung pada ekstensi.--renderer-process-limit=2secara default; dikendalikan olehOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, dengan0mempertahankan nilai default Chromium.
Jika memerlukan profil runtime yang berbeda, gunakan image browser khusus dan sediakan entrypoint Anda sendiri. Untuk profil Chromium lokal (nonkontainer), gunakan browser.extraArgs untuk menambahkan flag startup tambahan.
Default keamanan jaringan
network: "host"diblokir.network: "container:<id>"diblokir secara default (risiko bypass penggabungan namespace).- Pengabaian darurat:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
Instalasi Docker dan Gateway dalam kontainer tersedia di sini: Docker
Untuk deployment Gateway Docker, scripts/docker/setup.sh dapat melakukan bootstrap konfigurasi sandbox. Atur OPENCLAW_SANDBOX=1 (atau true/yes/on) untuk mengaktifkan jalur tersebut. Ganti lokasi soket dengan OPENCLAW_DOCKER_SOCKET. Referensi lengkap penyiapan dan lingkungan: Docker.
setupCommand (penyiapan kontainer satu kali)
setupCommand dijalankan sekali setelah kontainer sandbox dibuat (bukan pada setiap eksekusi). Perintah ini dijalankan di dalam kontainer melalui sh -lc.
Jalur:
- Global:
agents.defaults.sandbox.docker.setupCommand - Per agen:
agents.list[].sandbox.docker.setupCommand
Kendala umum
- Nilai default
docker.networkadalah"none"(tanpa akses keluar), sehingga instalasi paket akan gagal. docker.network: "container:<id>"memerlukandangerouslyAllowContainerNamespaceJoin: truedan hanya untuk penggunaan darurat.readOnlyRoot: truemencegah penulisan; aturreadOnlyRoot: falseatau buat image khusus.userharus berupa root untuk instalasi paket (hilangkanuseratau aturuser: "0:0").- Eksekusi sandbox tidak mewarisi
process.envhost. Gunakanagents.defaults.sandbox.docker.env(atau image khusus) untuk kunci API skill. - Nilai dalam
agents.defaults.sandbox.docker.envditeruskan sebagai variabel lingkungan kontainer Docker eksplisit. Siapa pun yang memiliki akses ke daemon Docker dapat memeriksanya dengan perintah metadata Docker sepertidocker inspect. Gunakan image khusus, berkas rahasia yang dipasang, atau jalur pengiriman rahasia lainnya jika paparan metadata tersebut tidak dapat diterima.
Kebijakan alat dan jalur pengabaian
Kebijakan izin/penolakan alat tetap berlaku sebelum aturan sandbox. Jika suatu alat ditolak secara global atau per agen, sandbox tidak akan mengaktifkannya kembali.
tools.elevated adalah jalur pengabaian eksplisit yang menjalankan exec di luar sandbox (gateway secara default, atau node saat target eksekusi adalah node). Direktif /exec hanya berlaku untuk pengirim yang diotorisasi dan bertahan per sesi; untuk menonaktifkan exec sepenuhnya, gunakan penolakan dalam kebijakan alat (lihat Sandbox vs Kebijakan Alat vs Elevated).
Debugging:
openclaw sandbox listmenampilkan kontainer sandbox, status, kecocokan image, usia, waktu tidak aktif, serta sesi/agen yang terkait.openclaw sandbox explain [--session <key>] [--agent <id>]memeriksa mode sandbox efektif, ruang kerja host, direktori kerja runtime, pemasangan Docker, kebijakan alat, dan kunci konfigurasi perbaikan. KolomworkspaceRoottetap menunjukkan root sandbox yang dikonfigurasi;effectiveHostWorkspaceRootmenunjukkan lokasi sebenarnya dari ruang kerja yang aktif.openclaw sandbox recreate [--all | --session <key> | --agent <id>] [--browser] [--force]menghapus kontainer/lingkungan agar dibuat ulang dengan konfigurasi saat ini pada penggunaan berikutnya.- Lihat Sandbox vs Kebijakan Alat vs Elevated untuk model mental "mengapa ini diblokir?".
Penggantian konfigurasi multiagen
Setiap agen dapat mengganti konfigurasi sandbox + alat: agents.list[].sandbox dan agents.list[].tools (serta agents.list[].tools.sandbox.tools untuk kebijakan alat sandbox). Lihat Sandbox & Alat Multiagen untuk urutan prioritas.
Contoh pengaktifan minimal
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", }, }, },}Terkait
- Sandbox & Alat Multiagen -- penggantian konfigurasi per agen dan urutan prioritas
- OpenShell -- penyiapan backend sandbox terkelola, mode ruang kerja, dan referensi konfigurasi
- Konfigurasi sandbox
- Sandbox vs Kebijakan Alat vs Elevated -- debugging "mengapa ini diblokir?"
- Keamanan