
log-horizon v0.9.0
محلل مصادر سجلات Microsoft Sentinel SIEM
محلل مصادر سجلات Microsoft Sentinel SIEM
اضطررت للإجابة على سؤال "ما الذي نحصل عليه فعليًا من هذه السجلات؟" أو "ما هي السجلات الموصى بها لـ Microsoft Sentinel؟" مرات أكثر مما يمكنني عده. الإجابة تعتمد دائمًا على عوامل كثيرة، لكن يمكننا أن نكون عامين. لذلك بنيت هذه الأداة هنا.
Log Horizon يتصل بمساحة عمل Microsoft Sentinel الخاصة بك (وبشكل اختياري بـ Defender XDR)، ويمر عبر كل جدول سجلات تقوم بإدخاله، ويخبرك ما إذا كنت تحصل على قيمة أمنية منه أم أنك تحرق المال فقط. يصنف الجداول، ويقيّمها مقابل قواعد الكشف الخاصة بك، ويمنحك توصيات ملموسة مع تقديرات للتوفير.
مهم: هذا نهج عام. إذا كنت تعلم أن مصدر سجل معين مهم لبيئتك، فإن هذا السياق دائمًا له الأولوية على ما تخبرك به هذه الأداة. التصنيفات هي نقطة بداية، وليست حقيقة مطلقة.
تريد قراءة المزيد؟ لدي بعض المقالات حول Log Horizon على مدونتي:
- إصدار الأداة: Log Horizon
- تحديث: Log Horizon v0.5.0
- بناء خط أساس عملي للسجلات وكيف يساعدك Log Horizon في ذلك
- كيفية استخدام Log Horizon
الميزات
| الميزة | الوصف |
|---|---|
| محرك التصنيف | قاعدة معرفية تضم 481 إدخالًا تغطي أكثر من 240 موصلًا، و22 فئة، مع حالة دورة الحياة (مهمل/قديم بالإضافة إلى جداول الاستبدال) وتراجع ارتجاعي تلقائي للجداول غير المعروفة |
| تقييم التكلفة مقابل القيمة | مصفوفة مستوى التكلفة لكل جدول مقابل مستوى الكشف مع تقييم مشترك (قيمة عالية إلى قيمة منخفضة)، مسعّرة وفقًا للخطة المرصودة (Analytics، Basic، Data Lake) |
| التوصيات | 13 نوع إجراء ذو أولوية: مرشحو Data Lake أو Basic، جداول بدون كشف، هدر بث XDR، تصفية وقت الإدخال، مرشحو التقسيم، استخدام الخطة، المصادر المهملة، قصور الاحتفاظ، نتائج XDR Checker وDetection Analyzer، كل منها مع تقديرات للتوفير |
| ربط الكشف | يربط قواعد التحليلات واستعلامات الصيد وكشوفات XDR بكل جدول لاكتشاف فجوات التغطية |
| وسوم الارتباط | يكتشف وسوم #DONT_CORR# / #INC_CORR# في أوصاف القواعد ويشير إلى القواعد المستبعدة من ارتباط Defender |
| الامتثال للاحتفاظ | يقارن الاحتفاظ الفعلي بالحدود الدنيا الموصى بها بناءً على المعايير الصناعية وأفضل ممارسات الأمان |
| تحسين SOC | يسحب توصيات تحسين SOC الخاصة بشركة Microsoft من واجهة Security Insights API |
| تحليل فجوات الكلمات المفتاحية | يشير إلى الجداول التي يجب أن تقوم بإدخالها ولكنك لا تفعل، بناءً على كلمات مفتاحية للبائع/المنتج |
| اكتشاف التحويلات | يكتشف قواعد جمع البيانات (DCRs) الموجهة إلى مساحة العمل (قائمة الاشتراكات مفلترة حسب الوجهة، وDCR تحويل مساحة العمل، وارتباطات مساحة العمل)، ويحلل التحويلات المضمنة ومتعددة المراحل، ويصنف كل عملية (تصفية، إسقاط، إزالة عمود، إثراء، تجميع) |
| اكتشاف الجداول المقسمة | يحدد جداول التقسيم _SPLT_CL ويربطها بالجداول الأصلية في محرك التصنيف |
| مولد KQL للتقسيم | يولد KQL جاهزًا للبوابة للتقسيم من قاعدة معرفية منسقة، وتحليل مباشر للقواعد، وإحصائيات تكرار الحقول المجتمعية -- تنسيق شرط فقط يُلصق مباشرة في محرر قواعد تقسيم Sentinel. يتم تقاطع قوائم الحقول مع مخطط الجدول المباشر؛ أي شيء غير موجود يُبلغ عنه كمُسقط |
| محلل الكشف | يقيّم قواعد التحليلات لاحتمال إحداث الضوضاء باستخدام نتائج الحوادث (نسبة الإغلاق التلقائي، ونسبة الإيجابيات الكاذبة، ونسب حجم الحوادث) |
| مدقق XDR | يضيف طبقة استشارية تركز على XDR: فحوصات تغطية البث وإرشادات احتفاظ Data Lake لمدة عام واحد للبيانات المتعلقة بـ XDR |
| تصنيفات مخصصة | قدم JSON الخاص بك لإضافة أو تجاوز قاعدة بيانات التصنيف المدمجة |
| ذاكرة تخزين مؤقت للمجموعة | يتم تخزين بيانات مساحة العمل المجمعة محليًا (افتراضيًا 60 دقيقة) بحيث تستغرق عمليات إعادة التشغيل وإعادة التصدير ثوانٍ؛ يمكنك إلغاء الاشتراك باستخدام -NoCache |
| السحب السيادية | تتبع نقاط نهاية ARM وLog Analytics وGraph بيئة Azure المسجلة الدخول إليها (العامة، الحكومة الأمريكية، الصين) |
| واجهة TUI تفاعلية | لوحة تحكم Spectre.Console مع قوائم وجداول ملونة وتفاصيل متعمقة ومعالج احتفاظ وفن ASCII |
| التصدير | تقرير JSON أو Markdown أو HTML ثابت للمشاركة مع الفريق |
إخلاء المسؤولية
[!CAUTION] إخلاء المسؤولية
تم تطوير هذه الأداة وصيانتها بمساعدة الذكاء الاصطناعي. يرجى توخي الحذر عند استخدام هذا الحل وفهم ما تقوم بتشغيله دائمًا قبل تشغيله في الإنتاج. لا يتحمل المطور أي مسؤولية عن أي ثغرات أو مشكلات.
من خلال تنزيل هذه الأداة أو تثبيتها أو استخدامها، فإنك تقر بأنك قرأت وفهمت ووافقت على هذه الشروط.
المتطلبات الأساسية
| ما تحتاجه | الإصدار |
|---|---|
| PowerShell | 7.0+ |
| وحدات Az | Az.Accounts |
| وحدات أخرى | PwshSpectreConsole 2.6.3+ |
| اختياري | Microsoft.Graph.Authentication (لـ -IncludeDefenderXDR كمستخدم مسجل دخول) |
تتبع نقاط النهاية بيئة Azure لجلسة Connect-AzAccount الحالية، لذا تعمل مساحات عمل Azure Government وAzure China بدون معلمات إضافية. تُستخدم قيم السحابة العامة عندما لا تتوفر بيئة.
إذا لم تكن مسجلًا دخولًا إلى Azure بالفعل، ستقوم الوحدة بتشغيل Connect-AzAccount لك. إذا كنت مسجلًا، فستستمر ببساطة.
الأذونات: يغطي Log Analytics Reader وMicrosoft Sentinel Reader على مساحة العمل التحليل. يتطلب اكتشاف التحويلات أيضًا Microsoft.Insights/dataCollectionRules/read (Monitoring Reader) على الاشتراك أو مجموعة الموارد؛ بدونها يستمر التشغيل ويطبع تحذيرًا يسمي الإذن المفقود. يستخدم -IncludeDefenderXDR Microsoft Graph مع CustomDetection.Read.All، وهو ما يعني للمستخدم المسجل دخولًا الوحدة الاختيارية Microsoft.Graph.Authentication.
البدء
الأمر بسيط جدًا:```powershell
Grab the dependencies
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
Clone and import
git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1
## الاستخدام
### الأساسيات
ابدأ بالاتصال بـ Azure وتأكد من تحديد الحساب والاشتراك الصحيحين:```powershell
Connect-AzAccount
ثم يمكننا استدعاء الأداة:```powershell Invoke-LogHorizon -SubscriptionId '00000000-0000-0000-0000-000000000000' -ResourceGroup 'rg-sentinel' -WorkspaceName 'my-sentinel-ws'
<img width="860" height="842" alt="{F4FFA929-B24F-490C-BD3D-F75E214BCD93}" src="https://assets.kitploit.com/production/public/readmes/13110/ff9d1da85043d02a216df72913ecf63520310b8d820b1bd1278b8e4aca718494.png" />
كما يتضمن قائمة للتعمق في المخرجات الأخرى:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### فجوات الكلمات المفتاحية + Defender XDR
هل تريد معرفة ما إذا كنت تفتقد جداول متعلقة بمورّدين محددين؟ أضف بعض الكلمات المفتاحية. أضف `-IncludeDefenderXDR` إذا كنت تريد تحليل XDR أيضًا.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
محلل الكشف
تمكين تحليل جودة/ضجيج القواعد بناءً على الحوادث وقواعد الأتمتة:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### تصدير تقرير```powershell
# JSON
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output json -OutputPath ./report.json
# Markdown
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output markdown -OutputPath ./report.md
# Static HTML (self-contained, no JS, works offline)
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./report.html
# Auto-generate timestamped filename by pointing at a directory
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./reports/
إدارة الاحتفاظ بالجدول ونوعه
يمكنك الآن تحديث الاحتفاظ بالجدول ونوع الجدول مباشرة من واجهة TUI التفاعلية:
- افتح
Invoke-LogHorizonبشكل طبيعي، ثم اختر إدارة الاحتفاظ بالجدول ونوعه من القائمة الرئيسية لتحديثات الاحتفاظ أو النوع المجمّعة. - افتح Log Tuning / Transforms > Evaluate specific table واختر إدارة الاحتفاظ/النوع لهذا الجدول لتغيير جدول واحد.
للبرمجة النصية أو الأتمتة، استخدم الأمر العام المخصص:```powershell
Preview a single-table change (prints a Table / Plan / Interactive / Total / Status / Reason table, applies nothing)
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Switch tables to Basic and set total retention
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
Use -1 for inherit/default semantics
RetentionInDays = inherit workspace default
TotalRetentionInDays = remove long-term retention
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1
### الوضع غير التفاعلي / وضع CI
تخطَّ واجهة TUI التفاعلية وقم بالتصدير مباشرة إلى ملف، وهو مفيد لخطوط الأنابيب أو التشغيل المجدول:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
إذا حذفت -Output، يتم إرجاع كائن التحليل إلى خط الأنابيب بحيث يمكنك تمريره إلى منطقك الخاص.
ذاكرة التخزين المؤقت للتجميع
يتم تخزين مرحلة جمع البيانات (الاستخدام، القواعد، الحوادث، الجداول، DCRs) مؤقتًا افتراضيًا بحيث تكون إعادة التشغيل ضد نفس مساحة العمل، على سبيل المثال لتصدير تنسيق ثانٍ أو لإعادة فتح TUI، تستغرق ثوانٍ بدلاً من دقائق. توجد ذاكرة التخزين المؤقت تحت $env:LOCALAPPDATA\LogHorizon\cache (يمكن تجاوزها باستخدام -CachePath)، ملف واحد لكل مجموعة من الاشتراك ومجموعة الموارد ومساحة العمل و-DaysBack و-DetectionLookbackDays و-IncludeDefenderXDR و-IncludeDetectionAnalyzer ومعاملات الأسعار الثلاثة وإصدار الوحدة. يتم تجاهل الإدخالات الأقدم من -CacheMaxAgeMinutes (الافتراضي 60)، وكل حفظ يحذف الإدخالات منتهية الصلاحية بحيث لا يتراكم المجلد ملفات من مجموعات معاملات أخرى أو إصدارات أقدم. لا تتم كتابة الرموز المميزة أبدًا في ذاكرة التخزين المؤقت؛ يتم تشغيل المصادقة في كل استدعاء بحيث يكون لدى معالج الاحتفاظ دائمًا بيانات اعتماد حية.
ملف ذاكرة التخزين المؤقت هو Clixml نصي عادي. مع -IncludeDetectionAnalyzer يحتوي على عناوين الحوادث وأرقامها وحالتها وتصنيفها من مساحة العمل الخاصة بك؛ لا يتم جمع مالكي الحوادث أو مؤلفي القواعد أو هويات المالك المعين. استخدم -NoCache على الأجهزة المشتركة أو وجّه -CachePath إلى موقع مع التحكم في الوصول الذي تحتاجه.```powershell
Force a fresh collection and refresh the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Never read or write the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
Accept cached data for up to a day
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440
### ضبط السجلات وتقسيم KQL
تتضمن واجهة TUI التفاعلية قائمة **Log Tuning / Transforms** مع اقتراحات ضبط مباشرة (استخدام الحقول من قواعدك المنشورة واستعلامات الصيد)، وKQL مقسّم من قاعدة المعرفة، ومقيّم لكل جدول. كل كتلة KQL هي شرط فقط وتُلصق مباشرة في محرر قواعد التقسيم في Sentinel، مع إسناد المصدر (قاعدة المعرفة، تحليل القواعد، أو مدمج).
### التسعير المخصص
الأسعار الافتراضية هي West Europe Simplified PAYG بالدولار الأمريكي: 5.59 $/GB للتحليلات، 1.15 $/GB للأساسي، 0.20 $/GB لـ Data Lake (0.07 للإدخال + 0.13 للمعالجة). يتم تسعير كل جدول وفقًا للخطة الملاحظة في جدول `Usage`، وتأتي الحالة المجانية من `Usage.IsBillable`. تستخدم الأحجام جيجابايت الفوترة (1000 ميجابايت). إذا كانت طبقة الالتزام الخاصة بك مختلفة:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
جميع المعلمات
| المعامل | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
-SubscriptionId | string | نعم | - | معرف اشتراك Azure |
-ResourceGroup | string | نعم | - | مجموعة الموارد التي تحتوي على مساحة عمل Sentinel |
-WorkspaceName | string | نعم | - | اسم مساحة عمل Log Analytics |
-WorkspaceId | string | لا | - | معرف مساحة العمل (يُحل تلقائيًا إذا تم حذفه) |
-Output | string | لا | - | صيغة التصدير: json أو markdown / md أو html (الاسم المستعار -o) |
-OutputPath | string | لا | - | مسار الملف أو الدليل للتصدير. يحصل الدليل الموجود أو الفاصل الزمني اللاحق على اسم ملف بطابع زمني؛ ويحصل اسم الملف بدون امتداد على امتداد الصيغة؛ ويتم إنشاء الدلائل المفقودة |
-Keywords | string[] | لا | - | كلمات مفتاحية لتحليل الفجوات (مثل 'AWS','CrowdStrike'، الاسم المستعار -kw) |
-IncludeDefenderXDR | switch | لا | - | تضمين تحليل كشف Defender XDR المخصص |
-IncludeDetectionAnalyzer | switch | لا | - | تضمين تحليل الضوضاء لكل قاعدة باستخدام الحوادث وقواعد الأتمتة |
-DetectionLookbackDays | int | لا | 90 | نافذة الاستعلام لتحليل الكشف القائم على الحوادث/الأتمتة (1-365 يومًا) |
-DaysBack | int | لا | 90 | نافذة الاستعلام لبيانات الاستخدام (1-365 يومًا) |
-PricePerGB | decimal | لا | 5.59 | سعر الإدخال لكل جيجابايت لطبقة Sentinel Analytics (الاسم المستعار -ppgb) |
-BasicPricePerGB | decimal | لا | 1.15 | سعر Basic Logs لكل جيجابايت |
-LakePricePerGB | decimal | لا | 0.20 | سعر طبقة Auxiliary / Data Lake لكل جيجابايت (الإدخال + المعالجة) |
-NonInteractive | switch | لا | - | تخطي لوحة TUI والتصدير مباشرة (أو إرجاع البيانات إلى خط الأنابيب إذا تم حذف -Output) |
-CustomClassificationPath | string | لا | - | مسار إلى ملف JSON مخصص لإضافة أو تجاوز التصنيفات (الاسم المستعار -clf) |
-NoCache | switch | لا | - | عدم قراءة أو كتابة ذاكرة التخزين المؤقت للمجموعة |
-RefreshCache | switch | لا | - | جمع بيانات جديدة والكتابة فوق إدخال ذاكرة التخزين المؤقت |
-CacheMaxAgeMinutes | int | لا | 60 | الحد الأقصى لعمر إدخال ذاكرة التخزين المؤقت لإعادة استخدامه (1-10080) |
-CachePath | string | لا | $env:LOCALAPPDATA\LogHorizon\cache | دليل ملفات ذاكرة التخزين المؤقت |
تحت الغطاء
إذن هناك أربع مراحل.
1. جمع البيانات
تتصل الوحدة بـ Azure وتسحب البيانات من واجهات برمجة تطبيقات Log Analytics وSecurity Insights وAzure Monitor وMicrosoft Graph. يمر كل استدعاء عبر غلاف إعادة المحاولة (أخطاء 429 و5xx وأخطاء النقل)، وما لم يتم تعيين -NoCache، يتم تخزين البيانات المجمعة محليًا للتشغيل التالي.
| مصدر البيانات | API | ما نلتقطه |
|---|---|---|
| استخدام الجداول | جدول Usage (KQL) | حجم الإدخال والخطة وعلامة الفوترة لكل جدول عبر نافذة الاستعلام الخاصة بك |
| قواعد التحليلات | Security Insights REST | قواعد الكشف النشطة + الجداول التي تصل إليها + علامات الارتباط، بالإضافة إلى مستهلكي الجداول الضمنيين لأنواع القواعد غير KQL |
| استعلامات الصيد | عمليات البحث المحفوظة في Log Analytics REST | استعلامات الصيد المحفوظة + الجداول المشار إليها |
| موصلات البيانات | Security Insights REST | جرد الموصلات المثبتة |
| تحسين SOC | Security Insights REST (معاينة) | توصيات SOC المدمجة من Microsoft |
| الاحتفاظ بالجداول | Log Analytics Tables REST | الاحتفاظ والأرشفة والخطة (Analytics/Basic/Auxiliary) وعلامات الوراثة الافتراضية وأعمدة المخطط لكل جدول |
| قواعد جمع البيانات | Azure Monitor REST | قواعد DCR التي تستهدف مساحة العمل (قائمة الاشتراك، DCR تحويل مساحة العمل، الارتباطات) وتحويلاتها |
| Defender XDR | Microsoft Graph | قواعد الكشف المخصصة لـ XDR (اختياري؛ تفويض CustomDetection.Read.All أو رمز Az Graph) |
| الحوادث | Security Insights REST | نتائج الحوادث (الحالة/التصنيف) والتوقيت وتلميحات ربط القواعد لتسجيل جودة القواعد |
| قواعد الأتمتة | Security Insights REST | إجراءات إغلاق الحوادث على مستوى القاعدة وشروط مطابقة العناوين لإسناد الإغلاق التلقائي |
| SentinelHealth | Log Analytics KQL | أحداث تشغيل قواعد الأتمتة مع أرقام الحوادث للإسناد القاطع للإغلاق التلقائي (اختياري، يتطلب مراقبة الصحة) |
2. التصنيف
يتم تصنيف كل جدول عبر مرحلتين:
أولاً، بحث مباشر في قاعدة المعرفة المكونة من 481 إدخالًا في Data/log-classifications.json. يحمل كل إدخال اسم الموصل، والتصنيف الأساسي/الثانوي، وفئة الأمان، وخرائط مصادر بيانات MITRE، وطبقة الأسعار والاحتفاظ الموصى بها، وعلامات دورة الحياة الاختيارية (مهمل/قديم مع جداول بديلة، وقابلية البث عبر XDR، والمنصة).
إذا لم يكن هناك تطابق، تعمل القواعد الاستدلالية بهذا الترتيب:
- يحتوي الاسم على رمز أمان مثل
AlertأوIncidentأوThreatأوSigninأوLogonأوAuditأوRiskأوDetection(مطابق عند بدايات كلمات PascalCase) -> أساسي - يبدو الاسم كقياس بنية تحتية:
FlowأوMetricأوDiagnosticأوPerfأوHeartbeatأوHealthأوInventoryأوUsage-> ثانوي - توجد قواعد تحليلات نشطة تشير إليه -> أساسي
- جدول مدمج ببادئة Microsoft (
AADأوMicrosoftأوAzureأوDefenderأوPurviewأوEntraأوSentinelأوOfficeأوIntuneأوWindows...) -> أساسي، مع وضع علامة للمراجعة والإضافة إلى قاعدة البيانات - اسم عام
*Log/*Logs-> ثانوي - حجم مرتفع (>10 جيجابايت/شهر) مع عدم وجود كشف عليه -> ثانوي
- لا شيء مما سبق -> غير معروف
3. تسجيل القيمة مقابل التكلفة
يتم تسجيل كل جدول عبر عدة أبعاد:
- طبقة التكلفة: مجاني / منخفض (<1 جيجابايت) / متوسط (1-10 جيجابايت) / مرتفع (10-50 جيجابايت) / مرتفع جدًا (>50 جيجابايت)
- طبقة الكشف: لا شيء / منخفض (1-2 قواعد) / متوسط (3-9 قواعد) / مرتفع (10+ قواعد)
- التقييم: قيمة عالية / قيمة جيدة / تغطية مفقودة / تحسين / قيمة منخفضة / غير مستغل / طبقة مجانية / منصة
- نسبة التغطية %: نسبة الجداول التي تشير إليها قاعدة تحليلات واحدة على الأقل أو استعلام صيد، محسوبة كـ
tablesWithRules / totalTables * 100. تجمع تغطية كل جدول قواعد التحليلات + استعلامات الصيد الموجودة عبر تحليل KQL لأسماء الجداول. - التغطية الضمنية: أنواع القواعد التي لا تحمل KQL ما زالت تستهلك الجداول. يربطها
Data/implicit-consumers.json(مطابقة Threat Intelligence ->ThreatIntelIndicators/ThreatIntelObjects، Fusion ->SecurityAlert/Anomalies، UEBA ->BehaviorAnalytics/UserPeerAnalytics/IdentityInfo، إنشاء حوادث Microsoft ->SecurityAlert). تُحسب القواعد الممكّنة من تلك الأنواع ضمن التغطية الفعلية، ويُبلغ كل جدول عنCoverageSourceبقيمةkqlأوxdrأوimplicitأوplatformأوnone. لا يتم أبدًا وضع علامة على جداول المنصة التي يكتبها Sentinel لنفسه (SecurityIncidentوSentinelHealthوWatchlistوUsage...) كتغطية مفقودة وتحصل على تقييمPlatform. - فقط قواعد التحليلات الممكّنة وكشوفات Defender المخصصة الممكّنة تُحسب ضمن التغطية.
ثم تولّد الوحدة التوصيات (13 نوعًا):
| النوع | متى يظهر | ما يجب فعله |
|---|---|---|
| Data Lake | ثانوي + تكلفة مرتفعة + كشوفات قليلة، والجدول يدعم خطة Auxiliary (يتراجع إلى اقتراح خطة Basic عندما يكون Basic مدعومًا فقط) | الانتقال إلى طبقة Auxiliary/Data Lake؛ التوفير هو التكلفة الحالية مطروحًا منها نفس الحجم بسعر البحيرة (أو Basic) |
| قيمة منخفضة | تكلفة مرتفعة + صفر كشوفات | إضافة قواعد أو تصفية أو الانتقال إلى بحيرة البيانات |
| تحسين XDR | مُبث عبر XDR + 0 قواعد Sentinel + وجود قواعد XDR | إيقاف البث واستخدام بوابة XDR الموحدة بدلاً من ذلك |
| تغطية مفقودة | أساسي + صفر كشوفات (وليس جداول منصة) | كتابة قواعد تحليلات للحصول على قيمة من البيانات |
| تصفية وقت الإدخال | أساسي + >20 جيجابايت + <=3 كشوفات | تطبيق تحويل وقت الإدخال لتقليل الحجم |
| مرشح للتقسيم | أساسي + حجم مرتفع + كشوفات + لا يوجد تحويل حالي | تقسيم الجدول بحيث تبقى الصفوف عالية القيمة على Analytics والباقي يذهب إلى Data Lake |
| استخدام الخطة | تُظهر صفوف الاستخدام أكثر من خطة واحدة، أو تختلف الخطة المكوّنة عما لاحظه الاستخدام | مراجعة ما إذا كان انتقال الخطة متوقعًا |
| مصدر مهمل | جدول مُعلَّم كمهمل أو قديم في قاعدة البيانات ما زال يستقبل البيانات | ترحيل الكشوفات إلى الجداول البديلة ثم إيقاف الموصل القديم. إعلامي: لا يُدعى توفير لأن الإدخال ينتقل بدلاً من أن يختفي |
| نقص الاحتفاظ | احتفاظ مساحة العمل أو الجدول أقل من خط الأساس البالغ 90 يومًا | زيادة الاحتفاظ الإجمالي/الأرشيفي لتلبية الإرشادات التنظيمية |
| تحسين الاحتفاظ | جدول مدفوع غير تابع للمنصة يحقق 90 يومًا لكنه أقل من توصية الفئة | النظر في احتفاظ إجمالي أطول |
| أقل من خط الأساس التفاعلي | جدول Analytics باحتفاظ تفاعلي (ساخن) أقل من 90 يومًا | رفع الاحتفاظ التفاعلي إلى 90 يومًا التي يتضمنها Sentinel، ما لم تكن النافذة الساخنة القصيرة مقصودة |
| مدقق XDR | جدول Defender XDR معروف غير مُبث، أو مُبث بدون تغطية، أو غير مُمرر إلى Data Lake، أو أقل من التوصية السنوية | مراجعة البث والاحتفاظ لقياس XDR |
| محلل الكشف | درجات القواعد >= 70 مع 5 حوادث على الأقل (مع -IncludeDetectionAnalyzer) | ضبط القاعدة المزعجة أو تعطيلها |
تُرتَّب التوصيات مرة واحدة، مرتفع > متوسط > منخفض ثم حسب التوفير المقدر، ويحافظ كل مخرج (JSON وMarkdown وHTML وTUI) على هذا الترتيب.
4. محلل الكشف (تسجيل الضوضاء)
عند تمرير -IncludeDetectionAnalyzer، تجلب الوحدة الحوادث الأخيرة وقواعد الأتمتة، ثم تسجل كل قاعدة تحليلات ممكّنة لاحتمال الضوضاء.
مقاييس كل قاعدة (محسوبة من بيانات الحوادث):
| المقياس | كيف يُحسب |
|---|---|
| إجمالي الحوادث | عدد الحوادث المرتبطة بالقاعدة |
| نسبة الإغلاق التلقائي | الحوادث المغلقة بواسطة قواعد الأتمتة ÷ إجمالي الحوادث. المصدر الأساسي: جدول SentinelHealth (تشغيلات قواعد الأتمتة بواسطة قواعد إغلاق الحوادث أو قواعد playbook الممكّنة، مطابقة على رقم الحادث). البديل: مطابقة شروط قواعد الأتمتة (معرف قاعدة التحليلات وشروط العنوان والخطورة، ANDed كما يفعل Sentinel). تُعامل القواعد التي تكون شروطها حالة/تكتيكات/كيانات فقط على أنها تنطبق على كل حادث. |
| نسبة الإيجابيات الكاذبة | الحوادث المصنفة كإيجابية كاذبة ÷ إجمالي الحوادث |
صيغة درجة الضوضاء:
يُحوَّل كل مقياس إلى مرتبة مئوية عبر جميع القواعد التي لديها حادث واحد على الأقل. الدرجة المركبة هي مزيج مرجح:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
- **نسبة الحجم (35%)**: عدد الحوادث التي يولّدها القاعدة مقارنةً بالقواعد الأخرى.
- **نسبة الإغلاق التلقائي (40%)**: عدد المرات التي تُغلق فيها الحوادث تلقائيًا بواسطة قواعد الأتمتة (أعلى وزن لأن الإغلاق التلقائي هو أقوى مؤشر على التنبيهات منخفضة القيمة).
- **نسبة النتائج الإيجابية الخاطئة (25%)**: عدد المرات التي يصنّف فيها المحللون النتيجة على أنها إيجابية خاطئة.
**عتبات النقاط**:
| النقاط | التصنيف | المعنى |
|---|---|---|
| ≥ 70 | مزعج | القاعدة على الأرجح تحتاج إلى ضبط أو تعطيل |
| ≥ 50 | مراقبة | القاعدة تُظهر علامات مبكرة على الإزعاج |
| < 50 | سليم | القاعدة ضمن النطاق الطبيعي |
| غير متاح | - | القاعدة لا تحتوي على حوادث مرتبطة، أو أن أقل من 3 قواعد لديها حوادث فلا يوجد ما يمكن ترتيبه مقابله |
تُجمَّع الحوادث حسب معرف القاعدة التحليلية (مع التراجع إلى اسم القاعدة ثم العنوان)، لذا تُقيَّم قاعدتان تشتركان في اسم العرض بشكل منفصل.
القواعد التي تحصل على نقاط ≥ 70 ولديها 5 حوادث على الأقل تظهر تلقائيًا كـ **توصيات ذات أولوية عالية** في عرض التوصيات.
### 5. لوحة التحكم التفاعلية
تقدم القائمة الرئيسية هذه العروض:
- **لوحة التحكم**: إحصائيات عامة، أعلى 10 جداول تكلفة (المصادر المتقادمة والقديمة تحمل شارة)، شريط التغطية، ملخص الامتثال للاحتفاظ، تنبيه استبعاد الارتباط
- **عرض التوصيات**: إجراءات مرتبة حسب الأولوية مع وفورات شهرية تقديرية، قابلة للتوسيع لإظهار القائمة الكاملة عندما يتجاوز العدد 10
- **عرض تقييم الكشف**: ملخص مصفوفة التكلفة والقيمة، تغطية القواعد واستعلامات الصيد لكل جدول، تنقيب أساسي/ثانوي، قائمة القواعد المستبعدة من الارتباط
- **عرض محلل الكشف**: ترتيب القواعد المزعجة القائم على النسب المئوية مع مؤشرات جودة الإغلاق (عند استخدامك `-IncludeDetectionAnalyzer`)، متصفح قواعد قابل للبحث
- **عرض تحسين SOC**: اقتراحات التحسين الخاصة بمايكروسوفت مع إمكانية التنقيب
- **عرض تقييم الاحتفاظ**: الجداول الأقل من الحدود الدنيا الموصى بها مع الاحتفاظ الحالي مقابل الموصى به، ونوع الخطة، والعجز، بالإضافة إلى صفوف استشارية لـ XDR
- **عرض تحويلات البيانات**: جرد تحويلات DCR مع تصنيف نوع التحويل وKQL كامل لكل جدول
- **ضبط السجلات / التحويلات**: اقتراحات ضبط مباشرة، وKQL مقسوم لقاعدة المعرفة، ومقيّم لكل جدول مع تغيير احتفاظ/نوع لجدول واحد
- **عرض جميع الجداول**: القائمة الكاملة مع التصنيف والخطط والتكلفة والقواعد والاحتفاظ (ملوّن) والتقييم؛ اختر جدولًا للوحة تفاصيل (مصادر التغطية، دعم الخطة، الاحتفاظ، الحالة، توصياته)
- **إدارة الاحتفاظ ونوع الجدول**: معالج احتفاظ وخطة جماعي مع معاينة وتطبيق
- **القاموس**: كل مصطلح تستخدمه الأداة (التصنيف، مستويات التكلفة والكشف، التقييمات، مصادر التغطية، أنواع التوصيات الـ 13، مقاييس محلل الكشف وتصنيفات النقاط، خطط الجداول، حالة دورة الحياة، حالات XDR، أنواع التحويلات) مع نفس التعريفات الموجودة في هذا README، تُقدَّم من `Data/dictionary.json`
- **تصدير تقرير**: اختر تنسيقًا، ثم مسارًا (مجلدًا لملف بختم زمني، أو اسم ملف؛ Enter يحافظ على المجلد الحالي) واكتب JSON أو Markdown أو HTML مباشرة من القائمة
- **تحليل XDR** يظهر في لوحة التحكم عند استخدامك `-IncludeDefenderXDR`
---
## قاعدة بيانات التصنيف
تقع في `Data/log-classifications.json`. **481 إدخالًا**، **243 موصلًا**، **22 فئة**.
### ما يحتويه كل إدخال
| الحقل | ما يحمله |
|---|---|
| `tableName` | اسم جدول Log Analytics (`SecurityEvent`, `SigninLogs`, إلخ.) |
| `connector` | أي موصل بيانات ينتج هذا الجدول |
| `classification` | `primary` (قيمة أمنية) أو `secondary` (قياس عن بُعد داعم) |
| `category` | الفئة الأمنية: الهوية والوصول، أمن الشبكات، إلخ. |
| `description` | ملخص بلغة بسيطة لما يحتويه الجدول |
| `keywords` | مصطلحات لمطابقة تحليل فجوات الكلمات المفتاحية |
| `mitreSources` | تعيينات مصادر بيانات MITRE ATT&CK |
| `recommendedTier` | `analytics` (الطبقة الساخنة) أو `datalake` (مرشح مساعد) |
| `recommendedRetentionDays` | الحد الأدنى الموصى به لإجمالي الاحتفاظ بالأيام (إرشادات تنظيمية) |
| `isFree` | ما إذا كانت مايكروسوفت تستوعب هذا مجانًا (وقت التشغيل يستخدم `Usage.IsBillable` أولًا) |
| `status` | اختياري. `deprecated` (تقاعد الموصل أو توقف الاستيعاب) أو `legacy` (مسار جمع أقدم مع خليفة موثق) |
| `replacedBy` | اختياري. أسماء الجداول للترحيل إليها؛ موجود كلما تم تعيين `status` (قد يكون فارغًا) |
| `xdrStreamable` | اختياري، جداول Defender فقط. `true` للجداول الـ 21 التي يبثها موصل Defender XDR؛ `false` للجداول الخاصة بالبوابة فقط وجداول TVM |
| `platform` | اختياري. `true` للجداول التي يستهلكها Sentinel نفسه (`SecurityIncident`, `Usage`, `Watchlist`, ...) والتي لا تحتاج أبدًا إلى قواعد تحليلية |
الجداول ذات `status` تُظهر شارة في واجهة TUI والتقارير، وأي منها لا يزال يستوعب يرفع توصية `DeprecatedSource` تسمي البديل. الجداول ذات `xdrStreamable: false` لا تُعامل أبدًا كمرشحين لبث XDR بواسطة مدقق XDR.
### البيانات الأمنية الأساسية مقابل الثانوية
**الأساسية** (278 إدخالًا): الجداول التي تبني عليها اكتشافاتك فعليًا. سجلات تسجيل الدخول، التنبيهات الأمنية، معلومات التهديدات، مسارات التدقيق، نتائج الثغرات، سجلات جدار الحماية، قياس عن بُعد EDR.
**الثانوية** (203 إدخالات): أشياء داعمة. مقاييس الأداء، تشخيصات البنية التحتية، أحجام تدفق الشبكة، لقطات المخزون، خطوط الأساس للتكوين، فحوصات الصحة.
### الفئات في لمحة
| الفئة | العدد | أمثلة |
|---|---|---|
| الهوية والوصول | 51 | `SigninLogs`, `MicrosoftServicePrincipalSignInLogs`, `OktaSSO` |
| أمن الشبكات | 49 | `AZFWNetworkRule`, `NSPAccessLogs`, `DarktraceModelAlerts_CL` |
| مستوى التحكم السحابي | 37 | `AzureActivity`, `AZKVAuditLogs`, `GoogleWorkspaceReports` |
| تدفق الشبكة | 36 | `NTANetAnalytics`, `CommonSecurityLog`, `AZFWFatFlow` |
| كشف نقطة النهاية | 33 | `DeviceProcessEvents`, `CrowdStrikeAuditEvents`, `SentinelOneAlertsV2_CL` |
| سجلات التطبيقات | 32 | `AppServiceHTTPLogs`, `AppServiceAuditLogs`, `DynatraceAttacksV2_CL` |
| أمن البريد الإلكتروني | 29 | `EmailEvents`, `CampaignInfo`, `Ttp_Url_CL` |
| التنبيهات الأمنية | 29 | `SecurityAlert`, `SentinelBehaviorInfo`, `DisruptionAndResponseEvents` |
| إدارة الثغرات | 23 | `DeviceTvmSoftwareVulnerabilities`, `Rapid7InsightVMCloudVulnerabilities` |
| الأمن السحابي | 20 | `EnrichedMicrosoft365AuditLogs`, `OAuthAppInfo`, `PowerAppsActivity` |
| قياس عن بُعد نقطة النهاية | 18 | `DeviceInfo`, `Windows365NetworkLogs`, `SentinelOneAgents_CL` |
| إدارة الوضعية | 17 | `ExposureGraphNodes`, `SecurityNestedRecommendation`, `ZTSMetadata` |
| أمن البيانات | 16 | `PurviewDataSensitivityLogs`, `DataSecurityEvents`, `PowerPlatformDlpActivity` |
| منصة البيانات | 16 | `SQLSecurityAuditEvents`, `CDBControlPlaneRequests`, `SnowflakeLogin_CL` |
| صحة المنصة | 14 | `SentinelHealth`, `Usage`, `SecurityCaseEvent` |
| الحاويات وK8s | 13 | `AKSAudit`, `CloudProcessEvents`, `GKEAudit` |
| تشخيص البنية التحتية | 13 | `AzureMetrics`, `AGWPerformanceLogs`, `ContainerAppSystemLogs` |
| معلومات التهديدات | 10 | `ThreatIntelIndicators`, `ThreatIntelObjects`, `CybleVisionAlerts_CL` |
| إدارة التكوين | 8 | `ConfigurationData`, `AVNMRuleCollectionChange` |
| أمن SAP | 7 | `ABAPAuditLog`, `SAPBTPAuditLog_CL`, `Onapsis_Defend_CL` |
| الوصول إلى التخزين | 6 | `StorageBlobLogs`, `CloudStorageAggregatedEvents`, `AWSS3ServerAccess` |
| أمن IoT/OT | 4 | `RadiflowEvent`, `DragosAlerts_CL`, `Phosphorus_CL` |
### دعم خطط الجداول
`Data/basic-plan-tables.json` و `Data/auxiliary-plan-tables.json` يسردان الجداول المدمجة التي تشير إليها [مصفوفة ميزات جداول Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) على أنها تدعم خطط Basic وAuxiliary (Data Lake). يستخدم معالج الاحتفاظ قائمة Basic للتحقق من تبديل الخطط، وتقترح توصية `DataLake` طبقة البحيرة فقط للجداول التي تدعمها، مع التراجع إلى اقتراح خطة Basic حيث تكون تلك هي أدنى طبقة مدعومة. الجداول المخصصة القائمة على DCR تدعم كلا الخطتين؛ الجداول المخصصة الكلاسيكية لا تدعم أيًا منهما. يُعاد توليد كلا الملفين من تلك المصفوفة لكل إصدار.
### التصنيفات المخصصة
يمكنك توفير ملف تصنيف خاص بك **لإضافة** إدخالات للجداول غير الموجودة في قاعدة البيانات المدمجة، أو **لتجاوز** الإدخالات الموجودة عندما لا تتطابق الافتراضيات مع بيئتك. الإدخالات المخصصة لها الأولوية على المدمجة عندما يظهر نفس `tableName` في كليهما.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
-CustomClassificationPath './my-classifications.json'
الملف المخصص يستخدم نفس المخطط المستخدم في Data/log-classifications.json، وهو مصفوفة من الكائنات:```json
[
{
"tableName": "MyCustomApp_CL",
"connector": "Custom Logs (DCR)",
"classification": "primary",
"category": "Application Logs",
"description": "Security-relevant audit events from an internal application",
"keywords": ["custom", "internal", "audit"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
},
{
"tableName": "AzureMetrics",
"connector": "Azure Monitor",
"classification": "primary",
"category": "Infrastructure Diag",
"description": "Override: promoted to primary because we detect on Azure resource metrics in this environment",
"keywords": ["metrics", "azure", "infrastructure", "monitoring"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
}
]
انظر إلى `Data/custom-classifications-example.json` للحصول على قالب جاهز للاستخدام.
### كيف تم بناء التصنيفات
تم إجراء التصنيف الأساسي/الثانوي جزئيًا بواسطة المؤلف ثم عن طريق تغذية موصل بيانات Microsoft وتعريفات الجداول إلى الذكاء الاصطناعي مع خط أساس تقييم بشري، باستخدام أفضل ممارسات Microsoft والمعايير الصناعية كمعايير التصنيف. إذا بدا شيء غير صحيح لبيئتك، فثق بسياقك الخاص أكثر من الأداة - فالذكاء الاصطناعي يمكن أن يخطئ، والسياق هو الملك.
تم استخلاص معايير التصنيف من المصادر التالية:
**ACSC (مديرية الإشارات الأسترالية، المركز الأسترالي للأمن السيبراني)**
- [ACSC: أفضل الممارسات لتسجيل الأحداث واكتشاف التهديدات (أغسطس 2024)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC: السجلات ذات الأولوية لاستيعاب SIEM - إرشادات الممارسين (مايو 2025)](https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-for-siem-ingestion-practitioner-guidance)
**CISA (وكالة الأمن السيبراني وأمن البنية التحتية)**
- [CISA: إرشادات تنفيذ M-21-31: تحسين قدرات التحقيق والمعالجة للحكومة الفيدرالية](https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Governments%20Investigative%20and%20Remediation%20Capabilities_.pdf)
- [CISA: دليل تنفيذ سجلات السحابة الموسعة من Microsoft (2025)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)
**Microsoft**
- [مرجع موصلات بيانات Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [مرجع جداول وموصلات Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [مستودع Azure-Sentinel على GitHub](https://github.com/Azure/Azure-Sentinel) (قواعد التحليلات المجتمعية، تعريفات الموصلات، قوالب الحلول)
- [فوترة Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/billing)
- [إدارة طبقات بيانات Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [مصادر بيانات MITRE ATT&CK](https://attack.mitre.org/datasources/)
**NIST (المعهد الوطني للمعايير والتقنية)**
- [NIST SP 800-92: دليل إدارة سجلات أمن الحاسوب](https://csrc.nist.gov/pubs/sp/800/92/final)
**NSA (وكالة الأمن القومي)**
- إرشادات NSA لإعادة توجيه الأحداث السيبرانية
**NCSC-UK (المركز الوطني للأمن السيبراني - المملكة المتحدة)**
- "ما الذي يجب علينا تسجيله بالضبط؟" من NCSC-UK
**Google Cloud**
- [نظرة عامة على سجلات تدقيق Google Cloud](https://docs.cloud.google.com/logging/docs/audit)
- [أفضل ممارسات سجلات تدقيق Google Cloud](https://docs.cloud.google.com/logging/docs/audit/best-practices)
كما تم استخدام مصادر أخرى، إلى جانب "خبرة" المؤلفين إذا كان يمكنك تصنيفها على هذا النحو.
---
## هيكل المشروع```
LogHorizon.psd1 Module manifest (v0.9.0)
LogHorizon.psm1 Module loader
Public/
Invoke-LogHorizon.ps1 Entry point, the main orchestrator
Set-LogHorizonTableRetention.ps1 Scriptable table retention and plan changes
Private/
Connect-Sentinel.ps1 Azure auth + workspace resolution
Get-TableUsage.ps1 KQL query for ingestion volumes
Get-AnalyticsRules.ps1 Analytics rules + table/field extraction + correlation tags
Get-HuntingQueries.ps1 Hunting queries + table extraction
Get-DataConnectors.ps1 Data connector inventory
Get-DataTransforms.ps1 DCR transform discovery, split KQL generation
Get-DefenderXDR.ps1 Defender XDR analysis (optional)
Get-Incidents.ps1 Incident fetch + SentinelHealth auto-close attribution
Get-AutomationRules.ps1 Automation rule inventory + close-logic attribution
Get-SocOptimization.ps1 SOC improvement recommendations
Get-TableRetention.ps1 Per-table retention, archive, and plan type
Get-CollectionCache.ps1 Collection cache (key, path, read, write)
Get-LogHorizonEndpoint.ps1 ARM / Log Analytics / Graph endpoints for the signed-in Azure environment
Get-LogHorizonDictionary.ps1 Loads the term dictionary shown by the Dictionary menu
Invoke-AzRestWithRetry.ps1 REST wrapper: retry on 429/5xx/transport errors, async operation polling
Invoke-Classification.ps1 Static DB + heuristic classification + _SPLT_CL detection + custom file validation
Invoke-Analysis.ps1 Cost-value matrix + recommendations + Detection Analyzer + XDR Checker + split suggestions
Set-TableRetention.ps1 Retention change set, preview, Tables API apply engine, plan support lookups
Write-Report.ps1 Spectre.Console TUI rendering
Export-Report.ps1 JSON / Markdown / static HTML export with shared section renderer
Data/
log-classifications.json 481-entry classification knowledge base
basic-plan-tables.json Built-in tables that support the Basic plan (from the Azure Monitor feature matrix)
auxiliary-plan-tables.json Built-in tables that support the Auxiliary / Data Lake plan
implicit-consumers.json Non-KQL rule kinds to tables, plus platform tables
dictionary.json Term definitions for the Dictionary menu (kept 1:1 with this README, enforced by tests)
high-value-fields.json Split KQL knowledge base: 165 tables with curated fields and split hints
field-frequency-stats.json Community field frequency stats mined from the Azure-Sentinel rule corpus
custom-classifications-example.json Example custom classification override file
ReportTemplate.html Static HTML report template (pure-CSS tabs, zero JS, CSP meta)
Tests/
LogHorizon.Tests.ps1 437 Pester v5 unit tests
كيف يتم إنشاء قواعد المعرفة
قواعد المعرفة المجزأة KQL، high-value-fields.json و field-frequency-stats.json، تُبنى دون اتصال من المستودع العام Azure/Azure-Sentinel (Solutions/، Detections/، Hunting Queries/، حوالي 3,800 ملف قواعد YAML). يتم تمرير كل استعلام عبر نفس الدالتين Get-TablesFromKql و Get-FieldsFromKql اللتين تستخدمهما الوحدة في وقت التشغيل لبناء عدّادات تكرار الحقول لكل جدول، والتي يُشتق منها ثلاثة مستويات من الحقول الاحتياطية:
- الحقول العامة: الحقول التي تظهر في أكثر من 50% من جميع الجداول (مثل
TimeGenerated) - الافتراضيات حسب الفئة: الحقول التي تظهر في أكثر من 40% من الجداول ضمن فئة تصنيفية
- إحصائيات لكل جدول: عدّادات تكرار الحقول الخام للجداول التي تحتوي على 3 قواعد مرجعية على الأقل
يتم دمج الحقول المستخرجة في high-value-fields.json المنسّق (يتم الاحتفاظ بالإدخالات المنسّقة، وتُضاف الجداول المكتشفة حديثًا التي تحتوي على 3 قواعد على الأقل و3 حقول ذات معنى).
في وقت التشغيل، يستخدم Get-SplitKql تسلسلًا هرميًا احتياطيًا: إدخال قاعدة المعرفة المنسّقة -> تحليل القواعد/استعلامات الصيد المباشر -> إحصائيات المجتمع لكل جدول -> الافتراضيات حسب الفئة -> الحقول العامة. تكرار الحقول ليس طريقة مثالية، لكنه مفيد للمعرفة.
الاختبارات
437 اختبار Pester v5، لا يتطلب اتصالًا بـ Azure. شغّلها من جلسة PowerShell عادية بدلاً من الطرفية المدمجة في VS Code:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## الترخيص
GPL-3.0. انظر [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).
## سجل الإصدارات
| الإصدار | التاريخ | التغييرات |
|---|---|---|
| 0.9.0 | 2026-09-06 | إصدار معالجة ناتج عن مراجعة شاملة للكود والبيانات. الصحة: تسعير مدرك للخطة من `Usage.Plan` و`Usage.IsBillable` مع أسعار Basic وData Lake وغيغابايت الفوترة (1000 ميجابايت)، إسناد الإغلاق التلقائي في Detection Analyzer مقصور على قواعد الإغلاق/العب التشغيلية المفعّلة (`triggeringLogic.isEnabled`)، الحوادث عبر `2025-09-01` مع `$top=1000`، تغطية ضمنية لأنواع قواعد غير KQL وجداول المنصة (`implicit-consumers.json`)، فحص أساسي للاحتفاظ التفاعلي، فرز واحد للتوصيات. التحويلات: اكتشاف DCR على نطاق الاشتراك مُصفّى على مساحة عمل الوجهة بالإضافة إلى DCR لتحويل مساحة العمل والارتباطات، مع حالة مرئية وتحذير عند فقدان إذن؛ تحليل تحويلات مساحة العمل ومتعددة المراحل؛ KQL مقسوم متقاطع مع مخطط الجدول الحي. المتانة: ذاكرة تخزين مؤقت للمجموعة مفعّلة افتراضيًا (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`)، مصادقة قبل مؤشر التقدم مع طباعة التحذيرات بعده، إخراج TUI وMarkdown مُهرَّب، حل مسار التصدير الذي ينشئ الدلائل ويعيد المسار المكتوب، وسم CSP في HTML، إعادة محاولات REST على أخطاء النقل وإكمال غير متزامن بنمط Location، حل مساحة العمل عبر REST (تم إسقاط `Az.Resources`)، تحقق مخصص من التصنيف، استدلالات مدركة لحالة Pascal مع خيار احتياطي من Microsoft كطرف أول، مهلات للتعبيرات النمطية. تتبع نقاط النهاية بيئة Azure الموقّع عليها (Government, China) وتم نقل إصدارات API إلى SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, التوصيات `2025-10-01-preview`. البيانات: قاعدة بيانات التصنيف 345 -> 481 إدخالًا مع مفاتيح `status`/`replacedBy`/`xdrStreamable`/`platform`, أكثر من 80 جدولًا من الطرف الأول و35 جدولًا خلفًا، إصلاحات تسميات الموصلات، تصحيحات `isFree`؛ إعادة توليد `basic-plan-tables.json` وجديد `auxiliary-plan-tables.json` من مصفوفة ميزات جداول Azure Monitor؛ توصية `DeprecatedSource`, توصية Data Lake مدركة للخطة مع خيار احتياطي Basic, XDR Checker يحترم قابلية البث، شارات دورة الحياة في TUI والتصديرات. مراجعة شاملة: مفتاح الذاكرة المؤقتة يغطي التسعير وإصدار الوحدة، تحليل القيم المنطقية والطبقات المخصصة بدلًا من التحويل القسري، إسناد إغلاق تلقائي مدرك للخطورة، فحص مسندات KQL المقسومة مقابل المخطط الحي، إظهار حالة جلب XDR بدلًا من `$null` الصامت، مسارات الإخراج بدون امتداد هي ملفات، لم تعد هويات مالكي الحوادث تُجمع. قائمة قاموس في TUI مع كل مصطلح تستخدمه الأداة، مدعومة بـ`Data/dictionary.json` ومثبتة على الكود عبر الاختبارات. كائنات أتمتة القواعد وكشف Defender المخصص مُسقطة على الحقول المستهلكة، بحيث لا تصل هويات المؤلفين (createdBy, lastModifiedBy, المالكون المعينون) أبدًا إلى الذاكرة المؤقتة أو التصديرات. ترخيص GPL-3.0. 437 اختبارًا |
| 0.8.0 | 2026-05-26 | إضافة إدارة تفاعلية للاحتفاظ بالجداول مع تدفق TUI جماعي جديد ونقطة دخول لتحديث جدول واحد، بالإضافة إلى الأمر العام `Set-LogHorizonTableRetention`. إضافة محرك تطبيق PATCH لواجهة Tables API مع تحقق، واستقصاء غير متزامن لعمليات Azure، وخيار احتياطي من خطوتين (PATCH مدمج، ثم خطة فقط بالإضافة إلى احتفاظ فقط) لتحديثات احتفاظ مرنة. إضافة تغطية Pester مركزة للتحقق، وشكل الحمولة، والخيار الاحتياطي، وربط الأوامر العامة. كما يصلح حالة حافة/خطأ حيث كان المستخدمون يحصلون على توصيات لتغيير جداول data lake إلى طبقة data lake إذا كانت لديهم بيانات تحليلات لا تزال في Sentinel |
| 0.7.1 | 2026-05-15 | إضافة الوعي بالخطة من `Usage.Plan` دون استبدال خطة الجدول المكوّنة: يتتبع التحليل الآن تاريخ الخطط المرصود، ويعلّم على الاستخدام متعدد الخطط وعدم تطابق المكوّن مقابل المرصود، ويعرض بيانات الخطة في لوحة المعلومات، والتفصيل التفصيلي للجداول، وعرض كل الجداول، وتقييم الاحتفاظ، والتصديرات. إصلاح إسناد الإغلاق التلقائي في Detection Analyzer بحيث ينطبق الاستدلال الزمني فقط عند عدم وجود قواعد أتمتة مفعّلة. 203 اختبارات ناجحة |
| 0.7.0 | 2026-04-16 | تحديث تقييم الكشف مع جدول ملخص مصفوفة القيمة-التكلفة (فئات تقييم 7x أساسي/ثانوي مع ترميز ألوان)، قائمة فرعية للتفصيل للجداول الأساسية/الثانوية مع أعمدة طبقة التكلفة/الكشف. تحديث Detection Analyzer مع أشرطة تغطية الحجم الموزونة بالغيغابايت (غيغابايت الكشف/الصيد/المجمع كنسبة مئوية من إجمالي الاستيعاب بجانب الأشرطة الحالية لعدد الجداول). تحسينات عرض تكيفية لـDetection Analyzer (عرض شريط ديناميكي، اقتطاع أسماء القواعد، إخفاء أعمدة شرطي بناءً على عرض وحدة التحكم). 193 اختبارًا ناجحًا |
| 0.6.3 | 2026-04-11 | تحديث بسيط لـPSGallery |
| 0.6.2 | 2026-04-11 | قائمة Log Tuning / Transforms: تحليل ضبط بيانات حي (استخدام حقول لكل جدول من القواعد/استعلامات الصيد المنشورة، توليد KQL للتصفية/الإسقاط/المجمع، تقديرات التوفير)، استخراج أعمدة المخطط من Tables API، تسلسل احتياطي لـ`Get-SplitKql` (إحصائيات المجتمع → افتراضيات الفئة → الحقول العامة)، مُقيّم جداول شامل مع مصفوفة استخدام الحقول، أقسام تصدير موحدة لضبط KB + الحي، سكربت تعدين `Build-FieldKnowledgeBase.ps1` لمجموعة قواعد Azure-Sentinel على GitHub. Detection Analyzer: إسناد إغلاق تلقائي قائم على SentinelHealth (أساسي) مع خيار احتياطي لمطابقة القواعد المدركة للمشغّل، تحليل غلاف الشروط المنطقية، اكتشاف حالة Resolved، مطابقة ذيل GUID لمعرفات موارد ARM. التغطية الآن قائمة على عدد الجداول عبر كل الجداول (بما في ذلك الطبقة المجانية). إضافة إخلاء مسؤولية للتسجيل في TUI والتصديرات. 174 اختبارًا |
| 0.6.1 | 2026-04-10 | إصلاحات أخطاء: تصفية `$kqlKeywords` أصبحت مشتركة على نطاق الملف (كانت غير معرّفة في `Get-TablesFromKql`), إضافة `[CmdletBinding()]` إلى كل الدوال المساعدة، تبسيط الفحص الموحد لـDefender، إزالة معامل الاختبار الشبح `-RuleCount`. المتانة: ترقيم صفحات `Get-HuntingQueries`, غلاف إعادة محاولة `Invoke-AzRestWithRetry` مع تراجع أسي لـ429/5xx, تحقق `PricePerGB`, `Write-Verbose` في الدوال الرئيسية. التوثيق: شارة الإصدار، عدد قاعدة البيانات، المتطلبات الأساسية متوافقة مع البيان |
| 0.6.0 | 2026-04-10 | كشف بث XDR ديناميكي مع 21 `KnownXDRTables` (كانت 18 مشفّرة)، `XDRState` لكل جدول (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), التعرف على Auxiliary كطبقة data lake، جداول XDR غير المُبثّة تظهر كتوصيات Information/Low مع `NotStreamedCount`, محلل الاحتفاظ يعرض جداول XDR غير المُبثّة كـ"XDR only (30d)", تفصيل الطبقات في النظرة العامة (analytics/basic/data lake + غير المُبث), تسميات Export-Report Auxiliary→"data lake", تحديث قاعدة بيانات التصنيف إلى 345 إدخالًا (+`DeviceNetworkInfo`, `DeviceInfo`→ثانوي/data lake, `DeviceImageLoadEvents` و`IdentityQueryEvents`→طبقة data lake), 15 اختبار Pester جديدًا (121 إجمالًا) |
| 0.5.0 | 2026-04-03 | تصدير HTML ثابت مع تبويبات CSS خالصة (صفر JavaScript، لا CDN، مكتفٍ ذاتيًا بالكامل)، مُصيّر أقسام موحد MD/HTML، التقاط بيانات JSON كامل (dataTransforms, correlationExcluded/Included, streamingTables), مفتاح `-NonInteractive` لاستخدام CI/خطوط الأنابيب، اسم مستعار لتنسيق `md`, أسماء ملفات تلقائية بطابع زمني، عرض KQL كامل في تحويلات DCR (بدون اقتطاع)، معالجة KQL متعدد الأسطر في جداول markdown، إصلاح تلف مرجع خلفي `$` في التعبير النمطي في استبدال رموز HTML، إعادة تسمية الدوال الداخلية المساعدة لتجنب تعارضات أسماء PowerShell (`h`→`hEnc`, `md`→`mdEsc`), 33 اختبار Pester جديدًا (106 إجمالًا) |
| 0.4.1 | 2026-04-03 | إصلاحات أمنية واستقرار - إضافة تعقيم ذاكرة الرموز، تحقق من مسارات الإخراج وحماية XSS، حدود ترقيم صفحات REST API، إصلاح إخفاء أخطاء محمّل الوحدة، وحل تحذيرات PSScriptAnalyzer |
| 0.4.0 | 2026-04-02 | اكتشاف التحويلات (سرد DCR + تصنيف نوع التحويل)، اكتشاف الجداول المقسومة (`_SPLT_CL`), مساعد KQL مقسوم مع قاعدة معرفة من 15 جدولًا (`high-value-fields.json`) + خيار احتياطي لتحليل القواعد، إخراج KQL جاهز للبوابة بشروط فقط، قائمة توصيات قابلة للتوسيع، قائمة TUI لاقتراحات KQL المقسوم |
| 0.3.0 | 2026-04-02 | تحليل امتثال الاحتفاظ بالسجلات (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), اكتشاف وسوم الارتباط (`#DONT_CORR#`/`#INC_CORR#`), عرض قائمة تقييم الاحتفاظ، عمود الاحتفاظ في كل الجداول، `recommendedRetentionDays` في مخطط التصنيف |
| 0.2.2 | 2026-04-02 | جدول تحسين SOC يخفي عمود التفاصيل على وحدات التحكم الضيقة |
| 0.2.1 | 2026-04-02 | دعم التصنيف المخصص (`-CustomClassificationPath`), توصيات محسّنة لتحسين SOC مع اقتراحات API/تفصيل، عرض افتراضي للنشط فقط، قمع تحذير ترميز UTF-8 |
| 0.2.0 | - | إصدار عام أولي مع محرك تصنيف، وتسجيل قيمة-تكلفة، وواجهة TUI بـSpectre.Console، وتصدير إلى JSON/Markdown |
| 0.1.0 | - | إصدار داخلي للتطوير |
## المشكلات المعروفة
### تحذير ترميز UTF-8 في PwshSpectreConsole
لتمكين إخراج UTF-8 في الطرفية، أضف السطر التالي في أعلى ملف `$PROFILE` الخاص بـPowerShell وأعد تشغيل الطرفية:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
تضبط الوحدة هذا تلقائيًا عند الاستيراد، ولكن اعتمادًا على جلستك قد يظهر التحذير. إنه تجميلي ولا يؤثر على الوظيفة.
المساهمة
إذا كانت لديك مشكلات أو تريد المساهمة، فأنشئ طلب سحب (PR).