Gateway
แซนด์บ็อกซ์เทียบกับนโยบายเครื่องมือเทียบกับสิทธิ์ยกระดับ
OpenClaw มีตัวควบคุมที่เกี่ยวข้องกันสามอย่าง (แต่แตกต่างกัน):
- Sandbox (
agents.defaults.sandbox.*/agents.list[].sandbox.*) กำหนดว่า เครื่องมือทำงานที่ไหน (แบ็กเอนด์ sandbox เทียบกับโฮสต์) - นโยบายเครื่องมือ (
tools.*,tools.sandbox.tools.*,agents.list[].tools.*) กำหนดว่า เครื่องมือใดพร้อมใช้งาน/ได้รับอนุญาต - Elevated (
tools.elevated.*,agents.list[].tools.elevated.*) เป็น ทางออกเฉพาะ exec เพื่อรันนอก sandbox เมื่อคุณอยู่ใน sandbox (gatewayโดยค่าเริ่มต้น หรือnodeเมื่อกำหนดค่าเป้าหมาย exec เป็นnode)
ดีบักด่วน
ใช้ตัวตรวจสอบเพื่อดูว่า OpenClaw กำลังทำอะไร จริง ๆ:
openclaw sandbox explainopenclaw sandbox explain --session agent:main:mainopenclaw sandbox explain --agent workopenclaw sandbox explain --jsonคำสั่งนี้จะแสดง:
- โหมด/ขอบเขต sandbox และการเข้าถึง workspace ที่มีผลจริง
- เซสชันขณะนี้อยู่ใน sandbox หรือไม่ (main เทียบกับ non-main)
- การอนุญาต/ปฏิเสธเครื่องมือ sandbox ที่มีผลจริง (และมาจาก agent/global/default หรือไม่)
- เกต elevated และเส้นทางคีย์สำหรับแก้ไข
Sandbox: เครื่องมือรันที่ไหน
Sandboxing ถูกควบคุมโดย agents.defaults.sandbox.mode:
"off": ทุกอย่างรันบนโฮสต์"non-main": เฉพาะเซสชัน non-main เท่านั้นที่อยู่ใน sandbox (มักเป็นเรื่อง "น่าประหลาดใจ" สำหรับกลุ่ม/ช่องทาง)"all": ทุกอย่างอยู่ใน sandbox
ดู Sandboxing สำหรับเมทริกซ์ฉบับเต็ม (ขอบเขต, การเมานต์ workspace, อิมเมจ)
Bind mounts (การตรวจสอบความปลอดภัยอย่างเร็ว)
docker.bindsเจาะผ่าน ระบบไฟล์ sandbox: สิ่งที่คุณเมานต์จะมองเห็นได้ภายในคอนเทนเนอร์ตามโหมดที่คุณตั้ง (:roหรือ:rw)- ค่าเริ่มต้นคืออ่าน-เขียนหากคุณละเว้นโหมด; ควรใช้
:roสำหรับซอร์ส/ความลับ scope: "shared"จะไม่สนใจ bind ราย agent (ใช้เฉพาะ bind ระดับ global)- OpenClaw ตรวจสอบแหล่งที่มาของ bind สองครั้ง: ครั้งแรกบนเส้นทางแหล่งที่มาที่ถูกปรับมาตรฐานแล้ว จากนั้นตรวจอีกครั้งหลัง resolve ผ่าน ancestor ที่มีอยู่ที่ลึกที่สุด การ escape ผ่าน symlink-parent จะไม่ข้ามการตรวจสอบ blocked-path หรือ allowed-root
- เส้นทาง leaf ที่ไม่มีอยู่ยังคงถูกตรวจสอบอย่างปลอดภัย หาก
/workspace/alias-out/new-fileresolve ผ่าน parent ที่เป็น symlink ไปยังเส้นทางที่ถูกบล็อกหรืออยู่นอกรากที่อนุญาตที่กำหนดค่าไว้ bind จะถูกปฏิเสธ - การ bind
/var/run/docker.sockเท่ากับมอบการควบคุมโฮสต์ให้ sandbox; ทำเช่นนี้เฉพาะเมื่อตั้งใจเท่านั้น - การเข้าถึง workspace (
workspaceAccess: "ro"/"rw") เป็นอิสระจากโหมด bind
นโยบายเครื่องมือ: มี/เรียกใช้เครื่องมือใดได้บ้าง
มีสองชั้นที่สำคัญ:
- โปรไฟล์เครื่องมือ:
tools.profileและagents.list[].tools.profile(allowlist พื้นฐาน) - โปรไฟล์เครื่องมือของผู้ให้บริการ:
tools.byProvider[provider].profileและagents.list[].tools.byProvider[provider].profile - นโยบายเครื่องมือระดับ global/ราย agent:
tools.allow/tools.denyและagents.list[].tools.allow/agents.list[].tools.deny - นโยบายเครื่องมือของผู้ให้บริการ:
tools.byProvider[provider].allow/denyและagents.list[].tools.byProvider[provider].allow/deny - นโยบายเครื่องมือ sandbox (ใช้เฉพาะเมื่ออยู่ใน sandbox):
tools.sandbox.tools.allow/tools.sandbox.tools.denyและagents.list[].tools.sandbox.tools.*
หลักทั่วไป:
denyชนะเสมอ- หาก
allowไม่ว่างเปล่า อย่างอื่นทั้งหมดจะถูกถือว่าถูกบล็อก - นโยบายเครื่องมือคือจุดหยุดเด็ดขาด:
/execไม่สามารถ override เครื่องมือexecที่ถูกปฏิเสธได้ - นโยบายเครื่องมือกรองความพร้อมใช้งานของเครื่องมือตามชื่อ; ไม่ได้ตรวจสอบ side effect ภายใน
execหากอนุญาตexecแล้ว การปฏิเสธwrite,editหรือapply_patchไม่ได้ทำให้คำสั่ง shell เป็นแบบอ่านอย่างเดียว /execเปลี่ยนเฉพาะค่าเริ่มต้นของเซสชันสำหรับผู้ส่งที่ได้รับอนุญาต; ไม่ได้ให้สิทธิ์เข้าถึงเครื่องมือ คีย์เครื่องมือของผู้ให้บริการยอมรับได้ทั้งprovider(เช่นgoogle-antigravity) หรือprovider/model(เช่นopenai/gpt-5.4)- บันทึก Gateway มีรายการ audit
agents/tool-policyเมื่อขั้นตอนนโยบายเครื่องมือลบเครื่องมือออก หรือเมื่อนโยบายเครื่องมือ sandbox บล็อกการเรียก ใช้openclaw logsเพื่อดูป้ายกำกับ rule, คีย์ config และชื่อเครื่องมือที่ได้รับผลกระทบ
กลุ่มเครื่องมือ (ชวเลข)
นโยบายเครื่องมือ (global, agent, sandbox) รองรับรายการ group:* ที่ขยายเป็นหลายเครื่องมือ:
{ tools: { sandbox: { tools: { allow: ["group:runtime", "group:fs", "group:sessions", "group:memory"], }, }, },}กลุ่มที่มีให้ใช้:
group:runtime:exec,process,code_execution(bashยอมรับเป็น alias สำหรับexec)group:fs:read,write,edit,apply_patchสำหรับ agent แบบอ่านอย่างเดียว ให้ปฏิเสธgroup:runtimeรวมถึงเครื่องมือระบบไฟล์ที่เปลี่ยนแปลงข้อมูล เว้นแต่นโยบายระบบไฟล์ sandbox หรือขอบเขตโฮสต์แยกต่างหากจะบังคับข้อจำกัดอ่านอย่างเดียวgroup:sessions:sessions_list,sessions_history,sessions_send,sessions_spawn,sessions_yield,subagents,session_statusgroup:memory:memory_search,memory_getgroup:web:web_search,x_search,web_fetchgroup:ui:browser,canvasgroup:automation:heartbeat_respond,cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:agents:agents_list,update_plangroup:media:image,image_generate,music_generate,video_generate,ttsgroup:openclaw: เครื่องมือในตัวทั้งหมดของ OpenClaw (ไม่รวม Plugin ของผู้ให้บริการ)group:plugins: เครื่องมือทั้งหมดที่ Plugin ที่โหลดเป็นเจ้าของ รวมถึงเซิร์ฟเวอร์ MCP ที่กำหนดค่าซึ่งเปิดเผยผ่านbundle-mcp
สำหรับเซิร์ฟเวอร์ MCP ที่อยู่ใน sandbox นโยบายเครื่องมือ sandbox คือเกตอนุญาตชั้นที่สอง หากกำหนดค่า mcp.servers แล้วแต่ turn ที่อยู่ใน sandbox แสดงเฉพาะเครื่องมือในตัว ให้เพิ่ม bundle-mcp, group:plugins หรือชื่อ/ glob เครื่องมือ MCP ที่มีคำนำหน้าเซิร์ฟเวอร์ เช่น outlook__send_mail หรือ outlook__* ลงใน tools.sandbox.tools.alsoAllow จากนั้นรีสตาร์ต/โหลด gateway ใหม่และจับรายการเครื่องมืออีกครั้ง glob ของเซิร์ฟเวอร์ใช้คำนำหน้าเซิร์ฟเวอร์ MCP ที่ปลอดภัยสำหรับผู้ให้บริการ: อักขระที่ไม่ใช่ [A-Za-z0-9_-] จะกลายเป็น -, ชื่อที่ไม่ได้ขึ้นต้นด้วยตัวอักษรจะได้คำนำหน้า mcp- และคำนำหน้าที่ยาวหรือซ้ำอาจถูกตัดหรือเติม suffix
ขณะนี้ openclaw doctor ตรวจสอบรูปทรงนี้สำหรับเซิร์ฟเวอร์ที่ OpenClaw จัดการใน mcp.servers เซิร์ฟเวอร์ MCP ที่โหลดจาก manifest ของ Plugin ที่ bundled หรือ Claude .mcp.json ใช้เกต sandbox เดียวกัน แต่การวินิจฉัยนี้ยังไม่แจกแจงแหล่งเหล่านั้น; ใช้รายการ allowlist เดียวกันหากเครื่องมือของแหล่งเหล่านั้นหายไปใน turn ที่อยู่ใน sandbox
Elevated: "รันบนโฮสต์" เฉพาะ exec
Elevated ไม่ได้ ให้เครื่องมือเพิ่มเติม; มีผลเฉพาะกับ exec เท่านั้น
- หากคุณอยู่ใน sandbox,
/elevated on(หรือexecพร้อมelevated: true) จะรันนอก sandbox (approval อาจยังมีผล) - ใช้
/elevated fullเพื่อข้าม approval ของ exec สำหรับเซสชัน - หากคุณรันแบบ direct อยู่แล้ว elevated โดยผลจริงจะเป็น no-op (ยังคงถูกควบคุมด้วยเกต)
- Elevated ไม่ได้ ผูกกับ skill scope และ ไม่ได้ override allow/deny ของเครื่องมือ
- Elevated ไม่ได้ให้ override ข้ามโฮสต์แบบกำหนดเองจาก
host=auto; ทำตามกฎเป้าหมาย exec ปกติ และคงnodeไว้เฉพาะเมื่อเป้าหมายที่กำหนดค่า/ของเซสชันเป็นnodeอยู่แล้ว /execแยกจาก elevated ใช้ปรับเฉพาะค่าเริ่มต้น exec ต่อเซสชันสำหรับผู้ส่งที่ได้รับอนุญาต
เกต:
- การเปิดใช้:
tools.elevated.enabled(และเลือกใช้agents.list[].tools.elevated.enabledได้) - allowlist ของผู้ส่ง:
tools.elevated.allowFrom.<provider>(และเลือกใช้agents.list[].tools.elevated.allowFrom.<provider>ได้)
วิธีแก้ "sandbox jail" ที่พบบ่อย
"เครื่องมือ X ถูกบล็อกโดยนโยบายเครื่องมือ sandbox"
คีย์สำหรับแก้ไข (เลือกหนึ่งอย่าง):
- ปิดใช้งาน sandbox:
agents.defaults.sandbox.mode=off(หรือราย agentagents.list[].sandbox.mode=off) - อนุญาตเครื่องมือภายใน sandbox:
- ลบออกจาก
tools.sandbox.tools.deny(หรือราย agentagents.list[].tools.sandbox.tools.deny) - หรือเพิ่มลงใน
tools.sandbox.tools.allow(หรือ allow ราย agent)
- ลบออกจาก
- ตรวจสอบ
openclaw logsสำหรับรายการagents/tool-policyรายการนี้บันทึกโหมด sandbox และระบุว่า rule แบบ allow หรือ deny บล็อกเครื่องมือหรือไม่
"ฉันคิดว่านี่คือ main ทำไมถึงอยู่ใน sandbox?"
ในโหมด "non-main" คีย์กลุ่ม/ช่องทาง ไม่ใช่ main ใช้คีย์เซสชัน main (แสดงโดย sandbox explain) หรือเปลี่ยนโหมดเป็น "off"
ที่เกี่ยวข้อง
- Sandboxing -- เอกสารอ้างอิง sandbox ฉบับเต็ม (โหมด, ขอบเขต, แบ็กเอนด์, อิมเมจ)
- Multi-Agent Sandbox & Tools -- การ override ราย agent และลำดับความสำคัญ
- Elevated Mode