العودة إلى التحديثات
New releaseSep 8, 2026

log-horizon v0.9.0

محلل مصادر سجلات Microsoft Sentinel SIEM

مشاركة

محلل مصادر سجلات Microsoft Sentinel SIEM

PowerShell 7+ Module Version


اضطررت للإجابة على سؤال "ما الذي نحصل عليه فعليًا من هذه السجلات؟" أو "ما هي السجلات الموصى بها لـ Microsoft Sentinel؟" مرات أكثر مما يمكنني عده. الإجابة تعتمد دائمًا على عوامل كثيرة، لكن يمكننا أن نكون عامين. لذلك بنيت هذه الأداة هنا.

Log Horizon يتصل بمساحة عمل Microsoft Sentinel الخاصة بك (وبشكل اختياري بـ Defender XDR)، ويمر عبر كل جدول سجلات تقوم بإدخاله، ويخبرك ما إذا كنت تحصل على قيمة أمنية منه أم أنك تحرق المال فقط. يصنف الجداول، ويقيّمها مقابل قواعد الكشف الخاصة بك، ويمنحك توصيات ملموسة مع تقديرات للتوفير.

مهم: هذا نهج عام. إذا كنت تعلم أن مصدر سجل معين مهم لبيئتك، فإن هذا السياق دائمًا له الأولوية على ما تخبرك به هذه الأداة. التصنيفات هي نقطة بداية، وليست حقيقة مطلقة.

تريد قراءة المزيد؟ لدي بعض المقالات حول Log Horizon على مدونتي:

  1. إصدار الأداة: Log Horizon
  2. تحديث: Log Horizon v0.5.0
  3. بناء خط أساس عملي للسجلات وكيف يساعدك Log Horizon في ذلك
  4. كيفية استخدام 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] إخلاء المسؤولية

تم تطوير هذه الأداة وصيانتها بمساعدة الذكاء الاصطناعي. يرجى توخي الحذر عند استخدام هذا الحل وفهم ما تقوم بتشغيله دائمًا قبل تشغيله في الإنتاج. لا يتحمل المطور أي مسؤولية عن أي ثغرات أو مشكلات.

من خلال تنزيل هذه الأداة أو تثبيتها أو استخدامها، فإنك تقر بأنك قرأت وفهمت ووافقت على هذه الشروط.

المتطلبات الأساسية

ما تحتاجهالإصدار
PowerShell7.0+
وحدات AzAz.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

جميع المعلمات

المعاملالنوعمطلوبالافتراضيالوصف
-SubscriptionIdstringنعم-معرف اشتراك Azure
-ResourceGroupstringنعم-مجموعة الموارد التي تحتوي على مساحة عمل Sentinel
-WorkspaceNamestringنعم-اسم مساحة عمل Log Analytics
-WorkspaceIdstringلا-معرف مساحة العمل (يُحل تلقائيًا إذا تم حذفه)
-Outputstringلا-صيغة التصدير: json أو markdown / md أو html (الاسم المستعار -o)
-OutputPathstringلا-مسار الملف أو الدليل للتصدير. يحصل الدليل الموجود أو الفاصل الزمني اللاحق على اسم ملف بطابع زمني؛ ويحصل اسم الملف بدون امتداد على امتداد الصيغة؛ ويتم إنشاء الدلائل المفقودة
-Keywordsstring[]لا-كلمات مفتاحية لتحليل الفجوات (مثل 'AWS','CrowdStrike'، الاسم المستعار -kw)
-IncludeDefenderXDRswitchلا-تضمين تحليل كشف Defender XDR المخصص
-IncludeDetectionAnalyzerswitchلا-تضمين تحليل الضوضاء لكل قاعدة باستخدام الحوادث وقواعد الأتمتة
-DetectionLookbackDaysintلا90نافذة الاستعلام لتحليل الكشف القائم على الحوادث/الأتمتة (1-365 يومًا)
-DaysBackintلا90نافذة الاستعلام لبيانات الاستخدام (1-365 يومًا)
-PricePerGBdecimalلا5.59سعر الإدخال لكل جيجابايت لطبقة Sentinel Analytics (الاسم المستعار -ppgb)
-BasicPricePerGBdecimalلا1.15سعر Basic Logs لكل جيجابايت
-LakePricePerGBdecimalلا0.20سعر طبقة Auxiliary / Data Lake لكل جيجابايت (الإدخال + المعالجة)
-NonInteractiveswitchلا-تخطي لوحة TUI والتصدير مباشرة (أو إرجاع البيانات إلى خط الأنابيب إذا تم حذف -Output)
-CustomClassificationPathstringلا-مسار إلى ملف JSON مخصص لإضافة أو تجاوز التصنيفات (الاسم المستعار -clf)
-NoCacheswitchلا-عدم قراءة أو كتابة ذاكرة التخزين المؤقت للمجموعة
-RefreshCacheswitchلا-جمع بيانات جديدة والكتابة فوق إدخال ذاكرة التخزين المؤقت
-CacheMaxAgeMinutesintلا60الحد الأقصى لعمر إدخال ذاكرة التخزين المؤقت لإعادة استخدامه (1-10080)
-CachePathstringلا$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جرد الموصلات المثبتة
تحسين SOCSecurity Insights REST (معاينة)توصيات SOC المدمجة من Microsoft
الاحتفاظ بالجداولLog Analytics Tables RESTالاحتفاظ والأرشفة والخطة (Analytics/Basic/Auxiliary) وعلامات الوراثة الافتراضية وأعمدة المخطط لكل جدول
قواعد جمع البياناتAzure Monitor RESTقواعد DCR التي تستهدف مساحة العمل (قائمة الاشتراك، DCR تحويل مساحة العمل، الارتباطات) وتحويلاتها
Defender XDRMicrosoft Graphقواعد الكشف المخصصة لـ XDR (اختياري؛ تفويض CustomDetection.Read.All أو رمز Az Graph)
الحوادثSecurity Insights RESTنتائج الحوادث (الحالة/التصنيف) والتوقيت وتلميحات ربط القواعد لتسجيل جودة القواعد
قواعد الأتمتةSecurity Insights RESTإجراءات إغلاق الحوادث على مستوى القاعدة وشروط مطابقة العناوين لإسناد الإغلاق التلقائي
SentinelHealthLog 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).

هل أعجبك الأداة؟


اشترِ لي قهوة على ko-fi.com

الفئات