العزل
الحالة: مُخطَّط (المرحلة 1). مضيف الإضافات (
maktaba-plugind) وعزل نظام التشغيل الخاص به واختبارات منع الاتصال الخارجي في التكامل المستمر لم تُبنَ بعد. تصف هذه الصفحة التصميم الوارد في الملحمة 54، الأقسام 4.7 و4.9 و5، وقد يتغير.
القاعدة
لا تستطيع إضافتك، ولا العملية التي تشغّلها، إرسال أو استقبال بايت واحد عبر أي واجهة شبكة، بما فيها واجهة الاسترجاع (loopback). المنفذ الوحيد هو الواجهة البرمجية للإضافات عبر مقبس unix، ولا يصل إلا إلى الواجهة البرمجية للخادم المنزلي نفسه. أما الخادم المنزلي نفسه فقد يتواصل مع المتجر؛ وتلك شيفرة مكتبة لا شيفرتك.
الطبقة 1: مكوّن WebAssembly
تعمل الإضافات بوصفها مكوّنات WebAssembly (WASI 0.2، نموذج المكوّنات) داخل مضيف مكتوب بلغة Rust يضمّن Wasmtime. ولا يستطيع المكوّن أن يستدعي إلا ما يربطه المضيف به.
المربوط:
maktaba:plugin/*، أي الواجهة البرمجية للإضافات (راجع مراحل الطابور والواجهة البرمجية للإضافات)؛wasi:clocks(الرتيبة وساعة الحائط)، وwasi:random، وwasi:io/streams؛wasi:cli/stdoutوstderrوenvironmentوexit، مع بيئة فارغة ودون وسائط. يذهب الخرج القياسي وخرج الأخطاء إلى سجل إضافتك، بمعدّل محدود.
غير المربوط أبدًا: wasi:sockets، وwasi:http، وwasi:filesystem، وwasi:cli/stdin،
وواجهات الطرفية، وأي واجهة للعمليات أو للتنفيذ (exec).
المكوّن الذي يستورد واجهة محظورة يفشل في تدقيق التثبيت بالرمز plugin_forbidden_import، وكان
سيفشل في الإنشاء حتى لو تجاوز التدقيق. ويتحقق التدقيق أيضًا من أن كل واجهة maktaba:plugin
تستوردها تغطيها قدرة أعلنت عنها (plugin_undeclared_import).
تحصل كل مهمة على مخزن Wasmtime جديد. ولا تبقى أي حالة بين المهام إلا ما تحفظه عبر واجهة data
أو نقطة حفظ (checkpoint).
الطبقة 2: عزل نظام التشغيل
يطبّق مضيف الإضافات عزل نظام التشغيل على نفسه قبل أن يحمّل أي إضافة، ويرفض العمل إن لم يستطع ذلك.
| نظام التشغيل | الطريقة | الشبكة | الملفات |
|---|---|---|---|
| macOS | ملف تعريف Seatbelt | كل اتصال شبكي مرفوض عدا مقبسَي unix الاثنين | يقرأ ملفه التنفيذي ومجلد الإضافات وذاكرة الترجمة المؤقتة؛ ويكتب في مجلد التشغيل والمساحة المؤقتة |
| Linux | مساحات أسماء المستخدم والشبكة والتركيب وIPC وPID حيث يُسمح بها؛ وseccomp-bpf دائمًا (مقابس AF_UNIX فقط)؛ وLandlock للملفات |
لا واجهات؛ وعائلات المقابس الأخرى تجيب بـ EPERM |
Landlock: قراءة الإضافات وذاكرة الترجمة المؤقتة، وكتابة مجلد التشغيل والمساحة المؤقتة |
| Windows | حاوية AppContainer بلا قدرات، داخل Job Object | الاتصال الصادر محجوب عن الحاوية | المجلدات التي تمنح قوائم التحكم بالوصول (ACL) فيها الإذن للحاوية فقط |
إن افتقرت نواة Linux إلى بعض الطبقات (لا Landlock، ولا مساحات أسماء للمستخدم)، يظل المضيف يعمل
فقط إن كان seccomp مفعّلًا، ويبلّغ بالحالة متدهور مع sandbox_partial. أما دون seccomp على
Linux، أو دون ملف تعريف Seatbelt أو AppContainer، فلا يعمل.
كيف يُثبَت ذلك
تعمل مهمة في التكامل المستمر على macOS وLinux وWindows مع كل تغيير في المضيف أو الواجهة البرمجية للإضافات أو مخطط البيان، وكل ليلة:
- مكوّنات عدائية تجرّب الاستيرادات المحظورة، والحلقات اللانهائية، وقنابل الذاكرة، والاستدعاءات دون قدرة أو خارج النطاق، وإغراق الواجهة البرمجية والسجل، والكتابات الزائدة عن الحجم، وعناوين URL في اللوحات. يجب أن يُرفض كل منها أو يُوقَف، وأن يواصل المضيف عمله.
- مجسّات الهروب في نسخة اختبارية من المضيف تطبّق العزل الحقيقي، ثم تحاول بوصفها شيفرة أصلية الاتصال بمستمع طُعم محلي، وحلّ الأسماء، وفتح مقابس خام، وربط منافذ، وقراءة ملفات النظام، والكتابة خارج مجلد التشغيل، وتشغيل عمليات. يجب أن تفشل كل محاولة، وألا يرى الطُعم أي اتصال.
- الضوابط الإيجابية تشغّل المجسّات نفسها دون العزل ويجب أن تنجح، حتى لا يمرّ مجسّ معطوب.
حدود الموارد
تضبط هذه القيم في [resources]. يفرضها المضيف، ويستطيع المشرف خفضها.
| المورد | الافتراضي | الأقصى |
|---|---|---|
| الذاكرة لكل مهمة | 256 MB | 1 GB |
الوقت الفعلي لكل مهمة (timeout_s) |
300 ثانية | 1,800 ثانية |
تعليمات المعالج لكل مهمة (fuel) |
مشتقّة من الوقت الفعلي | |
المهام المتزامنة (concurrency) |
2 | 8 |
المساحة المؤقتة لكل مهمة (scratch_mb) |
0 | 512 MB |
بياناتك الخاصة (data_mb) |
50 MB | 1 GB |
| المخرجات (الترجمات المصاحبة، الصور الفنية) | 200 MB | 2 GB |
| استدعاءات الواجهة البرمجية للإضافات | 200 في الثانية لكل مهمة | |
| كتابة قيمة واحدة / مُخرَج واحد | 64 KB / 4 MB | |
| أسطر السجل | 100 في الثانية، و10 MB في اليوم، و8 KB للسطر | |
| حجم الحزمة | 50 MB |
المساحة المؤقتة مخزن بايتات في الذاكرة يُوصَل إليه عبر استدعاءات job.scratch-*، وليست نظام
ملفات. وتُحذف عند انتهاء المهمة.
يتشارك الخادم المنزلي كله مجمّعًا واحدًا باسم plugins، حجمه افتراضيًا max(1, cores / 4)،
وتحدّ قيمة concurrency لديك حصتك داخله.
عزل الأعطال
| ما يحدث | الأثر |
|---|---|
| تتعطل مهمتك بخطأ فادح (trap)، أو تتجاوز المهلة، أو تبلغ حد ذاكرتها | تفشل تلك المهمة؛ ويواصل المضيف عمله |
| تتوقف عملية المضيف | تعيد عملية الإشراف (supervisor) تشغيلها؛ وتعود المهام الجارية إلى الطابور دون احتساب محاولة |
| تُغرق الواجهة البرمجية أو تملأ حصتك | تُرفض الاستدعاءات وتُحصى |
| تُغرق السجل | تُسقط الأسطر وتُحصى |
لا يحمّل عامل خط المعالجة شيفرة الإضافات أبدًا، لذا لا تستطيع الإضافة إسقاطه.
أسباب الفشل
| السبب | الفئة | إعادة المحاولة |
|---|---|---|
plugin_trap، plugin_timeout |
عابر | مرة واحدة (للمراحل محاولتان) |
plugin_memory، plugin_capability، plugin_scope، plugin_quota |
دائم لهذا العنصر | لا |
| الإضافة موقوفة أو مسحوبة | ينتظر الإضافة | لا تُستهلك محاولة |
قاطع الدائرة
توقف مكتبة إضافتك وتُعلم المشرفين حين يحدث، ضمن النافذة الزمنية:
- 5 أعطال أو أكثر من نوع الخطأ الفادح أو تجاوز المهلة أو فشل الذاكرة خلال 10 دقائق، أو
- فشل أكثر من نصف آخر 20 مهمة، أو
- 50 رفضًا أو أكثر من الواجهة البرمجية خلال 10 دقائق.
وتبقى موقوفة حتى يضغط المشرف زر البدء.
الصحة والسجلات
تذهب أسطر سجلك إلى سجلات مكتبة بالقيمة service = plugin.<id>، مع إصدارك ومعرّف المهمة
والمرحلة. سجّل برموز وحقول، لا بنص حر. تخزّن مكتبة نصوص الإضافات وتعرضها بعد تهريبها، وتستبعد
سجلات الإضافات من تقارير المشكلات ما لم يضمّنها المشرف.
تعرض صفحة الإضافات لكل إضافة: المرحلة، والمهام المنجزة والفاشلة حسب السبب، وزمن المهمة عند
p50 وp95، وذروة الذاكرة، والوقود المستهلك (fuel)، واستدعاءات الواجهة البرمجية ورفضها، واستخدام
البيانات والمخرجات مقارنةً بالحصة، وآخر خطأ.
ما يجوز لإضافتك وما لا يجوز
| يجوز | لا يجوز |
|---|---|
| قراءة ما تسمح به القدرات الممنوحة، في المكتبات الممنوحة | فتح المقابس، أو حلّ الأسماء، أو إرسال طلبات HTTP |
| كتابة بياناتها الخاصة والمخرجات التي مُنحت إذنها | رؤية نظام الملفات أو مسارات الملفات |
| قراءة وسائط موضوع المهمة عبر المقابض | قراءة المستخدمين، أو الجلسات، أو الرموز (tokens)، أو الأسرار |
| وضع المزيد من مراحلها الخاصة في الطابور | وضع مراحل مكتبة أو مراحل إضافات أخرى في الطابور |
| التسجيل وإرسال إشعارات للمشرف من نصوصها الخاصة | تشغيل عمليات أو العمل خارج مهمة |