Sandboxing
يمكن لـ 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 تلقائيًا (للتأكد من إمكانية الوصول إلى 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 على حافة الحاوية باستخدام قائمة سماح CIDR (مثل172.21.0.1/32). - يكون الوصول إلى noVNC للمراقبة محميًا بكلمة مرور افتراضيًا؛ ويصدر OpenClaw عنوان URL لرمز مميز قصير العمر يخدم صفحة bootstrap محلية ويفتح noVNC مع كلمة المرور داخل جزء URL (وليس في query/header logs).
- يسمح
agents.defaults.sandbox.browser.allowHostControlللجلسات الموجودة داخل sandbox باستهداف متصفح المضيف صراحةً. - تتحكم قوائم السماح الاختيارية في
target: "custom": allowedControlUrlsوallowedControlHostsوallowedControlPorts.
- افتراضيًا، يبدأ متصفح sandbox تلقائيًا (للتأكد من إمكانية الوصول إلى CDP) عندما تحتاجه أداة المتصفح.
قم بالتكوين عبر
- عملية Gateway نفسها.
- أي أداة يُسمح لها صراحةً بالتشغيل خارج sandbox (مثل
tools.elevated).- يتجاوز exec المرتفع sandboxing ويستخدم مسار الهروب المكوَّن (
gatewayافتراضيًا، أوnodeعندما يكون هدف exec هوnode). - إذا كان sandboxing معطلًا، فإن
tools.elevatedلا يغيّر التنفيذ (إذ إنه يعمل بالفعل على المضيف). راجع الوضع المرتفع.
- يتجاوز exec المرتفع sandboxing ويستخدم مسار الهروب المكوَّن (
الأوضاع
يتحكمagents.defaults.sandbox.mode في وقت استخدام sandboxing:
"off": لا يوجد sandboxing."non-main": وضع sandbox للجلسات غير الرئيسية فقط (الافتراضي إذا كنت تريد المحادثات العادية على المضيف)."all": كل جلسة تعمل داخل sandbox. ملاحظة: يعتمد"non-main"علىsession.mainKey(الافتراضي"main")، وليس على معرّف الوكيل. تستخدم جلسات المجموعة/القناة مفاتيحها الخاصة، لذلك تُحسب على أنها غير رئيسية وستوضع داخل sandbox.
النطاق
يتحكمagents.defaults.sandbox.scope في عدد الحاويات التي يتم إنشاؤها:
"agent"(الافتراضي): حاوية واحدة لكل وكيل."session": حاوية واحدة لكل جلسة."shared": حاوية واحدة مشتركة بين جميع الجلسات الموجودة داخل sandbox.
الواجهة الخلفية
يتحكمagents.defaults.sandbox.backend في بيئة التشغيل التي توفر sandbox:
"docker"(الافتراضي): بيئة sandbox محلية معتمدة على Docker."ssh": بيئة sandbox بعيدة عامة معتمدة على SSH."openshell": بيئة sandbox معتمدة على OpenShell.
agents.defaults.sandbox.ssh.
ويوجد التكوين الخاص بـ OpenShell تحت plugins.entries.openshell.config.
اختيار واجهة خلفية
| Docker | SSH | OpenShell | |
|---|---|---|---|
| مكان التشغيل | حاوية محلية | أي مضيف يمكن الوصول إليه عبر SSH | sandbox مُدار بواسطة OpenShell |
| الإعداد | scripts/sandbox-setup.sh | مفتاح SSH + مضيف الهدف | تمكين plugin OpenShell |
| نموذج مساحة العمل | bind-mount أو نسخ | بعيد-معتمد (بذر مرة واحدة) | mirror أو remote |
| التحكم في الشبكة | docker.network (الافتراضي: none) | يعتمد على المضيف البعيد | يعتمد على OpenShell |
| متصفح sandbox | مدعوم | غير مدعوم | غير مدعوم بعد |
| Bind mounts | docker.binds | غير متاح | غير متاح |
| الأفضل لـ | التطوير المحلي، والعزل الكامل | نقل الحمل إلى جهاز بعيد | sandboxes بعيدة مُدارة مع مزامنة ثنائية الاتجاه اختيارية |
الواجهة الخلفية SSH
استخدمbackend: "ssh" عندما تريد أن يضع OpenClaw أدوات exec وأدوات الملفات وقراءات الوسائط داخل sandbox على
أي جهاز يمكن الوصول إليه عبر SSH.
- ينشئ OpenClaw جذرًا بعيدًا لكل نطاق تحت
sandbox.ssh.workspaceRoot. - عند أول استخدام بعد الإنشاء أو إعادة الإنشاء، يقوم OpenClaw ببذر مساحة العمل البعيدة تلك من مساحة العمل المحلية مرة واحدة.
- بعد ذلك، تعمل
execوreadوwriteوeditوapply_patchوقراءات وسائط المطالبة وتحضير الوسائط الواردة مباشرة على مساحة العمل البعيدة عبر SSH. - لا يقوم OpenClaw بمزامنة التغييرات البعيدة مرة أخرى إلى مساحة العمل المحلية تلقائيًا.
identityFileوcertificateFileوknownHostsFile: تستخدم ملفاتك المحلية الحالية وتمريرها عبر تكوين OpenSSH.identityDataوcertificateDataوknownHostsData: تستخدم سلاسل مضمّنة أو SecretRefs. ويقوم OpenClaw بحلها عبر لقطة وقت تشغيل الأسرار العادية، ويكتبها إلى ملفات مؤقتة بأذونات0600، ثم يحذفها عند انتهاء جلسة SSH.- إذا تم تعيين كل من
*Fileو*Dataللعنصر نفسه، فإن*Dataتفوز لتلك الجلسة من SSH.
- لا تكون التعديلات المحلية على المضيف التي تتم خارج OpenClaw بعد خطوة البذر مرئية عن بُعد حتى تعيد إنشاء sandbox.
- يؤدي
openclaw sandbox recreateإلى حذف الجذر البعيد لكل نطاق ثم البذر مرة أخرى من المحلي عند الاستخدام التالي. - لا يتم دعم متصفح sandbox على الواجهة الخلفية SSH.
- لا تنطبق إعدادات
sandbox.docker.*على الواجهة الخلفية SSH.
الواجهة الخلفية OpenShell
استخدمbackend: "openshell" عندما تريد من OpenClaw أن يضع الأدوات داخل sandbox في
بيئة بعيدة مُدارة بواسطة OpenShell. للحصول على دليل الإعداد الكامل، ومرجع
التكوين، ومقارنة أوضاع مساحة العمل، راجع صفحة
OpenShell المخصصة.
يعيد OpenShell استخدام النقل الأساسي نفسه عبر SSH وجسر نظام الملفات البعيد الذي يستخدمه
الـ backend العام SSH، ويضيف دورة حياة خاصة بـ OpenShell
(sandbox create/get/delete وsandbox ssh-config) بالإضافة إلى وضع مساحة العمل الاختياري mirror.
mirror(الافتراضي): تظل مساحة العمل المحلية هي المعتمدة. ويزامن OpenClaw الملفات المحلية إلى OpenShell قبل exec ويزامن مساحة العمل البعيدة مرة أخرى بعد exec.remote: تصبح مساحة عمل OpenShell هي المعتمدة بعد إنشاء sandbox. ويقوم OpenClaw ببذر مساحة العمل البعيدة مرة واحدة من مساحة العمل المحلية، ثم تعمل أدوات الملفات وexec مباشرة على sandbox البعيد من دون مزامنة التغييرات مرة أخرى.
- يطلب OpenClaw من OpenShell إعداد SSH خاصًا بـ sandbox عبر
openshell sandbox ssh-config <name>. - تكتب النواة تكوين SSH هذا إلى ملف مؤقت، وتفتح جلسة SSH، وتعيد استخدام جسر نظام الملفات البعيد نفسه المستخدم مع
backend: "ssh". - في وضع
mirrorفقط تختلف دورة الحياة: مزامنة من المحلي إلى البعيد قبل exec، ثم مزامنة مرة أخرى بعد exec.
- لا يتم دعم متصفح sandbox بعد
- لا يتم دعم
sandbox.docker.bindsعلى الواجهة الخلفية OpenShell - تظل مفاتيح وقت التشغيل الخاصة بـ Docker تحت
sandbox.docker.*منطبقة فقط على الواجهة الخلفية Docker
أوضاع مساحة العمل
يملك OpenShell نموذجين لمساحة العمل. وهذا هو الجزء الأهم عمليًا.mirror
استخدم plugins.entries.openshell.config.mode: "mirror" عندما تريد أن تظل مساحة العمل المحلية هي المعتمدة.
السلوك:
- قبل
exec، يزامن OpenClaw مساحة العمل المحلية إلى sandbox الخاص بـ OpenShell. - بعد
exec، يزامن OpenClaw مساحة العمل البعيدة مرة أخرى إلى مساحة العمل المحلية. - ما زالت أدوات الملفات تعمل عبر جسر sandbox، لكن مساحة العمل المحلية تظل مصدر الحقيقة بين الأدوار.
- تعدّل الملفات محليًا خارج OpenClaw وتريد أن تظهر تلك التغييرات في sandbox تلقائيًا
- تريد أن يتصرف sandbox الخاص بـ OpenShell بطريقة تشبه الواجهة الخلفية Docker قدر الإمكان
- تريد أن تعكس مساحة عمل المضيف عمليات الكتابة داخل sandbox بعد كل دور exec
- تكلفة مزامنة إضافية قبل exec وبعده
remote
استخدم plugins.entries.openshell.config.mode: "remote" عندما تريد أن تصبح مساحة عمل OpenShell هي المعتمدة.
السلوك:
- عندما يُنشأ sandbox لأول مرة، يقوم OpenClaw ببذر مساحة العمل البعيدة من مساحة العمل المحلية مرة واحدة.
- بعد ذلك، تعمل
execوreadوwriteوeditوapply_patchمباشرة على مساحة العمل البعيدة الخاصة بـ OpenShell. - لا يقوم OpenClaw بمزامنة التغييرات البعيدة مرة أخرى إلى مساحة العمل المحلية بعد exec.
- ما زالت قراءات الوسائط وقت المطالبة تعمل لأن أدوات الملفات والوسائط تقرأ عبر جسر sandbox بدلًا من افتراض مسار مضيف محلي.
- يكون النقل عبر SSH إلى sandbox الخاص بـ OpenShell الذي تعيده
openshell sandbox ssh-config.
- إذا عدّلت الملفات على المضيف خارج OpenClaw بعد خطوة البذر، فلن يرى sandbox البعيد تلك التغييرات تلقائيًا.
- إذا أُعيد إنشاء sandbox، فستُبذَر مساحة العمل البعيدة مرة أخرى من مساحة العمل المحلية.
- مع
scope: "agent"أوscope: "shared"، تتم مشاركة مساحة العمل البعيدة هذه على النطاق نفسه.
- يجب أن يعيش sandbox في الأساس على الجانب البعيد الخاص بـ OpenShell
- تريد تقليل حمل المزامنة لكل دور
- لا تريد أن تؤدي تعديلات المضيف المحلية إلى الكتابة فوق حالة sandbox البعيدة بصمت
mirror إذا كنت تنظر إلى sandbox على أنه بيئة تنفيذ مؤقتة.
واختر remote إذا كنت تنظر إلى sandbox على أنه مساحة العمل الحقيقية.
دورة حياة OpenShell
تظل sandboxes الخاصة بـ OpenShell مُدارة عبر دورة حياة sandbox العادية:- يعرض
openclaw sandbox listبيئات تشغيل OpenShell بالإضافة إلى بيئات Docker - يحذف
openclaw sandbox recreateبيئة التشغيل الحالية ويتيح لـ OpenClaw إعادة إنشائها عند الاستخدام التالي - يكون منطق التنظيف prune مدركًا للواجهة الخلفية أيضًا
remote، تكون إعادة الإنشاء مهمة بشكل خاص:
- تؤدي إعادة الإنشاء إلى حذف مساحة العمل البعيدة المعتمدة لذلك النطاق
- يؤدي الاستخدام التالي إلى بذر مساحة عمل بعيدة جديدة من مساحة العمل المحلية
mirror، فتعيد إعادة الإنشاء تعيين بيئة التنفيذ البعيدة أساسًا
لأن مساحة العمل المحلية تظل معتمدة على أي حال.
الوصول إلى مساحة العمل
يتحكمagents.defaults.sandbox.workspaceAccess في ما الذي يمكن لـ sandbox رؤيته:
"none"(الافتراضي): ترى الأدوات مساحة عمل sandbox تحت~/.openclaw/sandboxes."ro": يركّب مساحة عمل الوكيل للقراءة فقط عند/agent(ويعطلwrite/edit/apply_patch)."rw": يركّب مساحة عمل الوكيل للقراءة/الكتابة عند/workspace.
- يظل وضع
mirrorيستخدم مساحة العمل المحلية كمصدر معتمد بين أدوار exec - يستخدم وضع
remoteمساحة عمل OpenShell البعيدة كمصدر معتمد بعد البذر الأولي - ما زالت
workspaceAccess: "ro"و"none"تقيّدان سلوك الكتابة بالطريقة نفسها
media/inbound/*).
ملاحظة Skills: أداة read مرتبطة بجذر sandbox. ومع workspaceAccess: "none"،
يعكس OpenClaw الـ Skills المؤهلة إلى مساحة عمل sandbox (.../skills) حتى
يمكن قراءتها. ومع "rw"، تصبح Skills الموجودة في مساحة العمل قابلة للقراءة من
/workspace/skills.
Bind mounts مخصصة
يقومagents.defaults.sandbox.docker.binds بتركيب أدلة مضيف إضافية داخل الحاوية.
التنسيق: host:container:mode (مثل "/home/user/source:/source:rw").
يتم دمج bind mounts العامة وتلك الخاصة بكل وكيل (ولا يتم استبدالها). وتحت scope: "shared"، يتم تجاهل bind mounts الخاصة بكل وكيل.
يقوم agents.defaults.sandbox.browser.binds بتركيب أدلة مضيف إضافية داخل حاوية متصفح sandbox فقط.
- عند تعيينها (بما في ذلك
[])، فإنها تستبدلagents.defaults.sandbox.docker.bindsبالنسبة إلى حاوية المتصفح. - عند حذفها، تعود حاوية المتصفح إلى
agents.defaults.sandbox.docker.binds(للتوافق مع الإصدارات السابقة).
- تتجاوز bind mounts نظام ملفات sandbox: فهي تكشف مسارات المضيف بالنمط الذي تحدده (
:roأو:rw). - يمنع OpenClaw مصادر الربط الخطرة (مثل:
docker.sockو/etcو/procو/sysو/devوعمليات التركيب الأصلية التي قد تكشفها). - يمنع OpenClaw أيضًا جذور بيانات الاعتماد الشائعة في الدليل المنزلي مثل
~/.awsو~/.cargoو~/.configو~/.dockerو~/.gnupgو~/.netrcو~/.npmو~/.ssh. - لا يعتمد التحقق من bind على مطابقة السلاسل فقط. بل يقوم OpenClaw بتطبيع مسار المصدر، ثم يحله مرة أخرى عبر أعمق أصل موجود قبل إعادة التحقق من المسارات المحظورة والجذور المسموح بها.
- وهذا يعني أن محاولات الهروب عبر الروابط الرمزية في الأصل ما زالت تفشل بشكل مغلق حتى عندما لا تكون الورقة النهائية موجودة بعد. مثال: ما زال
/workspace/run-link/new-fileيُحل إلى/var/run/...إذا كانrun-linkيشير إلى هناك. - يتم أيضًا تحويل جذور المصدر المسموح بها إلى الشكل المعتمد نفسه، لذا فإن المسار الذي يبدو داخل قائمة السماح فقط قبل حل الروابط الرمزية سيُرفض أيضًا على أنه
outside allowed roots. - يجب أن تكون عمليات التركيب الحساسة (الأسرار، ومفاتيح SSH، وبيانات اعتماد الخدمة) بنمط
:roما لم تكن هناك حاجة مطلقة. - اجمع ذلك مع
workspaceAccess: "ro"إذا كنت تحتاج فقط إلى وصول قراءة إلى مساحة العمل؛ إذ تبقى أوضاع bind مستقلة. - راجع Sandbox vs Tool Policy vs Elevated لمعرفة كيفية تفاعل bind mounts مع سياسة الأدوات وexec المرتفع.
الصور + الإعداد
صورة Docker الافتراضية:openclaw-sandbox:bookworm-slim
ابنها مرة واحدة:
sandbox.docker.setupCommand (يتطلب خروجًا شبكيًا + جذرًا قابلاً للكتابة +
مستخدم root).
إذا كنت تريد صورة sandbox أكثر عملية مع أدوات شائعة (مثل
curl وjq وnodejs وpython3 وgit)، فابنِ:
agents.defaults.sandbox.docker.image على
openclaw-sandbox-common:bookworm-slim.
صورة متصفح sandbox:
agents.defaults.sandbox.docker.network.
تطبق صورة متصفح 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و--disable-setuid-sandboxعند تمكينnoSandbox.- تكون أعلام تقوية الرسوميات الثلاثة (
--disable-3d-apis، و--disable-software-rasterizer، و--disable-gpu) اختيارية، وتكون مفيدة عندما تفتقر الحاويات إلى دعم GPU. اضبطOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0إذا كانت أحمال العمل لديك تتطلب WebGL أو ميزات ثلاثية الأبعاد/متصفح أخرى. - يكون
--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). - تجاوز break-glass:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
scripts/docker/setup.sh تهيئة تكوين sandbox.
اضبط OPENCLAW_SANDBOX=1 (أو true/yes/on) لتمكين هذا المسار. ويمكنك
تجاوز موقع المقبس عبر OPENCLAW_DOCKER_SOCKET. الإعداد الكامل ومرجع
متغيرات البيئة: Docker
setupCommand (إعداد الحاوية لمرة واحدة)
يعملsetupCommand مرة واحدة بعد إنشاء حاوية sandbox (وليس في كل تشغيل).
ويُنفذ داخل الحاوية عبر sh -lc.
المسارات:
- عام:
agents.defaults.sandbox.docker.setupCommand - لكل وكيل:
agents.list[].sandbox.docker.setupCommand
- قيمة
docker.networkالافتراضية هي"none"(من دون خروج)، لذا ستفشل عمليات تثبيت الحزم. - يتطلب
docker.network: "container:<id>"القيمةdangerouslyAllowContainerNamespaceJoin: trueوهو مخصص لحالات break-glass فقط. - تمنع
readOnlyRoot: trueعمليات الكتابة؛ اضبطreadOnlyRoot: falseأو أنشئ صورة مخصصة. - يجب أن يكون
userهو root لعمليات تثبيت الحزم (احذفuserأو اضبطuser: "0:0"). - لا يرث Sandbox exec قيمة
process.envمن المضيف. استخدمagents.defaults.sandbox.docker.env(أو صورة مخصصة) لمفاتيح API الخاصة بـ Skills.
سياسة الأدوات + مخارج الهروب
تظل سياسات السماح/المنع للأدوات منطبقة قبل قواعد sandbox. فإذا كانت الأداة ممنوعة عالميًا أو لكل وكيل، فلن يعيدها sandboxing. يمثلtools.elevated مخرج هروب صريح يشغّل exec خارج sandbox (gateway افتراضيًا، أو node عندما يكون هدف exec هو node).
وتنطبق توجيهات /exec فقط على المرسلين المصرح لهم وتستمر لكل جلسة؛ ولتعطيل
exec بشكل صارم، استخدم منع سياسة الأدوات (راجع Sandbox vs Tool Policy vs Elevated).
تصحيح الأخطاء:
- استخدم
openclaw sandbox explainلفحص وضع sandbox الفعّال، وسياسة الأدوات، ومفاتيح التكوين الخاصة بالإصلاح. - راجع Sandbox vs Tool Policy vs Elevated للحصول على نموذج ذهني لسؤال “لماذا تم حظر هذا؟”. أبقِ الأمور مقيدة بإحكام.
تجاوزات متعددة الوكلاء
يمكن لكل وكيل تجاوز sandbox + الأدوات:agents.list[].sandbox وagents.list[].tools (بالإضافة إلى agents.list[].tools.sandbox.tools لسياسة أدوات sandbox).
راجع Sandbox والأدوات متعددة الوكلاء لمعرفة الأولوية.
مثال تمكين أدنى
وثائق ذات صلة
- OpenShell — إعداد الواجهة الخلفية المُدارة لـ sandbox، وأوضاع مساحة العمل، ومرجع التكوين
- تكوين Sandbox
- Sandbox vs Tool Policy vs Elevated — تصحيح “لماذا تم حظر هذا؟”
- Sandbox والأدوات متعددة الوكلاء — التجاوزات لكل وكيل والأولوية
- الأمان