الأمان¶
الأمان مدمج في التصميم لا مضاف لاحقًا. تلخّص هذه الصفحة الضوابط المطبَّقة في الشيفرة.
المصادقة والجلسات¶
| الضابط | التفصيل |
|---|---|
| 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. - مهل الخادم الكاملة —
ReadHeader10 ثوانٍ، وRead30 ثانية، وWrite70 ثانية، وIdle120 ثانية، وMaxHeaderBytes16 كيبي بايت (دفاعًا ضدّ slowloris والترويسات المفرطة). - مهلة لكلّ طلب — 30 ثانية عمومًا؛ و
/ai/*تحصل على 50 ثانية (إذ يستغرق تحويل النصّ إلى كلام والعكس لدى Gemini عادةً من 10 إلى 20 ثانية، وهو ما لم يتّسع له سقف الثلاثين ثانية). - تحديد المعدّل —
/authنحو 5/دقيقة، و/ai/*نحو 20/دقيقة، ومحادثة الصفحة الرئيسية المجهولة/public/ai/chatنحو 6/دقيقة — لكلّ عنوان IP. - Permissions-Policy —
camera=(), microphone=(self), geolocation=(). ويُسمح بالميكروفون لهذا المصدر وحده (إذ تستدعي محادثة الذكاء الاصطناعي الصوتيةgetUserMedia)؛ ومعmicrophone=()يرفضه المتصفّح فورًا دون أن يسأل حتى.
الواجهة الأمامية (نمط BFF)¶
لا يخاطب المتصفّح سوى مسارات /api/* من المصدر نفسه. وتعيش الرموز في كعكات
httpOnly ولا تصل أبدًا إلى شيفرة العميل. ويحمل كلّ نداء يغيّر الحالة ترويسة
x-dgov-csrf يتحقّق منها الخادم بـ checkOrigin — دفاع CSRF مزدوج.
سجلّ التدقيق¶
مترابط بالبصمات ولا يقبل إلّا الإضافة:
وتُسلسَل عمليات الكتابة بـ 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.