Gateway
การแซนด์บ็อกซ์
OpenClaw สามารถเรียกใช้ เครื่องมือภายในแบ็กเอนด์ sandbox เพื่อลดขอบเขตผลกระทบได้ สิ่งนี้เป็น ทางเลือก และควบคุมด้วยการกำหนดค่า (agents.defaults.sandbox หรือ agents.list[].sandbox) หากปิด sandboxing เครื่องมือจะทำงานบนโฮสต์ Gateway ยังคงอยู่บนโฮสต์ ส่วนการเรียกใช้เครื่องมือจะทำงานใน sandbox ที่แยกออกมาเมื่อเปิดใช้งาน
สิ่งที่ถูก sandbox
- การเรียกใช้เครื่องมือ (
exec,read,write,edit,apply_patch,processฯลฯ) - เบราว์เซอร์แบบ sandbox ที่เป็นทางเลือก (
agents.defaults.sandbox.browser)
รายละเอียดเบราว์เซอร์แบบ sandbox
- โดยค่าเริ่มต้น เบราว์เซอร์ sandbox จะเริ่มอัตโนมัติ (ทำให้แน่ใจว่า CDP เข้าถึงได้) เมื่อเครื่องมือเบราว์เซอร์ต้องใช้ กำหนดค่าผ่าน
agents.defaults.sandbox.browser.autoStartและagents.defaults.sandbox.browser.autoStartTimeoutMs - โดยค่าเริ่มต้น คอนเทนเนอร์เบราว์เซอร์ sandbox ใช้เครือข่าย Docker เฉพาะ (
openclaw-sandbox-browser) แทนเครือข่ายbridgeส่วนกลาง กำหนดค่าด้วยagents.defaults.sandbox.browser.network agents.defaults.sandbox.browser.cdpSourceRangeที่เป็นทางเลือกจะจำกัด CDP ingress ที่ขอบคอนเทนเนอร์ด้วยรายการอนุญาต CIDR (เช่น172.21.0.1/32)- การเข้าถึงผู้สังเกตการณ์ noVNC มีการป้องกันด้วยรหัสผ่านโดยค่าเริ่มต้น OpenClaw จะส่ง URL โทเค็นอายุสั้นที่ให้บริการหน้า bootstrap แบบ local และเปิด noVNC พร้อมรหัสผ่านใน URL fragment (ไม่ใช่ใน query/header logs)
agents.defaults.sandbox.browser.allowHostControlทำให้เซสชันที่ถูก sandbox สามารถกำหนดเป้าหมายเบราว์เซอร์ของโฮสต์ได้อย่างชัดเจน- รายการอนุญาตที่เป็นทางเลือกจะกั้น
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts
ไม่ถูก sandbox:
- โปรเซส Gateway เอง
- เครื่องมือใดๆ ที่อนุญาตอย่างชัดเจนให้ทำงานนอก sandbox (เช่น
tools.elevated)- Elevated exec ข้าม sandboxing และใช้เส้นทาง escape ที่กำหนดค่าไว้ (
gatewayโดยค่าเริ่มต้น หรือnodeเมื่อเป้าหมาย exec คือnode) - หากปิด sandboxing อยู่
tools.elevatedจะไม่เปลี่ยนการทำงาน (อยู่บนโฮสต์อยู่แล้ว) ดู โหมด Elevated
- Elevated exec ข้าม sandboxing และใช้เส้นทาง escape ที่กำหนดค่าไว้ (
โหมด
agents.defaults.sandbox.mode ควบคุมว่าจะใช้ sandboxing เมื่อใด:
off
ไม่มี sandboxing
non-main
sandbox เฉพาะเซสชันที่ ไม่ใช่ main (ค่าเริ่มต้นหากคุณต้องการให้แชตปกติอยู่บนโฮสต์)
"non-main" อิงตาม session.mainKey (ค่าเริ่มต้น "main") ไม่ใช่ agent id เซสชันกลุ่ม/ช่องทางใช้คีย์ของตัวเอง ดังนั้นจึงนับเป็น non-main และจะถูก sandbox
all
ทุกเซสชันทำงานใน sandbox
ขอบเขต
agents.defaults.sandbox.scope ควบคุมว่าจะสร้าง คอนเทนเนอร์กี่ตัว:
"agent"(ค่าเริ่มต้น): หนึ่งคอนเทนเนอร์ต่อ agent"session": หนึ่งคอนเทนเนอร์ต่อเซสชัน"shared": หนึ่งคอนเทนเนอร์ที่ใช้ร่วมกันโดยทุกเซสชันที่ถูก sandbox
แบ็กเอนด์
agents.defaults.sandbox.backend ควบคุมว่า runtime ใด ให้บริการ sandbox:
"docker"(ค่าเริ่มต้นเมื่อเปิดใช้ sandboxing): runtime sandbox ภายในเครื่องที่ใช้ Docker"ssh": runtime sandbox ระยะไกลทั่วไปที่ใช้ SSH"openshell": runtime sandbox ที่ใช้ OpenShell
การกำหนดค่าเฉพาะ SSH อยู่ภายใต้ agents.defaults.sandbox.ssh การกำหนดค่าเฉพาะ OpenShell อยู่ภายใต้ plugins.entries.openshell.config
การเลือกแบ็กเอนด์
| Docker | SSH | OpenShell | |
|---|---|---|---|
| ตำแหน่งที่ทำงาน | คอนเทนเนอร์ภายในเครื่อง | โฮสต์ใดก็ได้ที่เข้าถึงได้ด้วย SSH | sandbox ที่จัดการโดย OpenShell |
| การตั้งค่า | scripts/sandbox-setup.sh |
คีย์ SSH + โฮสต์เป้าหมาย | เปิดใช้งาน Plugin OpenShell |
| โมเดล workspace | Bind-mount หรือคัดลอก | remote-canonical (seed หนึ่งครั้ง) | mirror หรือ remote |
| การควบคุมเครือข่าย | docker.network (ค่าเริ่มต้น: none) |
ขึ้นอยู่กับโฮสต์ระยะไกล | ขึ้นอยู่กับ OpenShell |
| เบราว์เซอร์ sandbox | รองรับ | ไม่รองรับ | ยังไม่รองรับ |
| Bind mounts | docker.binds |
N/A | N/A |
| เหมาะที่สุดสำหรับ | การพัฒนา local, การแยกเต็มรูปแบบ | ถ่ายโอนไปยังเครื่องระยะไกล | sandbox ระยะไกลที่มีการจัดการพร้อมการซิงก์สองทางแบบเลือกได้ |
แบ็กเอนด์ Docker
sandboxing ปิดอยู่โดยค่าเริ่มต้น หากคุณเปิดใช้งาน sandboxing และไม่ได้เลือกแบ็กเอนด์ OpenClaw จะใช้แบ็กเอนด์ Docker ซึ่งเรียกใช้เครื่องมือและเบราว์เซอร์ sandbox ภายในเครื่องผ่าน Docker daemon socket (/var/run/docker.sock) การแยกคอนเทนเนอร์ sandbox กำหนดโดย Docker namespaces
หากต้องการเปิดเผย GPU ของโฮสต์ให้ sandbox Docker ให้ตั้งค่า agents.defaults.sandbox.docker.gpus หรือ override ราย agent ที่ agents.list[].sandbox.docker.gpus ค่าจะถูกส่งให้แฟล็ก --gpus ของ Docker เป็นอาร์กิวเมนต์แยก เช่น "all" หรือ "device=GPU-uuid" และต้องใช้ runtime ของโฮสต์ที่เข้ากันได้ เช่น NVIDIA Container Toolkit
แบ็กเอนด์ SSH
ใช้ backend: "ssh" เมื่อคุณต้องการให้ OpenClaw sandbox exec, เครื่องมือไฟล์ และการอ่านสื่อบนเครื่องใดก็ได้ที่เข้าถึงได้ด้วย 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", // Or use SecretRefs / inline contents instead of local files: // 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" }, }, }, }, },}วิธีทำงาน
- OpenClaw สร้าง root ระยะไกลต่อขอบเขตภายใต้
sandbox.ssh.workspaceRoot - เมื่อใช้ครั้งแรกหลังจากสร้างหรือสร้างใหม่ OpenClaw จะ seed workspace ระยะไกลนั้นจาก workspace local หนึ่งครั้ง
- หลังจากนั้น
exec,read,write,edit,apply_patch, การอ่านสื่อ prompt และการ staging สื่อขาเข้า จะทำงานกับ workspace ระยะไกลโดยตรงผ่าน SSH - OpenClaw ไม่ซิงก์การเปลี่ยนแปลงระยะไกลกลับมายัง workspace local โดยอัตโนมัติ
ข้อมูลรับรองการยืนยันตัวตน
identityFile,certificateFile,knownHostsFile: ใช้ไฟล์ local ที่มีอยู่และส่งผ่านการกำหนดค่า OpenSSHidentityData,certificateData,knownHostsData: ใช้สตริงแบบ inline หรือ SecretRefs OpenClaw จะแปลงค่าเหล่านี้ผ่าน secrets runtime snapshot ปกติ เขียนลงไฟล์ชั่วคราวด้วย0600และลบออกเมื่อเซสชัน SSH สิ้นสุด- หากตั้งค่าทั้ง
*Fileและ*Dataสำหรับรายการเดียวกัน*Dataจะชนะสำหรับเซสชัน SSH นั้น
ผลลัพธ์ของ remote-canonical
นี่คือโมเดล remote-canonical workspace SSH ระยะไกลจะกลายเป็นสถานะ sandbox จริงหลังจากการ seed ครั้งแรก
- การแก้ไข host-local ที่ทำนอก OpenClaw หลังขั้นตอน seed จะไม่ปรากฏบนระยะไกลจนกว่าคุณจะสร้าง sandbox ใหม่
openclaw sandbox recreateลบ root ระยะไกลต่อขอบเขตและ seed ใหม่จาก local ในการใช้งานครั้งถัดไป- ไม่รองรับ browser sandboxing บนแบ็กเอนด์ SSH
- การตั้งค่า
sandbox.docker.*ไม่มีผลกับแบ็กเอนด์ SSH
แบ็กเอนด์ OpenShell
ใช้ backend: "openshell" เมื่อคุณต้องการให้ OpenClaw sandbox เครื่องมือในสภาพแวดล้อมระยะไกลที่จัดการโดย OpenShell สำหรับคู่มือการตั้งค่าฉบับเต็ม เอกสารอ้างอิงการกำหนดค่า และการเปรียบเทียบโหมด workspace โปรดดู หน้า OpenShell โดยเฉพาะ
OpenShell ใช้ SSH transport แกนกลางและ bridge ระบบไฟล์ระยะไกลเดียวกันกับแบ็กเอนด์ SSH ทั่วไป และเพิ่ม lifecycle เฉพาะ OpenShell (sandbox create/get/delete, sandbox ssh-config) พร้อมโหมด workspace mirror ที่เป็นทางเลือก
{ agents: { defaults: { sandbox: { mode: "all", backend: "openshell", scope: "session", workspaceAccess: "rw", }, }, }, plugins: { entries: { openshell: { enabled: true, config: { from: "openclaw", mode: "remote", // mirror | remote remoteWorkspaceDir: "/sandbox", remoteAgentWorkspaceDir: "/agent", }, }, }, },}โหมด OpenShell:
mirror(ค่าเริ่มต้น): workspace local ยังคงเป็น canonical OpenClaw ซิงก์ไฟล์ local เข้า OpenShell ก่อน exec และซิงก์ workspace ระยะไกลกลับหลัง execremote: workspace OpenShell เป็น canonical หลังจากสร้าง sandbox แล้ว OpenClaw seed workspace ระยะไกลหนึ่งครั้งจาก workspace local จากนั้นเครื่องมือไฟล์และ exec จะทำงานกับ sandbox ระยะไกลโดยตรงโดยไม่ซิงก์การเปลี่ยนแปลงกลับ
รายละเอียดการขนส่งระยะไกล
- OpenClaw ขอการกำหนดค่า SSH เฉพาะ sandbox จาก OpenShell ผ่าน
openshell sandbox ssh-config <name> - Core เขียนการกำหนดค่า SSH นั้นไปยังไฟล์ชั่วคราว เปิดเซสชัน SSH และนำสะพานระบบไฟล์ระยะไกลตัวเดิมที่ใช้โดย
backend: "ssh"กลับมาใช้ซ้ำ - ในโหมด
mirrorเฉพาะวงจรชีวิตเท่านั้นที่ต่างออกไป: ซิงก์ภายในเครื่องไปยังระยะไกลก่อน exec แล้วซิงก์กลับหลัง exec
ข้อจำกัดปัจจุบันของ OpenShell
- ยังไม่รองรับเบราว์เซอร์ sandbox
- ไม่รองรับ
sandbox.docker.bindsบนแบ็กเอนด์ OpenShell - ปุ่มปรับแต่งรันไทม์เฉพาะ Docker ภายใต้
sandbox.docker.*ยังใช้ได้เฉพาะกับแบ็กเอนด์ Docker เท่านั้น
โหมดเวิร์กสเปซ
OpenShell มีโมเดลเวิร์กสเปซสองแบบ นี่คือส่วนที่สำคัญที่สุดในการใช้งานจริง
mirror (ภายในเครื่องเป็น canonical)
ใช้ plugins.entries.openshell.config.mode: "mirror" เมื่อคุณต้องการให้ เวิร์กสเปซภายในเครื่องยังเป็น canonical
พฤติกรรม:
- ก่อน
execOpenClaw จะซิงก์เวิร์กสเปซภายในเครื่องเข้าไปใน sandbox ของ OpenShell - หลัง
execOpenClaw จะซิงก์เวิร์กสเปซระยะไกลกลับมายังเวิร์กสเปซภายในเครื่อง - เครื่องมือไฟล์ยังคงทำงานผ่านสะพาน sandbox แต่เวิร์กสเปซภายในเครื่องยังเป็นแหล่งข้อมูลจริงระหว่างเทิร์น
ใช้โหมดนี้เมื่อ:
- คุณแก้ไขไฟล์ภายในเครื่องนอก OpenClaw และต้องการให้การเปลี่ยนแปลงเหล่านั้นปรากฏใน sandbox โดยอัตโนมัติ
- คุณต้องการให้ sandbox ของ OpenShell ทำงานใกล้เคียงกับแบ็กเอนด์ Docker มากที่สุด
- คุณต้องการให้เวิร์กสเปซบนโฮสต์สะท้อนการเขียนใน sandbox หลังแต่ละเทิร์น exec
ข้อแลกเปลี่ยน: มีต้นทุนการซิงก์เพิ่มก่อนและหลัง exec
remote (OpenShell เป็น canonical)
ใช้ plugins.entries.openshell.config.mode: "remote" เมื่อคุณต้องการให้ เวิร์กสเปซ OpenShell กลายเป็น canonical
พฤติกรรม:
- เมื่อสร้าง sandbox ครั้งแรก OpenClaw จะ seed เวิร์กสเปซระยะไกลจากเวิร์กสเปซภายในเครื่องหนึ่งครั้ง
- หลังจากนั้น
exec,read,write,editและapply_patchจะทำงานกับเวิร์กสเปซ OpenShell ระยะไกลโดยตรง - OpenClaw จะไม่ ซิงก์การเปลี่ยนแปลงระยะไกลกลับมายังเวิร์กสเปซภายในเครื่องหลัง exec
- การอ่านสื่อระหว่างสร้างพรอมป์ยังทำงานได้ เพราะเครื่องมือไฟล์และสื่ออ่านผ่านสะพาน sandbox แทนที่จะสมมติพาธโฮสต์ภายในเครื่อง
- การขนส่งคือ SSH เข้าไปใน sandbox ของ OpenShell ที่
openshell sandbox ssh-configส่งกลับมา
ผลที่ตามมาสำคัญ:
- หากคุณแก้ไขไฟล์บนโฮสต์นอก OpenClaw หลังขั้นตอน seed sandbox ระยะไกลจะ ไม่ เห็นการเปลี่ยนแปลงเหล่านั้นโดยอัตโนมัติ
- หากสร้าง sandbox ใหม่ เวิร์กสเปซระยะไกลจะถูก seed จากเวิร์กสเปซภายในเครื่องอีกครั้ง
- เมื่อใช้
scope: "agent"หรือscope: "shared"เวิร์กสเปซระยะไกลนั้นจะถูกแชร์ในขอบเขตเดียวกันนั้น
ใช้โหมดนี้เมื่อ:
- sandbox ควรอยู่ฝั่ง OpenShell ระยะไกลเป็นหลัก
- คุณต้องการลดโอเวอร์เฮดการซิงก์ต่อเทิร์น
- คุณไม่ต้องการให้การแก้ไขภายในเครื่องของโฮสต์เขียนทับสถานะ sandbox ระยะไกลโดยไม่ชัดเจน
เลือก mirror หากคุณมองว่า sandbox เป็นสภาพแวดล้อมการประมวลผลชั่วคราว เลือก remote หากคุณมองว่า sandbox เป็นเวิร์กสเปซจริง
วงจรชีวิตของ OpenShell
sandbox ของ OpenShell ยังคงถูกจัดการผ่านวงจรชีวิต sandbox ปกติ:
openclaw sandbox listแสดงทั้งรันไทม์ OpenShell และรันไทม์ Dockeropenclaw sandbox recreateลบรันไทม์ปัจจุบันและให้ OpenClaw สร้างใหม่เมื่อใช้งานครั้งถัดไป- ตรรกะ prune ก็รู้จักแบ็กเอนด์เช่นกัน
สำหรับโหมด remote การสร้างใหม่สำคัญเป็นพิเศษ:
- recreate จะลบเวิร์กสเปซระยะไกล canonical สำหรับขอบเขตนั้น
- การใช้งานครั้งถัดไปจะ seed เวิร์กสเปซระยะไกลใหม่จากเวิร์กสเปซภายในเครื่อง
สำหรับโหมด mirror การสร้างใหม่หลัก ๆ คือรีเซ็ตสภาพแวดล้อมการประมวลผลระยะไกล เพราะเวิร์กสเปซภายในเครื่องยังเป็น canonical อยู่ดี
การเข้าถึงเวิร์กสเปซ
agents.defaults.sandbox.workspaceAccess ควบคุมว่า sandbox เห็นอะไรได้บ้าง:
none (ค่าเริ่มต้น)
เครื่องมือเห็นเวิร์กสเปซ sandbox ภายใต้ ~/.openclaw/sandboxes
ro
เมานต์เวิร์กสเปซของเอเจนต์แบบอ่านอย่างเดียวที่ /agent (ปิดใช้งาน write/edit/apply_patch)
rw
เมานต์เวิร์กสเปซของเอเจนต์แบบอ่าน/เขียนที่ /workspace
เมื่อใช้แบ็กเอนด์ OpenShell:
- โหมด
mirrorยังคงใช้เวิร์กสเปซภายในเครื่องเป็นแหล่ง canonical ระหว่างเทิร์น exec - โหมด
remoteใช้เวิร์กสเปซ OpenShell ระยะไกลเป็นแหล่ง canonical หลังการ seed ครั้งแรก workspaceAccess: "ro"และ"none"ยังคงจำกัดพฤติกรรมการเขียนในแบบเดียวกัน
สื่อขาเข้าจะถูกคัดลอกเข้าไปในเวิร์กสเปซ sandbox ที่ใช้งานอยู่ (media/inbound/*)
การเมานต์ bind แบบกำหนดเอง
agents.defaults.sandbox.docker.binds เมานต์ไดเรกทอรีโฮสต์เพิ่มเติมเข้าไปในคอนเทนเนอร์ รูปแบบ: host:container:mode (เช่น "/home/user/source:/source:rw")
bind ระดับ global และต่อเอเจนต์จะถูก ผสาน กัน (ไม่ใช่แทนที่กัน) ภายใต้ scope: "shared" bind ต่อเอเจนต์จะถูกละเว้น
agents.defaults.sandbox.browser.binds เมานต์ไดเรกทอรีโฮสต์เพิ่มเติมเข้าไปในคอนเทนเนอร์ เบราว์เซอร์ sandbox เท่านั้น
- เมื่อตั้งค่าไว้ (รวมถึง
[]) ค่านี้จะแทนที่agents.defaults.sandbox.docker.bindsสำหรับคอนเทนเนอร์เบราว์เซอร์ - เมื่อไม่ระบุ คอนเทนเนอร์เบราว์เซอร์จะ fallback ไปใช้
agents.defaults.sandbox.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
สร้างอิมเมจค่าเริ่มต้น
จาก source checkout:
scripts/sandbox-setup.shจากการติดตั้ง npm (ไม่ต้องมี source checkout):
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 (หรือรันไทม์อื่น) ให้ bake อิมเมจแบบกำหนดเอง หรือติดตั้งผ่าน sandbox.docker.setupCommand (ต้องมี network egress + รากที่เขียนได้ + ผู้ใช้ root)
OpenClaw จะไม่แทนที่ด้วย debian:bookworm-slim แบบเงียบ ๆ เมื่อไม่มี openclaw-sandbox:bookworm-slim การรัน sandbox ที่ระบุอิมเมจค่าเริ่มต้นจะล้มเหลวทันทีพร้อมคำสั่ง build จนกว่าคุณจะ build มัน เพราะอิมเมจที่บันเดิลมามี python3 สำหรับตัวช่วยเขียน/แก้ไขของ sandbox
ไม่บังคับ: สร้างอิมเมจ common
สำหรับอิมเมจ sandbox ที่มีฟังก์ชันครบขึ้นพร้อมเครื่องมือทั่วไป (ตัวอย่างเช่น curl, jq, Node 24, pnpm, python3 และ git):
จาก source checkout:
scripts/sandbox-common-setup.shจากการติดตั้ง npm ให้ build อิมเมจค่าเริ่มต้นก่อน (ดูด้านบน) จากนั้น build อิมเมจ common ต่อบนอิมเมจนั้นโดยใช้ scripts/docker/sandbox/Dockerfile.common จาก repository
จากนั้นตั้ง agents.defaults.sandbox.docker.image เป็น openclaw-sandbox-common:bookworm-slim
ไม่บังคับ: สร้างอิมเมจเบราว์เซอร์ sandbox
จาก source checkout:
scripts/sandbox-browser-setup.shจากการติดตั้ง npm ให้ build โดยใช้ scripts/docker/sandbox/Dockerfile.browser จาก repository
โดยค่าเริ่มต้น คอนเทนเนอร์ sandbox ของ Docker จะรันโดย ไม่มีเครือข่าย แทนที่ด้วย agents.defaults.sandbox.docker.network
ค่าเริ่มต้น Chromium ของเบราว์เซอร์ sandbox
อิมเมจเบราว์เซอร์ sandbox ที่บันเดิลมายังใช้ค่าเริ่มต้นการเริ่มต้น 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=2--no-sandboxเมื่อเปิดใช้งานnoSandbox- แฟล็ก hardening ด้านกราฟิกสามรายการ (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) เป็นตัวเลือก และมีประโยชน์เมื่อคอนเทนเนอร์ไม่มีการรองรับ GPU ตั้งค่าOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0หากเวิร์กโหลดของคุณต้องใช้ WebGL หรือฟีเจอร์ 3D/เบราว์เซอร์อื่น --disable-extensionsเปิดใช้งานตามค่าเริ่มต้น และสามารถปิดได้ด้วยOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0สำหรับโฟลว์ที่พึ่งพาส่วนขยาย--renderer-process-limit=2ควบคุมโดยOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>โดยที่0จะคงค่าเริ่มต้นของ Chromium ไว้
หากคุณต้องการโปรไฟล์รันไทม์อื่น ให้ใช้อิมเมจเบราว์เซอร์แบบกำหนดเองและระบุ entrypoint ของคุณเอง สำหรับโปรไฟล์ Chromium ภายในเครื่อง (ไม่ใช่คอนเทนเนอร์) ให้ใช้ browser.extraArgs เพื่อผนวกแฟล็กเริ่มต้นเพิ่มเติม
ค่าเริ่มต้นด้านความปลอดภัยของเครือข่าย
network: "host"ถูกบล็อกnetwork: "container:<id>"ถูกบล็อกตามค่าเริ่มต้น (ความเสี่ยงจากการข้ามข้อจำกัดด้วยการเข้าร่วม namespace)- การยกเว้นฉุกเฉิน:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true
การติดตั้ง Docker และ Gateway แบบคอนเทนเนอร์อยู่ที่นี่: Docker
สำหรับการปรับใช้ Docker Gateway, scripts/docker/setup.sh สามารถเริ่มต้น config ของแซนด์บ็อกซ์ได้ ตั้งค่า OPENCLAW_SANDBOX=1 (หรือ true/yes/on) เพื่อเปิดใช้เส้นทางนี้ คุณสามารถแทนที่ตำแหน่ง socket ด้วย OPENCLAW_DOCKER_SOCKET ดูการตั้งค่าทั้งหมดและข้อมูลอ้างอิง env ได้ที่: Docker.
setupCommand (การตั้งค่าคอนเทนเนอร์ครั้งเดียว)
setupCommand ทำงาน ครั้งเดียว หลังจากสร้างคอนเทนเนอร์แซนด์บ็อกซ์แล้ว (ไม่ใช่ทุกครั้งที่รัน) โดยจะทำงานภายในคอนเทนเนอร์ผ่าน sh -lc
พาธ:
- ส่วนกลาง:
agents.defaults.sandbox.docker.setupCommand - รายเอเจนต์:
agents.list[].sandbox.docker.setupCommand
ข้อผิดพลาดที่พบบ่อย
- ค่าเริ่มต้นของ
docker.networkคือ"none"(ไม่มี egress) ดังนั้นการติดตั้งแพ็กเกจจะล้มเหลว docker.network: "container:<id>"ต้องใช้dangerouslyAllowContainerNamespaceJoin: trueและเป็นการยกเว้นฉุกเฉินเท่านั้นreadOnlyRoot: trueป้องกันการเขียน; ตั้งค่าreadOnlyRoot: falseหรือสร้าง custom image ไว้ล่วงหน้าuserต้องเป็น root สำหรับการติดตั้งแพ็กเกจ (ละuserไว้ หรือตั้งค่าuser: "0:0")- การ exec ในแซนด์บ็อกซ์ ไม่ สืบทอด
process.envของโฮสต์ ใช้agents.defaults.sandbox.docker.env(หรือ custom image) สำหรับคีย์ API ของ Skills - ค่าใน
agents.defaults.sandbox.docker.envจะถูกส่งเป็นตัวแปรสภาพแวดล้อมของคอนเทนเนอร์ Docker แบบชัดเจน ทุกคนที่มีสิทธิ์เข้าถึง Docker daemon สามารถตรวจสอบค่าเหล่านี้ได้ด้วยคำสั่ง metadata ของ Docker เช่นdocker inspectใช้ custom image, ไฟล์ secret ที่ mount ไว้ หรือเส้นทางส่ง secret อื่น หากไม่ยอมรับการเปิดเผยผ่าน metadata แบบนี้
นโยบายเครื่องมือและทางออกฉุกเฉิน
นโยบายอนุญาต/ปฏิเสธเครื่องมือยังคงมีผลก่อนกฎแซนด์บ็อกซ์ หากเครื่องมือถูกปฏิเสธแบบส่วนกลางหรือรายเอเจนต์ การใช้แซนด์บ็อกซ์จะไม่ทำให้เครื่องมือนั้นกลับมาใช้งานได้
tools.elevated เป็นทางออกฉุกเฉินแบบชัดเจนที่รัน exec นอกแซนด์บ็อกซ์ (gateway ตามค่าเริ่มต้น หรือ node เมื่อเป้าหมาย exec คือ node) directives /exec ใช้ได้เฉพาะกับผู้ส่งที่ได้รับอนุญาตและคงอยู่ต่อเซสชัน หากต้องการปิดใช้ exec แบบเด็ดขาด ให้ใช้นโยบายเครื่องมือแบบปฏิเสธ (ดู แซนด์บ็อกซ์ เทียบกับนโยบายเครื่องมือ เทียบกับ Elevated)
การดีบัก:
- ใช้
openclaw sandbox explainเพื่อตรวจสอบโหมดแซนด์บ็อกซ์ที่มีผลจริง นโยบายเครื่องมือ และคีย์ config สำหรับแก้ไข - ดู แซนด์บ็อกซ์ เทียบกับนโยบายเครื่องมือ เทียบกับ Elevated สำหรับโมเดลความคิดเรื่อง "ทำไมสิ่งนี้ถึงถูกบล็อก?"
ล็อกให้แน่นหนาไว้
การแทนที่สำหรับหลายเอเจนต์
แต่ละเอเจนต์สามารถแทนที่แซนด์บ็อกซ์ + เครื่องมือได้: agents.list[].sandbox และ agents.list[].tools (รวมถึง agents.list[].tools.sandbox.tools สำหรับนโยบายเครื่องมือของแซนด์บ็อกซ์) ดู แซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์ สำหรับลำดับความสำคัญ
ตัวอย่างเปิดใช้งานขั้นต่ำ
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", }, }, },}ที่เกี่ยวข้อง
- แซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์ — การแทนที่รายเอเจนต์และลำดับความสำคัญ
- OpenShell — การตั้งค่า backend แซนด์บ็อกซ์ที่จัดการให้ โหมด workspace และข้อมูลอ้างอิง config
- การกำหนดค่าแซนด์บ็อกซ์
- แซนด์บ็อกซ์ เทียบกับนโยบายเครื่องมือ เทียบกับ Elevated — การดีบัก "ทำไมสิ่งนี้ถึงถูกบล็อก?"
- ความปลอดภัย