انتقل إلى المحتوى

العزل والحدود

قيّد وصول برنامج Elide إلى نظام الملفات والشبكة والعمليات الفرعية والخيوط والشيفرة الأصلية باستخدام --sandbox وخيارات --allow-*، وحدّد الموارد ومدة التشغيل.

في هذه الصفحة

تعمل البرامج دون قيود إلى أن تمرّر خيار عزل. يمنع --sandbox الوصول إلى نظام الملفات؛ ويبقى الوصول إلى الشبكة والعمليات الفرعية مسموحًا إلى أن تسرد مضيفين أو أوامر:

elide --sandbox --allow-read=. --allow-net=example.com run app.js
0:11 / 0:11

السماح بالوصول إلى الملفات

elide --allow-read=. --fs-audit run app.js
[elide.fs] allow read open hello.txt
[elide.fs] DENY  write open out.txt

يفشل الوصول الممنوع كما يفشل مع ملف محمي: EACCES: permission denied, open 'hello.txt'. تُحلّ المسارات النسبية من مجلد العمل.

لا تستطيع برامج WASI الوصول إلى مجلدات المضيف إلى أن تربط مجلدًا عبر WasiMapDirs؛ راجع WebAssembly. تنطبق هذه الأذونات على المجلدات المربوطة، ويحتاج فتح ملف في WASI إلى إذنَي القراءة والكتابة معًا.

السماح بالشبكة والعمليات الفرعية

elide --allow-net=localhost --allow-run=ls run app.js

يذكر الاستدعاء الممنوع الإذن الذي يحتاجه:

TypeError: fetch to 'example.com:443' is not permitted; grant it with --allow-net=example.com
Error: spawn of 'echo' is not permitted; grant it with --allow-run=echo

تُبلغ المطابقة مع --deny-* عن denied by --deny-net أو denied by --deny-run. تفحص السياسة الأمر الذي يعمل فعلًا، لذا يُفحص الاستدعاء عبر الصدفة (shell) على أنه sh. شغّل العمليات الفرعية باستخدام execFileSync من node:child_process.

الخيوط والوصول الأصلي

البرنامجالخيوط افتراضيًاالوصول الأصلي افتراضيًا
JavaScript، TypeScriptلا ينطبق: يعمل عمّال node:worker_threads مع كل الخياراتمسموح
نقطة دخول Pythonمسموحةمسموح
نقطة دخول Python مع --sandbox أو إذن --allow-read/--allow-writeممنوعة؛ أضف --allow-threadsمسموح
Python تحت --interopممنوعة، حتى مع --allow-threadsمسموح
# threads.py
import threading
out = []
t = threading.Thread(target=lambda: out.append("worker ran"))
t.start(); t.join()
print(out[0])
elide python threads.py                                         # worker ran
elide --sandbox --allow-read=. python threads.py                # Creating threads is not allowed.
elide --sandbox --allow-read=. --allow-threads python threads.py  # worker ran

يمنع --no-native الوصول الأصلي. وعندها تفقد Python بعض الميزات، مثل مقابس AF_UNIX (AttributeError: module 'socket' has no attribute 'AF_UNIX') والإشارات الاعتباطية، ويصبح بدء تشغيلها أبطأ. يصرّح --allow-native بالقيمة الافتراضية صراحةً؛ والجمع بينه وبين --no-native خطأ استخدام (رمز الخروج 2).

ضبط الحدود

ينطبق --limit على برامج JavaScript و TypeScript. القيمة رقم، أو 0 للمنع، أو unlimited وهي الافتراضية. وأي أسماء أو لغات أو أوامر أخرى أخطاء استخدام.

elide --limit=workers=4 --limit=fds=128 --max-mem=512m --timeout=30s run app.js

يرث العمّال أذونات العملية الأم. لا تعزل هذه الخيارات العملية عن انهيار أصلي.

اختيار ملف تعريف

ملف التعريف الافتراضي هو --sandbox=trusted. أما --sandbox=sandboxed و --sandbox=isolated فغير متاحين ويخرجان بالرمز 2.

الخيارات

الخيارالأثر
--sandboxيمنع الوصول إلى نظام الملفات. ويبقى الوصول إلى الشبكة والعمليات الفرعية مسموحًا.
--allow-read[=PATHS]يسمح بالقراءة في كل مكان، أو في المسارات المذكورة. ويستلزم --sandbox.
--allow-write[=PATHS]يسمح بالكتابة في كل مكان، أو في المسارات المذكورة. ويستلزم --sandbox.
--fs-auditيسجّل كل قرار يخص نظام الملفات في stderr.
--allow-net[=HOSTS]يسمح بكل وصول إلى الشبكة، أو بالمضيفين المذكورين فقط (HOST أو HOST:PORT).
--allow-run[=CMDS]يسمح بكل العمليات الفرعية، أو بالأوامر المذكورة فقط.
--deny-net=HOSTSيمنع مضيفين حتى لو كانوا مسموحين.
--deny-run=CMDSيمنع أوامر حتى لو كانت مسموحة.
--allow-env[=NAMES]يتيح لـ elide.pkl قراءة مزيد من متغيرات البيئة، أو جميعها. ولا يتغير process.env.
--allow-threadsيسمح بخيوط Python داخل العزل.
--allow-nativeيسمح بالوصول الأصلي (الافتراضي).
--no-nativeيمنع الوصول الأصلي.
--limit=workers=Nيحدّ عدد العمّال النشطين؛ وتجاوزه يرمي ERR_WORKER_LIMIT.
--limit=fds=Nيحدّ عدد مقابض node:fs المفتوحة؛ وتجاوزه يرمي EMFILE.
--max-mem=SIZEيحدّ حجم الكومة؛ وتجاوزه خطأ نفاد ذاكرة مع رمز خروج غير صفري.
--timeout=DURATIONيوقف البرنامج بعد DURATION برمز الخروج 124.

تُفصل عناصر القوائم بفواصل. ويحتاج --deny-net و --deny-run إلى الصيغة ذات =.

أمثلة

هل كانت هذه الصفحة مفيدة؟