مطابقة الضوابط
تربط هذه الوثيقة ميزات نزال بأطر الضوابط التي تُدقَّق الجهات الخاضعة للتنظيم وفقها. هي مطابقة وليست شهادة: نزال غير معتمد وفق أي من هذه الأطر ولا يمكن لأي منتج أن يكون "ممتثلًا" نيابة عن العميل. ما يستطيع المنتج فعله هو تطبيق الضوابط وإنتاج الأدلة. وما يلي يبيّن بالضبط أي الضوابط يطبّقها وأين في الشيفرة. ويبيّن أيضًا كيف تُثبتها لمدقّقك.
تم التحقق من كل صف بالرجوع إلى هذا المستودع لا من الذاكرة. ويذكر الصف ذلك صراحةً حيث ينفّذ نزال جزءًا من الضابط ويتولى العميل الباقي. فالمطابقة التي تدّعي أكثر مما تفعل أسوأ من عدمها لأن مدقّقك سيجد الفجوة ثم يفقد الثقة في بقية الجدول.
الأطر المشمولة:
- NCA Essential Cybersecurity Controls (ECC-1:2018)
- SAMA Cyber Security Framework (v1.0)
- ISO/IEC 27001:2022 Annex A
- قانون حماية البيانات الشخصية (PDPL) فيما يتعلق بإقامة البيانات
كيفية استخدام هذه الوثيقة
سيطلب مدقّقك أدلة لا ادعاءات. يسمّي عمود الأدلة في كل صف شيئًا يمكنك إنتاجه من تثبيت قيد التشغيل: تصديرًا أو شاشة أو ملفًا. أنتجه مرة واحدة أثناء التحضير واحتفظ به مع وثائق ضوابطك. تصدير سجل التدقيق موقَّع ولذا يمكن تسليمه والتحقق منه دون الوصول إلى الكلستر.
الهوية والوصول
| الضابط | NCA ECC | SAMA CSF | ISO 27001 | ما يفعله نزال | الأدلة |
|---|---|---|---|---|---|
| اتحاد الهوية | 2-2-3 | 3.3.5 | A.5.16 | تُفوَّض المصادقة إلى مزوّد الهوية لديك عبر OIDC (رمز التفويض مع PKCE) أو SAML 2.0. لا يحتفظ نزال بأي كلمات مرور لمستخدمي الهوية الموحّدة | الإعدادات → الأمان تعرض المزوّد المضبوط. GET /api/v1/auth/providers |
| المصادقة متعددة العوامل | 2-2-3 | 3.3.5 | A.5.17 | TOTP للحسابات المحلية بأي تطبيق مصادقة مجاني وعشرة رموز استرداد. ولا يُتصل بأي شيء خارج الكلستر. ويمكن فرضه عليها جميعًا بسياسة. وإعادة تعيين حساب تُلزمه بالتسجيل من جديد عند دخوله التالي. أما مستخدمو الهوية الموحّدة فيخضعون لما يفرضه مزوّد الهوية لديك | الإعدادات → الأمان → سياسة MFA. يسجّل سجل التدقيق التفعيل وإعادة التعيين |
| تخزين كلمات المرور | 2-2-3 | 3.3.5 | A.5.17 | Argon2id (api/internal/localauth). لا تُسجَّل كلمات المرور أبدًا ولا تظهر في نسخة احتياطية بنص صريح |
مراجعة الشيفرة المصدرية. لا تحوي النسخة الاحتياطية سوى التجزئة |
| الوصول المستند إلى الأدوار | 2-2-3 | 3.3.5 | A.5.15 | ثلاثة أدوار: المطوّر وقائد الفريق والمشرف. تُطبَّق في API وليس في واجهة المستخدم وحدها أبدًا. ويفرض webhook القبول القواعد نفسها على kubectl |
المشرف → المستخدمون. GET /api/v1/rbac/matrix يطبع المصفوفة الكاملة |
| تسجيل الجلسات ذات الصلاحيات المميزة | 2-2-4 | 3.3.6 | A.8.15 | تُسجَّل كل جلسة طرفية عبر الويب بمن فتحها وأي Pod دخلت إليه ومتى ولماذا انتهت. والمدخل محفوظ في سجل التدقيق المسلسل بالتجزئة ولا يُحذف أبدًا. ولا يمكن إعادة عرض الجلسات: فنزال لا يسجّل نزال ضغطات المفاتيح ولا المخرجات | المشرف → جلسات الطرفية. مدخل سجل التدقيق لكل جلسة |
| حدود الجلسات ذات الصلاحيات المميزة | 2-2-4 | 3.3.6 | A.8.15 | مهلة خمول (15 دقيقة افتراضيًا) ومدة قصوى (4 ساعات افتراضيًا) لكل فريق. ويُسجَّل سبب الإغلاق على كل جلسة مغلقة | المشرف → الحصص. تعرض قائمة الجلسات سبب انتهاء كل منها |
| إبطال الجلسات | 2-2-3 | 3.3.5 | A.5.18 | يُعاد قراءة الأدوار من قاعدة البيانات مع كل طلب ولذا يسري إبطال الدور فورًا لا عند انتهاء صلاحية الرمز | أزل دورًا ولاحظ رفض الطلب التالي |
| الحماية من هجمات التخمين | 2-2-3 | 3.3.5 | A.8.5 | عشر كلمات مرور خاطئة تقفل حسابًا واحدًا. وستون محاولة فاشلة تستنفد حصة عنوان عميل واحد عبر جميع نقاط النهاية غير المصادَق عليها. تبقى العدادات بعد إعادة التشغيل | مدخلات التدقيق لحالات القفل. الورقة البيضاء للأمان |
التسجيل والمراقبة
| الضابط | NCA ECC | SAMA CSF | ISO 27001 | ما يفعله نزال | الأدلة |
|---|---|---|---|---|---|
| مسار التدقيق | 2-12-1 | 3.3.13 | A.8.15 | كل إجراء لكل مستخدم مدخل مرتبط بالمدخل السابق عبر SHA-256. ترفض قاعدة البيانات عمليات UPDATE وDELETE على الجدول. والتسجيل متوقف في التثبيت الجديد حتى يشغّله المشرف ويُكتب تشغيله وإيقافه دائمًا | المشرف → التدقيق → التحقق (Verify) يفحص السلسلة كاملة. ويبيّن مدخل audit.recording.on متى بدأ التسجيل |
| كشف التلاعب | 2-12-1 | 3.3.13 | A.8.15 | أي تعديل يقطع السلسلة ويبلّغ Verify عن موضعه. تُوقَّع عمليات التصدير بمفتاح ed25519 الخاص بالتثبيت |
صدّر حزمة أدلة. تحقق منها بالمفتاح العام المنشور |
| الاحتفاظ بالسجلات | 2-12-3 | 3.3.13 | A.8.15 | تُحفظ المدخلات حتى تحذفها audit.retention.days في قيم Helm. والافتراضي 0 يحفظ كل المدخلات. ومع audit.retention.onlyArchived تُحذف فقط المدخلات التي يحفظها أرشيف موقّع. وتُكتب كل عملية حذف في السجل وتبقى السلسلة الباقية قابلة للتحقق |
المشرف → التدقيق. GET /api/v1/audit/archives |
| التخزين بالكتابة مرة واحدة | 2-12-3 | 3.3.13 | A.8.15 | يمكن كتابة الأرشيفات إلى مخزن الكائنات الخاص بك. فعّل قفل الكائنات (object lock) على الـ bucket فلا يستطيع أحد ولا حتى مشرف نزال تعديلها أو حذفها حتى انتهاء مدة الاحتفاظ | الإعدادات → تخزين الأدلة تبيّن هل قفل الكائنات مفعّل على الـ bucket |
| التكامل مع SIEM | 2-12-2 | 3.3.13 | A.8.16 | إرسال مباشر إلى SIEM لديك عبر syslog (RFC 5424 عبر TCP أو UDP) أو HTTP JSON | الإعدادات → SIEM. تظهر المدخلات في جامع السجلات لديك |
| المراقبة | 2-12-2 | 3.3.13 | A.8.16 | مقاييس Prometheus مع أمثلة لقواعد التنبيه. تغطي معدلات الطلبات والأخطاء وزمن الاستجابة. وتغطي أيضًا البيئات حسب المرحلة وانتهاء الترخيص إلى جانب المساحة الحرة في وحدة تخزين البيانات وتوقف رأس سجل التدقيق | /metrics. قسم المراقبة في دليل المشرف |
حماية البيانات وإقامتها
| الضابط | NCA ECC | SAMA CSF | ISO 27001 / PDPL | ما يفعله نزال | الأدلة |
|---|---|---|---|---|---|
| إقامة البيانات | 1-1-1 و4-1-2 | 3.3.14 | PDPL Art. 29 | يعمل نزال بالكامل داخل الكلستر الخاص بك. لا يُجري أي اتصالات صادرة: لا قياس عن بُعد (telemetry) ولا تحقق من التحديثات ولا اتصال بالمورّد للتحقق من الترخيص. يتحدث فقط إلى نقاط النهاية التي هيّأها المشرف لديك: API الكلستر إلى جانب خادم git وسجل الصور ومزوّد الهوية ومرحّل SMTP وSIEM لديك. واختياريًا يصل أيضًا إلى نقطة نهاية ذكاء اصطناعي ومخزن كائنات تحددهما أنت | قائمة السماح لحركة الخروج في NetworkPolicy (charts/nezal/templates/networkpolicy.yaml). make netpol-check |
| التحقق من الترخيص دون اتصال | — | — | — | الترخيص ملف موقَّع بـ ed25519 يُتحقق منه محليًا مقابل مفتاح مضمَّن في الملف التنفيذي. ويعمل في بيئة معزولة تمامًا | تثبيت معزول عن الإنترنت |
| التشفير أثناء النقل | 2-7-1 | 3.3.9 | A.8.24 | HSTS في كل استجابة عند تهيئة TLS. يقدّم webhook القبول وسجل الصور المضمَّن TLS من شهادات يصدرها المشغّل ويجدّدها | curl -I على لوحة التحكم. شهادة سجل الصور |
| التشفير عند السكون (النسخ الاحتياطية) | 2-7-1 | 3.3.9 | A.8.24 | تُشفَّر نسخ قاعدة البيانات الاحتياطية وأرشيفات التدقيق بـ AES-256-GCM قبل كتابتها في أي مكان. ويُحفظ المفتاح في Secret في Kubernetes وليس داخل النسخة الاحتياطية عن قصد | يبدأ ملف النسخة الاحتياطية بـ NEZALENC. nezal-api verify-backup |
| التشفير عند السكون (وحدة التخزين) | 2-7-1 | 3.3.9 | A.8.24 | مسؤوليتك. يكتب نزال إلى PersistentVolume. وتشفيره مهمة فئة التخزين لديك | تهيئة StorageClass لديك |
| التعامل مع الأسرار | 2-7-2 | 3.3.9 | A.8.24 | تُحفظ بيانات الاعتماد في Secrets في Kubernetes وليس في قاعدة البيانات أبدًا. لا يعيد API بيانات اعتماد مخزّنة أبدًا. وتحجب حزمة الدعم هذه البيانات. ويتحقق من ذلك اختبار يغرس قيمًا معروفة | يعيد GET /api/v1/settings/* القيمة secretConfigured ولا يعيد السر أبدًا |
التطوير والتغيير
| الضابط | NCA ECC | SAMA CSF | ISO 27001 | ما يفعله نزال | الأدلة |
|---|---|---|---|---|---|
| فصل البيئات | 2-6-1 | 3.3.8 | A.8.31 | في الوضع المشترك تكون كل بيئة مطوّر مساحة أسماء مستقلة لها حصتها وحدودها. وفي الوضع الكامل تكون كل بيئة نسخة كاملة في مساحة أسماء مساحة العمل ولها NetworkPolicy خاصة بها. وفي الحالتين لا تصل بيئة إلى بيئة أخرى ولا إلى نظام نزال ولا إلى العقد ولا إلى عنوان البيانات الوصفية للسحابة (cloud metadata). وتستطيع بيئة الوضع الكامل الوصول إلى الإنترنت | kubectl get networkpolicy. الـ NetworkPolicy الخاصة بكل بيئة |
| بيانات الاختبار | 2-6-2 | 3.3.8 | A.8.33 | مسؤوليتك. ينسخ نزال تعريف النشر لا البيانات: تتحول طلبات وحدات التخزين الدائمة (PersistentVolumeClaim) إلى مجلدات فارغة في البيئة ويشير تحذير إلى ذلك. وما تحويه قاعدة بيانات الأساس المشترك قرارك أنت | التحذير عند إنشاء البيئة. قسم الفجوات المعروفة في الورقة البيضاء |
| البناء الآمن | 2-6-3 | 3.3.8 | A.8.28 | تعمل عمليات البناء بوصفها Jobs دون صلاحيات مميزة في مساحة أسماء خاصة بها دون رمز حساب خدمة ومع حركة خروج محدودة بقائمة سماح. لا يوجد Docker daemon ولا مقبس (socket) من المضيف في أي مكان | charts/nezal/templates/build-namespace.yaml |
| فحص الثغرات | 2-10-1 | 3.3.11 | A.8.8 | مسؤوليتك. لا يفحص نزال الصور ولا يعتمد على أي أداة فحص. تُدفع كل صورة مبنية إلى سجلك حيث تستطيع أداة الفحص الخاصة بك أن تفحصها | تقارير أداة الفحص لديك عن السجل |
| اعتماد التغييرات | 2-6-1 | 3.3.8 | A.8.32 | يمر كل تغيير عبر API مع RBAC الخاص به وwebhook القبول ويُدقَّق. لا يقرأ الوكيل الذكي إلا بيئة المطوّر نفسه ويقترح كل تغيير. ويعتمده المطوّر قبل أن يُنفَّذ. ويسجّل مدخل التدقيق الاسمين معًا | مدخلات سجل التدقيق لأي تغيير |
| النسخ الاحتياطي والاستعادة | 2-9-1 | 3.3.10 | A.8.13 | نسخ احتياطية مشفَّرة مجدولة إلى جانب إجراء استعادة موثَّق ودليل تشغيل (runbook) موثَّق للتعافي من الكوارث. وكلاهما يُمارَس في تدريبات تُجرى قبل كل إصدار | دليل التعافي من الكوارث. make e2e-restore وmake e2e-dr |
ما لا يفعله نزال
يُقال بوضوح لأن المطابقة التي تخلو من هذا القسم لا تُصدَّق:
- لا يصنّف بياناتك. التزامات PDPL بشأن البيانات الشخصية التي تحتفظ بها وسبب احتفاظك بها هي التزاماتك أنت. يحتفظ نزال بهويات المستخدمين ومسار التدقيق لما فعلوه.
- لا يشفّر وحدة تخزين البيانات. تلك مهمة فئة التخزين لديك.
- لا يدير مزوّد الهوية لديك. سياسة كلمات المرور ودورة حياة الحسابات وعمليات الانضمام والانتقال والمغادرة كلها في مزوّد الهوية لديك لا هنا.
- لا يفحص الصور. ولا يعتمد على أي أداة فحص. تفحص أداتك الصور الموجودة في سجلك.
- لا يوقّع صور المعاينة. فهي تُبنى من فرع وتستخدمها بيئة واحدة. وتُحذف معها. أما خط الإصدار فيوقّع ما يُطرح للعملاء.
- غير معتمد وفق أي إطار. لم يقيّمه أي طرف ثالث. يبيّن هذا الجدول لمقيّمك أين ينظر.
الحفاظ على دقة هذه الوثيقة
أي صف يبالغ فيما يفعله نزال خلل. أبلغ عنه كما تبلغ عن أي خلل آخر. تم التحقق من كل صف مقابل الشيفرة وقت الكتابة. ويستحق هذا التحقق أن يُكرَّر مع كل إصدار بدلًا من افتراض استمرار صحته.