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

الأمان

الأمان مدمج في التصميم لا مضاف لاحقًا. تلخّص هذه الصفحة الضوابط المطبَّقة في الشيفرة.

المصادقة والجلسات

الضابط التفصيل
eID هو وسيلة الدخول الوحيدة الدخول التفاعلي الوحيد عبر eID (رمز الاستجابة السريعة / App2App / إشعار برقم السجل). ولا توجد أيّ واجهة لكلمات المرور إطلاقًا
رمز وصول JWT + رمز تحديث رموز التحديث تدور؛ ويحميها claim باسم kind
قائمة رفض عند الخروج يضع تسجيلُ الخروج قيمةَ jti لرمز الوصول في Redis طوال مدّته المتبقّية، ويتحقّق منها الوسيط في كلّ طلب
شهادة المواطن (ICP) يعيد إتمامُ الدخول شهادةَ المواطن (DER)، وتُحلَّل بـ crypto/x509؛ ويُحفظ الرقم التسلسلي ونافذة الصلاحية والجهة المُصدِرة
الربط بحساب Google للربط فقط — مفهرس على عمود موضوع ثابت

غياب كلمات المرور مقصود

ما دام لا يوجد مسار لكلمات المرور، فإنّ ضوابط مثل HIBP أو bcrypt أو كشف كلمات المرور المسرَّبة غير منطبقة. وتبقى في الشجرة حالات استخدام قديمة لكلمة المرور/OTP، لكنّها غير قابلة للوصول من أيّ مسار. وإذا أُعيد كشف مسار بكلمة مرور يومًا ما، فأوصِل فحص HIBP قبل إطلاقه.

طبقة البيانات

  • استعلامات مُمَعْلَمة فقط (pgx) — دون دمج نصوص ودون ORM.
  • الأمان على مستوى الصفّENABLE وFORCE على كلّ جدول خاصّ بالمستخدمين: users، وorganizations، وorganization_memberships، وجداول المواطنين gov_*، وuser_integrations. وتُقاد السياسات بمتغيّرات app.user_id / app.user_role المضبوطة لكلّ معاملة عبر SET LOCAL.
  • لا هوية ⇐ صفر صفوف (الفشل نحو الإغلاق)، ما يقي من الإفشاء العرضي.

حارس RLS عند الإقلاع

عند التشغيل يفحص التطبيق دورَه في قاعدة البيانات. وفي الإنتاج يؤدّي الدور خارق الصلاحيات أو BYPASSRLS إلى فشل الإقلاع — وإلّا لما طُبِّقت سياسات RLS بصمت. أمّا في التطوير فيكتفي بالتحذير.

ويحتاج كلّ جدول جديد خاصّ بالمستخدمين إلى سياساته الخاصّة.

الأسرار والتشفير

ماذا كيف
رموز OAuth للأطراف الثالثة تُختم بـ AES-256-GCM قبل التخزين (INTEGRATION_ENC_KEY)
معرّفات الرموز / الجلسات crypto/rand مع أخذ عيّنات بالرفض لتفادي انحياز باقي القسمة
المصادقة الثنائية للمشرف الأعلى (TOTP) مشفَّرة أيضًا بـ INTEGRATION_ENC_KEY

لا تُدوّر INTEGRATION_ENC_KEY في مكانها أبدًا

تغيير مفتاح مستقرّ يُفسد كلّ القيم المشفَّرة سابقًا. ويكتبه سكربت النشر مرّة واحدة فقط عند غيابه (غير تراكمي الأثر).

طبقة الويب والشبكة

  • ترويسات الأمان — CSP default-src 'none'، وHSTS (في الإنتاج)، وnosniff، وX-Frame-Options: DENY، وReferrer-Policy، وPermissions-Policy، وCOOP/CORP/COEP.
  • CORS — قائمة مصادر مسموح بها بصرامة؛ ولا يُجمع * مع بيانات الاعتماد أبدًا.
  • حدود حجم الجسم — سقف عامّ، إضافةً إلى 4 كيبي بايت على /auth.
  • مهل الخادم الكاملةReadHeader 10 ثوانٍ، وRead 30 ثانية، وWrite 70 ثانية، وIdle 120 ثانية، وMaxHeaderBytes 16 كيبي بايت (دفاعًا ضدّ slowloris والترويسات المفرطة).
  • مهلة لكلّ طلب — 30 ثانية عمومًا؛ و/ai/* تحصل على 50 ثانية (إذ يستغرق تحويل النصّ إلى كلام والعكس لدى Gemini عادةً من 10 إلى 20 ثانية، وهو ما لم يتّسع له سقف الثلاثين ثانية).
  • تحديد المعدّل/auth نحو 5/دقيقة، و/ai/* نحو 20/دقيقة، ومحادثة الصفحة الرئيسية المجهولة /public/ai/chat نحو 6/دقيقة — لكلّ عنوان IP.
  • Permissions-Policycamera=(), microphone=(self), geolocation=(). ويُسمح بالميكروفون لهذا المصدر وحده (إذ تستدعي محادثة الذكاء الاصطناعي الصوتية getUserMedia)؛ ومع microphone=() يرفضه المتصفّح فورًا دون أن يسأل حتى.

الواجهة الأمامية (نمط BFF)

لا يخاطب المتصفّح سوى مسارات /api/* من المصدر نفسه. وتعيش الرموز في كعكات httpOnly ولا تصل أبدًا إلى شيفرة العميل. ويحمل كلّ نداء يغيّر الحالة ترويسة x-dgov-csrf يتحقّق منها الخادم بـ checkOrigin — دفاع CSRF مزدوج.

سجلّ التدقيق

مترابط بالبصمات ولا يقبل إلّا الإضافة:

chain_hash = SHA-256(prev_hash ‖ canonical-json(القيد))

وتُسلسَل عمليات الكتابة بـ pg_advisory_xact_lock؛ ويجعل VerifyChain أيّ عبث ظاهرًا. والقراءة للإدارة فقط.

التخويل (RBAC)

كتالوج ديناميكي للأدوار والصلاحيات على أربعة مستويات: المشرف الأعلى ← المشرف ← المدير ← المستخدم. وتحمي المساراتِ وسائطُ RequirePermission / RequireAdmin. والمشرف الأعلى هو الدور الوحيد الذي يدير حسابات المشرفين، ولا يُنشأ عبر واجهة البرمجة إطلاقًا — بل من قاعدة البيانات أو البيئة فقط.

التحصين التشغيلي

في الإنتاج يُحجب /metrics و/swagger/doc.json خلف رمز bearer (بمقارنة ثابتة الزمن، مع 404 عند الإخفاق). والسجلّات مهيكلة بـ Zap مع معرّف طلب، ولا تُسجَّل الأسرار أبدًا.

خارطة طريق ASVS

المستوى الحالة
L1 ✅ HTTPS + HSTS، ودخول بلا كلمة مرور، واستعلامات مُمَعْلَمة، وترويسات، وCORS صارم، والتحقّق من المدخلات، وتسجيل مهيكل، ولا أسرار في المستودع. ⏳ فحص الحاويات / govulncheck
L2 ✅ تحديد المعدّل، وتدوير رموز التحديث، وربط جهاز eID (مقاوم للتصيّد)، ومهل الطلبات، وتشفير رموز التكامل، وتدقيق مترابط. ⏳ جدار حماية تطبيقات، وSIEM مركزي، واختبار استعادة النسخ، وخطّة استجابة للحوادث
L3 ◻ تشفير البيانات الشخصية على مستوى الحقل (KMS)، وmTLS، وإثبات منشأ SLSA L3، واختبار اختراق خارجي — خارج نطاق القالب

الثغرات المعروفة

  • واجهة Swagger التفاعلية — لا يُقدَّم سوى الوصف الخام على /swagger/doc.json (حمّله في Swagger Editor أو Postman).
  • مصفوفة الضوابط الكاملة موجودة في backend/docs/SECURITY.md.

الإبلاغ عن ثغرة

الرجاء عدم فتح تذكرة علنية. اتّبع الإجراء الوارد في SECURITY.md.