
منصة استخبارات التهديدات ذاتية الاستضافة — تجميع التغذيات، والفرز بالذكاء الاصطناعي، وتغطية MITRE ATT&CK، وهندسة الكشف المتكاملة مع Sentinel. تعمل بشكل مستقل أو متكاملة بالكامل مع Azure.
منصة استخبارات تهديدات ذاتية الاستضافة تجمع خلاصات RSS من أكثر من 60 مورّدًا أمنيًا، وتُجري فرزًا بالذكاء الاصطناعي، وتربط النتائج بجرد الأصول لديك في RunZero، وتُظهر تنبيهات قابلة للتنفيذ عبر لوحة تحكم ويب بالوضع الداكن.
مصمّمة لتعمل بشكل مستقل مع الاعتماد الصفري على السحابة، أو مدمجة بالكامل في بيئة Azure/Entra/Sentinel — اختر الطبقة التي تناسب ما لديك.
جميع الطبقات الثلاث تشغّل نفس كود التطبيق تمامًا — الشيء الوحيد الذي يتغير هو متغيرات البيئة التي يتم تعيينها. راجع متغيرات البيئة للحصول على المرجع الكامل.```bash
./scripts/setup-basic.sh
./scripts/setup-basic-api.sh
./scripts/setup-azure.ps1
تقوم السكربتات البرمجية bash هذان بتشغيل حاوية Postgres محلية، وتطبيق المخطط، وإنشاء `backend/.env` / `frontend/.env.local` لك — ثم طباعة الأمرين لبدء التطبيق فعليًا (`pip install` + تشغيل الواجهة الخلفية، `npm install` + تشغيل خادم تطوير الواجهة الأمامية). `setup-azure.ps1` هو غلاف رفيع حول `infra/provision.ps1`، وهو دليل النشر الفعلي لـ Azure Container Apps.
---
## الميزات
- **تجميع التغذية** — يستقصي أكثر من 60 تغذية RSS أمنية من المستوى 1/2/3 وفق جدول زمني؛ يزيل التكرار ويصفّي المحتوى الترويجي تلقائيًا
- **الفرز بالذكاء الاصطناعي** — يصنّف كل مدخل حسب الخطورة (حرجة/عالية/متوسطة/منخفضة/معلوماتية)، وتقنيات MITRE ATT&CK، وملخص باللغة الإنجليزية البسيطة. معياري المزوّد: واجهة Anthropic API المباشرة أو Azure AI Foundry، قابل للتبديل عبر متغير بيئة واحد دون فقدان أي وظيفة في كلا الحالتين
- **استخراج مؤشرات الاختراق** — يستخرج تلقائيًا عناوين IP والنطاقات وعناوين URL وتجزئات الملفات وثغرات CVE من كل مدخل
- **تكامل RunZero** — يزامن جرد الأصول لديك ويربط معلومات التهديدات بالأصول الحية؛ يطابق ثغرات CVE وأسماء البرمجيات وإصدارات أنظمة التشغيل وعناوين IP. ثلاث علامات فرعية تحت `RUNZERO`: **المطابقات** (المدخلات المرتبطة بجردك، قابلة للتصفية حسب الخطورة/التاريخ/الثقة/KEV)، و**التعرض** (الوضع المؤكد/المحتمل على مستوى المؤسسة مع تتبع المعالجة)، و**المقاييس** (اتجاهات الاستقبال مقابل المعالجة بمرور الوقت)
- **مكدسك** — حدّد البرمجيات/نظام التشغيل في بيئتك؛ يعيد تقييم جميع المدخلات حسب الصلة
- **سجل مؤشرات الاختراق** — سجل قابل للبحث لجميع المؤشرات المستخرجة مع مراجع متقاطعة للمدخلات وتصدير STIX/CSV
- **مصفوفة MITRE ATT&CK** — خريطة حرارية لتغطية التقنيات عبر معلومات التهديدات المستوعبة
- **لوحة صحة التغذية** — حالة الاستقصاء لكل تغذية، وتتبع الإخفاقات المتتالية، وحجم المقالات على مدى 7 أيام
- **الاكتشافات** — واجهة مراجعة من 9 علامات (انظر أدناه) تغطي كل ما هو مسجّل كاكتشاف، سواء كان مولّدًا بالذكاء الاصطناعي، أو مستوردًا من ملفاتك الخاصة، أو مُزامَنًا من مساحة عمل Sentinel حية
- **مصادقة معيارية** — Microsoft Entra ID SSO مع وصول قائم على الأدوار، أو مفتاح API محلي مشترك واحد دون أي اعتماد على Azure. يُكتشف تلقائيًا بواسطة الواجهة الأمامية؛ انظر [أوضاع المصادقة](#auth-modes)
### ميزتان متعلقتان بالاكتشافات
يحتوي هذا المستودع فعليًا على شيئين مترابطين لكن قابلين للاستخدام بشكل مستقل تحت مظلة "الاكتشافات":
1. **علامة تبويب `DETECTIONS`** — واجهة مراجعة قائمة بذاتها، مقسّمة إلى تسع علامات فرعية:
- **جميع الاكتشافات** — الكتالوج الكامل للتحليلات المسجّلة، قابل للتصفية حسب التقنية/التصرف/حالة المراجعة، وكل منها قابل للتوسيع لعرض وصفه و KQL الكامل.
- **اكتشافات Defender المخصصة** — نفس الكتالوج، مقيّد بالاكتشافات الموجّهة لقواعد الاكتشاف المخصصة في Microsoft Defender for Endpoint بدلًا من قواعد تحليلات Sentinel.
- **مراجعات المواءمة** — كلما تم تسجيل تحليل اكتشاف مقابل تقنية MITRE، يقارن فحص بالذكاء الاصطناعي تغطيته الفعلية بوصف MITRE نفسه لتلك التقنية. وعندما ينحرف أو يغطي التقنية جزئيًا فقط، يظهر هنا كعنصر مراجعة بشري مع تعليل الذكاء الاصطناعي، وإصلاح KQL مقترح، ونتيجة التحقق الخاصة بذلك الإصلاح (بوابة ثابتة + اختبار خلفي) — وليس اقتراحًا أعمى أبدًا.
- **تنبيهات التصرف** — قائمة انتظار لكشف التآكل: أي تحليل معتمد تتدهور بياناته أو تبدأ قاعدته الأساسية في إظهار الأخطاء يُعلَّم هنا لإعادة المراجعة، ويُسمّى باكتشافه الخاص بدلًا من تقنية MITRE المشتركة فقط.
- **عمليات البحث المولّدة** — تُجمَّع الاكتشافات في عمليات بحث (واحدة لكل ملف مستورد اليوم؛ وواحدة لكل مقال معلومات تهديدات/مشروع detections.ai مصدر بمجرد إطلاق ذلك التكامل)، بما يطابق ميزة Hunts في Microsoft Sentinel نفسها. يمكن مزامنة عملية بحث إلى مساحة عمل Sentinel حقيقية ككائن `Microsoft.SecurityInsights/hunts` بالإضافة إلى استعلامات البحث المحفوظة المكوّنة لها (مقيّدة بـ `SENTINEL_HUNTING_SYNC_ENABLED` و `mode` — إيقاف/يدوي/تلقائي — قابل للتهيئة لكل فريق في الإعدادات > إعدادات API؛ وليس دفعًا تلقائيًا صامتًا أبدًا إلا إذا اشتركت في ذلك).
- **عمليات بحث Sentinel** — الجرد الحي لما هو منشور فعليًا في ميزة Hunting في مساحة عمل Sentinel لديك، مسحوبًا مباشرة من ARM بدلًا من سجل المزامنة الخاص بهذا التطبيق؛ ويتضمن اقتراحات اختبار/ضبط لكل استعلام يمكنك تطبيقها أو تجاهلها في مكانها.
- **قواعد تحليلات Sentinel** — نفس الفكرة لقواعد التحليلات في Microsoft Sentinel (`Microsoft.SecurityInsights/alertRules`) — وهو نوع مورد Sentinel متميز عن Hunting، لأن هذه هي ما يُطلق فعليًا الحوادث/التنبيهات وفق جدول زمني — مع نفس سير عمل تطبيق/تجاهل اقتراحات الضبط.
- **الاكتشافات المحلية** — انظر [التشغيل بدون Sentinel أو مزوّد ذكاء اصطناعي](#running-without-sentinel-or-an-ai-provider-local-detections-import) أدناه.
- **سجل التدقيق** (للمشرفين فقط) — سجل عبر المسارات لكل فحص شغّله هذا التطبيق فعليًا: نتائج بوابة/فحص التحكم للاكتشافات المولّدة بالذكاء الاصطناعي، ومحاولات مزامنة عمليات بحث Sentinel، وتشغيلات اختبار استعلامات بحث Sentinel/قواعد التحليلات، مجمّعة في قائمة واحدة مقسّمة إلى صفحات وقابلة للتصفية — تغطي عمدًا ما لا تغطيه أي علامة مراجعة منفردة بمفردها.
يعمل بالكامل داخل الواجهة الخلفية الرئيسية، دون حاجة إلى نشر إضافي لواجهة المراجعة نفسها. ويتبع تصميم API الخاص به عمدًا اصطلاحات detections.ai أدناه، رغم أنه قائم بذاته تمامًا.
2. **منسّق مسار detections.ai — قريبًا.** لدى detections.ai واجهة API عامة قيد التطوير لتوليد الاكتشافات بمساعدة الذكاء الاصطناعي، وهذا المستودع يحتوي على تكامل حقيقي مبني لها (`backend/detection_pipeline/orchestrator.py`) يأخذ معلومات التهديدات المفروزة، ويفحصها مقابل تغطية الاكتشافات الحالية، ويولّد مسودة KQL لمساحة عمل Sentinel لديك كمهمة مجدولة. سيدعم هذا التكامل تلك الواجهة بمجرد توفرها، وهو ليس جزءًا من هذا الإصدار العام بعد. في غضون ذلك، **لا تحتاج إليه لاستخدام علامة تبويب الاكتشافات على الإطلاق** — [استيراد الاكتشافات المحلية](#running-without-sentinel-or-an-ai-provider-local-detections-import) أدناه يغطي نفس هدف "إدخال اكتشافات حقيقية إلى هذا التطبيق" لإعدادات خالية من التوليد بالذكاء الاصطناعي وخالية من Sentinel اليوم.
### التشغيل بدون Sentinel أو مزوّد ذكاء اصطناعي: استيراد الاكتشافات المحلية
بالنظر إلى اسم التطبيق وعرضه الأساسي، فمن المرجح أن يكون السؤال الأكثر شيوعًا من مستضيف ذاتي على الطبقة **الأساسية** هو *"ليس لديّ Sentinel أو مزوّد ذكاء اصطناعي مُهيّأ — هل يمكنني مع ذلك الاستفادة من علامات تبويب الاكتشافات/عمليات البحث؟"* الجواب نعم: وجّه التطبيق إلى مجلد من ملفات قواعد الاكتشاف الخاصة بك (مكتوبة يدويًا، أو مُصدَّرة من مستأجر Sentinel/Defender حقيقي، أو مسحوبة من مستودع قواعد Sigma/Sentinel عام) وسيقوم بفهرستها ووسمها بـ MITRE والتحقق منها ثابتًا — دون اتصال Sentinel ودون الحاجة إلى `DETECTIONS_AI_API_KEY`/مفتاح Anthropic لأي من ذلك.
- **الصيغ المدعومة، من اليوم الأول:** ملفات `.kql`/`.txt`/`.yar`/`.spl` الخام أو أي امتداد آخر، كل منها مقترن اختياريًا بملف جانبي `.json`/`.yaml` (`{"file": "myrule.kql", "title": "...", "description": "...", "technique_id": "T1059.001"}`) للبيانات الوصفية التي لا يحتاج تصدير Microsoft نفسه إلى تعريفها بشكل منفصل؛ YARA؛ Suricata؛ Sigma YAML (مستند واحد أو متعدد المستندات)؛ Splunk SPL؛ وملف JSON الأصلي المُصدَّر من Microsoft لقواعد التحليلات/استعلامات البحث (فقط قواعد نوع `Scheduled` تحمل استعلام KQL خامًا يمكن لهذا التطبيق تقييمه — كل نوع آخر يُتعرَّف عليه ويُبلَّغ عنه، ولا يُتخطى بصمت).
- **ما يعمل فعليًا على ملف مستورد:** التحقق الثابت (نفس محرك المتانة/النتائج الذي يستخدمه مسار التوليد بالذكاء الاصطناعي) لمحتوى KQL؛ وفحص مواءمة MITRE أيضًا، إذا *كان* لديك مزوّد ذكاء اصطناعي مُهيّأ (وهو محور مستقل عن Sentinel — يمكنك أن تملك أحدهما أو كليهما أو لا شيء)؛ وكل ما يعتمد على Sentinel (الاختبار الخلفي، وفحوص القياس عن بعد، وتتبع التصرف) يبقى خارج النطاق ويُعرض كـ "لا يوجد اتصال Sentinel مُهيّأ" بدلًا من خلية فارغة مضللة.
- **أين يظهر:** يصبح المحتوى المستورد صف عملية بحث/اكتشاف عاديًا — نفس الجداول، ونفس سير عمل المراجعة، ونفس عرض تقنية MITRE كأي شيء يولّده مسار الذكاء الاصطناعي — لذا يظهر أيضًا في عروض `ALL DETECTIONS`/`GENERATED HUNTS` العادية، وليس فقط في علامته الخاصة. العلامة الفرعية المخصصة **الاكتشافات المحلية** (تحت `DETECTIONS`، للمشرفين فقط لبدء الاستيراد) هي حيث توجّهه إلى مجلد وتراقب تقدم/نتائج كل ملف.
- **الإعداد:** اضبط `LOCAL_IMPORT_DIR` على مسار مطلق في نظام ملفات الواجهة الخلفية (وحدة تخزين مُثبَّتة، في نشر حاوية) — يجب أن يكون كل ما يُستورد تحت ذلك الجذر؛ وتتيح لك الواجهة اختيار مسار فرعي تحته، وليس موقعًا عشوائيًا في نظام الملفات أبدًا. انظر [متغيرات البيئة](#environment-variables).
- **جرّبه فورًا:** يحتوي `examples/local-detections-samples/` على مجلد صغير جاهز للاستيراد — قاعدتا KQL صالحتان (إحداهما مقترنة بملف جانبي `.json` لإظهار تلك الآلية)، وقاعدة واحدة غير صالحة عمدًا (لرؤية لافتة المُعلَّم كغير صالح)، وملف واحد غير معروف (لرؤية لافتة فشل الاستيراد). وجّه `LOCAL_IMPORT_DIR` إليه لرؤية حالات النتائج الثلاث جميعها في أول استيراد لك، دون الحاجة إلى كتابة أي قاعدة.
**الاكتشافات المحلية** — عملية استيراد مكتملة: تُبرز لافتة الملخص الملفات التي تم فهرستها لكن تم تعليمها كغير صالحة بواسطة التحليل الثابت (هنا، قاعدة تنبّه على تجزئة واحدة مُضمّنة) جنبًا إلى جنب مع تلك التي استُوردت بنجاح، ويصبح كل ملف صف عملية بحث/اكتشاف عاديًا أدناه

---
## لقطات الشاشة
تستخدم جميع لقطات الشاشة أدناه بيانات اصطناعية (أسماء مؤسسات وهمية، وعناوين IP مثال من RFC 5737، ونطاقات `.example`) مُولّدة للتوثيق — لا معلومات تهديدات حقيقية أو بيانات عملاء.
**التغذية** — تصفّح وصفّ مدخلات معلومات التهديدات المفروزة حسب الخطورة والوسوم ومؤشرات الاختراق والتقنيات

<br>
**لوحة المعلومات** — تفصيل الخطورة بنظرة سريعة وأهم تقنيات MITRE ATT&CK

<br>
**MITRE ATT&CK** — خريطة حرارية كاملة للمصفوفة لتغطية التقنيات عبر المعلومات المستوعبة

<br>
**مكدسك** — حدّد بيئتك؛ تُعاد تقييم مدخلات التغذية حسب الصلة

<br>
**مؤشرات الاختراق** — سجل قابل للبحث لجميع المؤشرات المستخرجة مع تصدير STIX/CSV

<br>
**التكاملات** — نظرة عامة على الموصلات لـ Sentinel و Defender و RunZero: حالة التهيئة/التمكين واختصارات إلى علامة تبويب كل منها

<br>
**RunZero** — ربط الأصول، وتتبع التعرض على مستوى المؤسسة، ومقاييس المعالجة، كلها مستمدة من جرد RunZero لديك

<br>
**التعرض** — المؤسسات مرتبة حسب عدد مطابقات التهديدات؛ انقر على أي بطاقة لرؤية المدخلات المطابقة

<br>
**الاكتشافات** — الكتالوج الكامل للتحليلات المسجّلة (المولّدة بالذكاء الاصطناعي والمستوردة محليًا على حد سواء)، وكل منها مع حالة البوابة الثابتة/الاختبار الخلفي/المراجعة وتقنية MITRE

<br>
**الإعدادات** — عناصر التحكم في الفرز بالذكاء الاصطناعي، ومراقبة صحة التغذية، ودرجات ثقة المصادر، وإدارة المستخدمين

---
## البنية```
┌─────────────────────────────────────────┐
│ Next.js 16 frontend (port 3000) │
│ Tailwind CSS · dark theme │
└──────────────┬──────────────────────────┘
│ REST API (Bearer token)
┌──────────────▼──────────────────────────┐
│ FastAPI backend (port 8000) │
│ APScheduler · slowapi rate limiting │
└──┬──────────┬──────────┬────────────┬───┘
│ │ │ │
Postgres AI provider RunZero API detections.ai
(modular: (asset sync) (coming soon --
Anthropic or see Features below)
Azure AI Foundry)
الخلفية (backend/) — Python 3.12 + FastAPI. Postgres لجميع عمليات التخزين (تم إيقاف SQLite وAzure Blob Storage بالكامل). يتم اختيار مزوّد الذكاء الاصطناعي وطريقة المصادقة عبر متغيرات البيئة، وليس بشكل مُضمَّن — انظر أدناه.
الواجهة الأمامية (frontend/) — Next.js 16، JavaScript عادي، Tailwind CSS. تكتشف وضع المصادقة تلقائيًا من الخلفية عند التحميل.
البنية التحتية (infra/) — قوالب Azure Bicep لـ Container Apps وKey Vault وContainer Registry (apps.bicep + platform.bicep + app-stack.bicep، تُنشَر عبر provision.ps1). ذات صلة فقط بطبقة Azure + API.
عند تعيين AZURE_AD_TENANT_ID → وضع Entra: تسجيل الدخول الموحّد Microsoft Entra ID، أدوار لكل مستخدم (أول تسجيل دخول يصبح مسؤولًا، والبقية افتراضيًا مشاهدون).
عند عدم تعيين AZURE_AD_TENANT_ID → الوضع المحلي: مفتاح LOCAL_API_KEY مشترك واحد يمنح صلاحية المسؤول لأي شخص يمتلكه. لا إدارة مستخدمين، ولا اعتماد على Azure. تستدعي الواجهة الأمامية GET /api/auth/mode عند التحميل وتعرض شاشة تسجيل الدخول المطابقة تلقائيًا — لا شيء لتهيئته من جانب الواجهة الأمامية.
يُصدر كلا الوضعين نفس النوع من JWT الموقّع من التطبيق بعد ذلك، لذا تعمل كل المسارات الأخرى (require_auth/require_admin) بشكل متطابق بغض النظر عن الوضع الذي أصدر الرمز.
شغّل scripts/setup-basic.sh أو scripts/setup-basic-api.sh (انظر طبقات النشر) — فهي تتولى Postgres وإنشاء .env نيابةً عنك. ثم:```bash
cd backend && pip install -r requirements.txt && uvicorn main:app --reload --port 8000
cd frontend && npm install && npm run dev
### الإعداد اليدوي```bash
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp env.example .env # fill in required values — see Environment Variables below
uvicorn main:app --reload --port 8000
# فحص جميع المنافذ على هدف واحد
python3 cme.py 192.168.1.100
# فحص منافذ محددة
python3 cme.py 192.168.1.100 -p 22,80,443,445,3389
# فحص نطاق من المنافذ
python3 cme.py 192.168.1.100 -p 1-1000
# فحص أهداف متعددة
python3 cme.py 192.168.1.100,192.168.1.101,192.168.1.102
# فحص شبكة فرعية كاملة
python3 cme.py 192.168.1.0/24
# فحص سريع مع 100 خيط
python3 cme.py 192.168.1.0/24 -t 100
# فحص مع مهلة مخصصة (بالثواني)
python3 cme.py 192.168.1.100 -T 5
# حفظ النتائج في ملف
python3 cme.py 192.168.1.0/24 -o results.txt
# حفظ النتائج بصيغة JSON
python3 cme.py 192.168.1.0/24 -o results.json --format json
# فحص صامت (الأسئلة فقط)
python3 cme.py 192.168.1.0/24 -q
# فحص مطوّل مع تفاصيل
python3 cme.py 192.168.1.100 -v
# فحص منافذ محددة عبر شبكة فرعية مع إخراج JSON
python3 cme.py 10.0.0.0/24 -p 21,22,23,25,53,80,110,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 -t 200 -o scan_results.json --format json
# فحص سريع لهدف واحد مع اكتشاف الخدمات
python3 cme.py 192.168.1.100 -p 1-65535 -t 500 -T 2 -v
# فحص أهداف متعددة مع حفظ النتائج
python3 cme.py 192.168.1.1,192.168.1.10,192.168.1.20 -p 22,80,443 -o multi_scan.txt
# استنساخ المستودع
git clone https://github.com/yourusername/cme.git
cd cme
# جعله قابلاً للتنفيذ
chmod +x cme.py
# تشغيله مباشرة
python3 cme.py --help
هذا المشروع مرخص تحت رخصة MIT - راجع ملف LICENSE للتفاصيل.
هذه الأداة مخصصة لأغراض الاختبار الأمني المصرح به فقط. يجب عليك الحصول على إذن كتابي صريح قبل فحص أي شبكة أو نظام لا تملكه. المؤلفون غير مسؤولين عن أي سوء استخدام أو أضرار ناجمة عن هذه الأداة.
المساهمات مرحب بها! لا تتردد في تقديم طلب سحب.
إذا واجهت أي مشاكل أو لديك أسئلة، يرجى فتح مشكلة على GitHub.```bash cd frontend npm install cp env.local.example .env.local # set NEXT_PUBLIC_API_URL=http://localhost:8000 npm run dev
### Docker Compose (كلا الخدمتين)```bash
cp backend/env.example backend/.env # fill in required values
docker compose up --build
الواجهة الأمامية → http://localhost:3000 مستندات واجهة البرمجة الخلفية → http://localhost:8000/docs
انسخ backend/env.example إلى backend/.env واملأ القيم. مجمّعة حسب الطبقة التي تحتاجها:
مطلوبة دائمًا:
| المتغير | الوصف |
|---|---|
PG_DSN | سلسلة اتصال Postgres |
JWT_SECRET_KEY | سرّ لتوقيع رموز جلسة التطبيق (python -c "import secrets; print(secrets.token_hex(32))") |
المصادقة — اختر نمطًا واحدًا:
الفرز بالذكاء الاصطناعي — اختياري، اختر مزوّدًا واحدًا (احذف كليهما للتشغيل مع تعطيل الفرز):
اختيارية:
الواجهة الأمامية (frontend/.env.local أو frontend/env.local.example):
| المتغير | الوصف |
|---|
منسّق detections.ai — قريبًا (ليس جزءًا من هذا الإصدار العام بعد؛ موثّق هنا لحين إطلاقه. طبقة Azure + API، قابلة للنشر بشكل منفصل — انظر backend/detection_pipeline/orchestrator.py):
مزامنة Sentinel Hunts (اختيارية، معطّلة افتراضيًا — انظر الإعدادات > إعدادات API لنمط التشغيل/الإيقاف/اليدوي/التلقائي):
البنية التحتية كرمز (IaC) الحقيقية الحالية هي infra/apps.bicep + infra/platform.bicep + infra/app-stack.bicep، تُنشر عبر infra/provision.ps1 (أو الغلاف الرقيق scripts/setup-azure.ps1). تقوم بتوفير Container Apps وأسرار مدعومة بـ Key Vault وهويات مُدارة — لا يقوم هذا المستودع بتوفير Postgres نفسه؛ وجّه PG_DSN (المخزّن كسرّ pg-dsn في Key Vault) إلى أي خادم Postgres يمكن الوصول إليه.```powershell
./scripts/setup-azure.ps1
cd infra cp migration.psd1.example migration.psd1 # fill in your resource group, apps, etc. ./provision.ps1
`provision.ps1` عديم الأثر الجانبي (idempotent) — آمن لإعادة تشغيله بعد تعديل المانيفست. راجع تعليق الترويسة الخاص به للحصول على الخطوات التفصيلية الكاملة (المنصة → حزمة التطبيقات → الأسرار → Easy Auth → استيراد الصورة → التطبيقات → الفحوصات اللاحقة).
منسّق detections.ai (وظيفة Container Apps مجدولة يحرّكها كتلة `Orchestrator` في `migration.psd1` — راجع `migration.psd1.example` للاطلاع على الشكل، وخزّن مفتاحك كسرّ `DETECTIONSAIAPIKEY` في Key Vault) ليس جزءًا من هذا الإصدار العام بعد — راجع [ميزتان متعلقتان بـ detections](#two-detections-related-features) أعلاه.
---
## بنية المشروع```
├── backend/
│ ├── main.py # FastAPI app, all endpoints
│ ├── db.py # Postgres queries
│ ├── pgcompat.py # connection pool + SQLite-style placeholder translation
│ ├── feed_manager.py # RSS polling, AI triage (provider-modular), scheduler
│ ├── enrichment.py # IOC extraction, KEV cache, stack rematch
│ ├── runzero_sync.py # RunZero asset sync and correlation engine
│ ├── dedup.py # CVE deduplication logic
│ ├── auth.py # Entra ID SSO + local API-key auth, app JWT sign/verify
│ ├── ioc_export.py # STIX 2.1 and CSV export
│ ├── stack_presets.py # Pre-built tech stack templates
│ ├── detection_pipeline/ # detections.ai orchestrator, MITRE alignment-check,
│ │ # Sentinel hunts/analytics-rules sync + tuning,
│ │ # audit log, local_import.py (Local Detections Import)
│ └── tests/ # pytest test suite, incl. fixtures/local_import/
├── frontend/
│ ├── pages/
│ │ ├── index.js # Main app shell + tab routing
│ │ └── login.js # Entra ID or local API-key login, auto-detected
│ ├── lib/
│ │ ├── authMode.js # GET /api/auth/mode, cached per page load
│ │ ├── authFetch.js # Bearer auth + 401-retry wrapper
│ │ └── authSession.js # token storage, JWT decode/expiry helpers
│ └── components/
│ ├── layout/ # TopBar, Sidebar, TabBar, TopFilterBar, TimeRangeToggle
│ ├── feed/ # FeedList, FeedCard
│ ├── integrations/ # IntegrationsPanel, ExposurePanel, RunZeroPanel,
│ │ # RunZeroMatchesPanel, RunZeroMetricsPanel
│ ├── detections/ # DetectionsPanel (tab shell) + one component per
│ │ # sub-tab: DetectionsCatalogPanel, AlignmentReviewPanel,
│ │ # DispositionAlertsPanel, HuntsPanel, SentinelHuntsPanel,
│ │ # SentinelAnalyticsRulesPanel, LocalDetectionsPanel,
│ │ # AuditPanel, plus shared TuningSuggestionBadge
│ ├── settings/ # SettingsPanel, CadencePicker, SeverityCards
│ └── mitre/ # MitreMatrix
├── infra/ # Azure Bicep templates + provision.ps1
├── scripts/ # Tiered setup scripts (see Deployment tiers)
└── docker-compose.yml
63 مصدرًا عبر ثلاث طبقات:
Authorization: Bearer <token>secrets.compare_digest) لمفتاح المصادقة المحلي.env / Azure Key VaultMIT — انظر LICENSE.
| الطبقة | السكربت | الفرز بالذكاء الاصطناعي | المصادقة | التخزين | ما تحصل عليه |
|---|
| الأساسية | scripts/setup-basic.sh | معطّل | مفتاح API محلي | Postgres محلي (Docker) | تجميع الخلاصات، استخراج مؤشرات الاختراق، مصفوفة MITRE، لوحات التحكم — بلا ذكاء اصطناعي، بلا سحابة، ولا شيء للتسجيل فيه |
| الأساسية + API | scripts/setup-basic-api.sh | Anthropic (مباشر) | مفتاح API محلي | Postgres محلي (Docker) | كل ما سبق، بالإضافة إلى فرز الخطورة/TTP/الملخص بالذكاء الاصطناعي |
| Azure + API | scripts/setup-azure.ps1 | Azure AI Foundry | Microsoft Entra ID SSO | Postgres الخاص بك (Azure DB for PostgreSQL، إلخ) | نشر كامل إلى Azure Container Apps، مع SSO وأدوار لكل مستخدم. (تكامل خط أنابيب detections.ai قادم في إصدار مستقبلي — انظر أدناه.) |
| الخيار | الوصف | الافتراضي |
|---|
target | عنوان IP أو نطاق أو شبكة فرعية للفحص | مطلوب |
-p, --ports | المنافذ المراد فحصها (مفصولة بفواصل أو نطاق) | 1-65535 |
-t, --threads | عدد الخيوط المتزامنة | 50 |
-T, --timeout | مهلة الاتصال بالثواني | 3 |
-o, --output | ملف الإخراج | None |
--format | صيغة الإخراج (text, json, csv) | text |
-q, --quiet | وضع صامت (الأسئلة فقط) | False |
-v, --verbose | وضع مطوّل مع تفاصيل | False |
--version | عرض الإصدار | - |
-h, --help | عرض رسالة المساعدة | - |
| المتغير | الوصف |
|---|
LOCAL_API_KEY | النمط المحلي: مفتاح مشترك يمنح صلاحية الوصول الإداري. اترك AZURE_AD_TENANT_ID غير معيّن لتفعيل هذا النمط |
AZURE_AD_TENANT_ID | نمط Entra: معرّف المستأجر للدخول الموحّد (SSO). تعيين هذا يفعّل نمط Entra |
AZURE_AD_CLIENT_ID | نمط Entra: معرّف عميل تسجيل التطبيق |
AZURE_AD_CLIENT_SECRET | نمط Entra: سرّ تسجيل التطبيق (الواجهة الأمامية فقط) |
NEXTAUTH_SECRET | نمط Entra: سرّ تشفير جلسة NextAuth (الواجهة الأمامية فقط) |
| المتغير | الوصف |
|---|
AI_PROVIDER | anthropic (افتراضي) أو azure |
ANTHROPIC_API_KEY | مفتاح Anthropic API المباشر |
AZURE_FOUNDRY_ENDPOINT | نقطة نهاية Azure AI Foundry، مثل https://<resource>.services.ai.azure.com/anthropic |
AZURE_FOUNDRY_API_KEY | مفتاح Azure AI Foundry API |
AZURE_FOUNDRY_DEPLOYMENT | اسم نشر Foundry (افتراضي claude-haiku-4-5) |
AZURE_FOUNDRY_API_VERSION | إصدار Foundry API (افتراضي 2025-05-01) |
| المتغير | الوصف |
|---|
RUNZERO_API_TOKEN | يفعّل مزامنة وربط أصول RunZero |
ALLOWED_ORIGINS | قائمة CORS المسموح بها مفصولة بفواصل (افتراضي http://localhost:3000) |
ENABLE_SCHEDULER | عيّن false لتعطيل مُستطلع التغذيات في الخلفية (افتراضي true) |
ARCHIVE_AFTER_DAYS | عتبة الأرشفة التلقائية بالأيام (افتراضي 90) |
PG_POOL_MIN / PG_POOL_MAX / PG_POOL_TIMEOUT | ضبط تجمّع اتصالات Postgres (الافتراضيات 1 / 10 / 30) |
LOCAL_IMPORT_DIR | يفعّل استيراد الكشوفات المحلية — مسار مطلق على نظام ملفات الواجهة الخلفية يُقيَّد به كل استيراد. تركه غير معيّن يعطّل الميزة بالكامل (تُظهر تبويبها رسالة "غير مُهيّأ") |
NEXT_PUBLIC_API_URL | عنوان URL للواجهة الخلفية كما يراه المتصفح. يُدمج في حزمة JS وقت البناء. اتركه غير معيّن لتوجيه استدعاءات API عبر الوكيل المدمج من نفس الأصل (frontend/pages/api/[...proxy].js) بدلاً من ذلك — مطلوب كلما لم يكن للواجهة الخلفية مدخل عام (مثل تطبيق الحاوية الداخلي فقط في طبقة Azure + API) |
BACKEND_URL | عنوان URL للواجهة الخلفية كما يراه خادم Next.js نفسه. يُستخدم في تبادل تسجيل الدخول الخاص بـ NextAuth، وعندما يكون NEXT_PUBLIC_API_URL غير معيّن، يُستخدم بواسطة الوكيل من نفس الأصل الذي يمرّر كل طلب متصفح /api/* من جهة الخادم |
| المتغير | الوصف |
|---|
DETECTIONS_AI_API_KEY | مطلوب لتشغيل المنسّق على الإطلاق |
SENTINEL_WORKSPACE_ID | معرّف عميل مساحة عمل Log Analytics (GUID)، للاختبار الرجعي. اختياري |
PIPELINE_BATCH_SIZE | عدد الإدخالات لكل تشغيل (افتراضي 5) |
PIPELINE_DRY_RUN | true للمطالبة والتسجيل دون استدعاء API |
PIPELINE_LANGUAGE | لغة استعلام الكشف (افتراضي kql) |
| المتغير | الوصف |
|---|
SENTINEL_HUNTING_SYNC_ENABLED | true للسماح بأي محاولة مزامنة بحث على الإطلاق. تركه غير معيّن/خطأ هو عدم فعل محض — صفر استدعاءات ARM |
AZURE_SUBSCRIPTION_ID | الاشتراك الذي يحتوي على مساحة عمل Sentinel |
AZURE_RESOURCE_GROUP | مجموعة الموارد التي تحتوي على مساحة عمل Sentinel |
SENTINEL_WORKSPACE_NAME | اسم مساحة العمل، وليس معرّف العميل الخاص بها — قيمة مختلفة عن SENTINEL_WORKSPACE_ID أعلاه، الذي يستخدمه عميل مستوى بيانات الاختبار الرجعي بدلاً من ذلك |