إنشاء موزع ASIM

مكتمل

مستخدمو Advanced Security Information Model (ASIM) يستخدمونمحللات توحيد بدلاً من أسماء الجداول في استعلاماتهم، لعرض البيانات بتنسيق تمت تسويته وتضمين جميع البيانات ذات الصلة بالمخطط في الاستعلام. بدوره، يستخدم توحيد المحللات محللات خاصة بالمصدر لمعالجة التفاصيل المحددة لكل مصدر.

يوفر Microsoft Sentinel محللات مضمَّنة خاصة بالمصادر للعديد من مصادر البيانات. قد تحتاج إلى تعديل هذه المحللات الخاصة بالمصدر أو تطويرها في الحالات التالية:

عندما يوفر جهازك أحداثا تناسب مخطط ASIM، ولكن لا يتوفر محلل خاص بالمصدر لجهازك والمخطط ذي الصلة في Microsoft Sentinel.

عندما تتوفر محللات مصدر ASIM الخاصة بجهازك، ولكن جهازك يرسل الأحداث بطريقة أو تنسيق مختلف عن المتوقع من قبل محللات ASIM. على سبيل المثال:

قد يتم تكوين جهازك المصدر لإرسال الأحداث بطريقة غير قياسية.

قد يكون لجهازك إصدار مختلف عن الإصدار الذي يدعمه محلل ASIM.

الأحداث قد يتم تجميعها وتعديلها وإعادة توجيهها بواسطة نظام وسيط.

عملية تطوير محلل مخصص

سير العمل التالي يصف الخطوات عالية المستوى في تطوير ASIM مخصص، محلل خاص بالمصدر:

  1. جمع نماذج السجلات.

  2. تحديد المخططات التي تمثلها الأحداث المرسلة من المصدر.

  3. تعيين حقول الحدث المصدر إلى المخطط أو المخططات المحددة.

  4. تطوير محلل ASIM واحد أو أكثر لمصدرك. ستحتاج إلى تطوير محلل تصفية ومحلل بدون معلمات لكل مخطط ذي صلة بالمصدر.

  5. اختبر المحلل الخاص بك.

  6. انشر المحللات في مساحات عمل Microsoft Sentinel الخاصة بك.

  7. حدث محلل توحيد ASIM ذي الصلة للإشارة إلى المحلل المخصص الجديد.

  8. كما قد ترغب في المساهمة في توزيع المحللات الخاصة بك إلى توزيع ASIM الأساسي. كما يمكن توفير المحللات المساهمة في جميع مساحات العمل كمحللات مضمنة.

جمع نماذج السجلات

لإنشاء محللات ASIM فعالة، تحتاج إلى مجموعة تمثيلية من السجلات، والتي في معظم الحالات تتطلب إعداد النظام المصدر وتوصيله بـ Microsoft Sentinel. إذا لم يكن لديك الجهاز المصدر متوفرا، فإن خدمات الدفع حسب الاستخدام السحابية تتيح لك نشر العديد من الأجهزة للتطوير والاختبار.

بالإضافة إلى ذلك، العثور على وثائق المورد وعينات السجلات يمكن أن يساعد في تسريع التطوير وتقليل الأخطاء من خلال ضمان تغطية تنسيق السجل الواسع.

مجموعة تمثيلية من السجلات يجب أن تتضمن ما يلي:

  • الأحداث التي لها نتائج أحداث مختلفة.
  • الأحداث ذات إجراءات استجابة مختلفة.
  • تنسيقات مختلفة لاسم المستخدم واسم المضيف والمعرف والحقول الأخرى التي تتطلب تسوية القيمة.

التعيين

قبل تطوير محلل، قم بتعيين المعلومات المتوفرة في الحدث المصدر أو الأحداث إلى المخطط الذي حددته:

  • قم بتعيين كافة الحقول الإلزامية ويفضل أيضًا الحقول الموصى بها.
  • حاول تعيين أي معلومات متوفرة من المصدر إلى الحقول التي تمت تسويتها. إذا لم يكن متوفرا كجزء من المخطط المحدد، ففكر في التعيين إلى الحقول المتوفرة في المخططات الأخرى.
  • قم بتعيين قيم الحقول في المصدر إلى القيم التي تمت تسويتها المسموح بها بواسطة ASIM. يتم تخزين القيمة الأصلية في حقل منفصل، مثل EventOriginalResultDetails.

تطوير محللات

تطوير كل من التصفية والتحليل بدون معلمات لكل مخطط ذي صلة.

المحلل المخصص هو استعلام KQL تم تطويره في صفحة سجلات Microsoft Sentinel. استعلام المحلل يحتوي على ثلاثة أجزاء:

تصفية > حقول إعداد التحليل >

تصفية السجلات ذات الصلة

في كثير من الحالات، جدول في Microsoft Sentinel يتضمن أنواعًا متعددة من الأحداث. على سبيل المثال:

  • جدول Syslog يحتوي على بيانات من مصادر متعددة.
  • الجداول المخصصة قد تتضمن معلومات من مصدر واحد يوفر أكثر من نوع حدث واحد ويمكنه احتواء مخططات مختلفة.

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

تتم التصفية في KQL باستخدام عامل التشغيل where . على سبيل المثال، تقارير حدث Sysmon 1 إنشاء عملية، وبالتالي يتم تطبيعها إلى مخطط ProcessEvent. الحدث Sysmon الحدث 1 هو جزء من جدول الحدث، لذلك يمكنك استخدام عامل التصفية التالي:

Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1

هام

يجب ألا يقوم المحلل بالتصفية حسب الوقت. الاستعلام الذي يستخدم المحلل سيطبق نطاقًا زمنيًا.

التصفية حسب نوع المصدر باستخدام قائمة مراقبة

في بعض الحالات، لا يحتوي الحدث نفسه على معلومات تسمح بتصفية أنواع مصادر معينة.

على سبيل المثال، يتم إرسال أحداث Infoblox DNS كرسائل Syslog، ويصعب تمييزها عن رسائل Syslog المرسلة من مصادر أخرى. في مثل هذه الحالات، المحلل يعتمد على قائمة بالمصادر التي تحدد الأحداث ذات الصلة. يتم الاحتفاظ بهذه القائمة في قائمة مراقبة ASimSourceType.

لاستخدام قائمة مشاهدة ASimSourceType في محللاتك:

  • قم بتضمين السطر التالي في بداية المحلل الخاص بك:
let Sources_by_SourceType=(sourcetype:string){_GetWatchlist('ASimSourceType') | where SearchKey == tostring(sourcetype) | extend Source=column_ifexists('Source','') | where isnotempty(Source)| distinct Source };
  • أضف عامل تصفية يستخدم قائمة المشاهدة في قسم تصفية المحلل. على سبيل المثال، محلل Infoblox DNS يتضمن ما يلي في قسم التصفية:
| where Computer in (Sources_by_SourceType('InfobloxNIOS'))

لاستخدام هذا النموذج في المحلل الخاص بك:

  • استبدل الكمبيوتر باسم الحقل الذي يتضمن معلومات المصدر لمصدرك. يمكنك الاحتفاظ بهذا ككمبيوتر لأي محللات استنادا إلى Syslog.

  • استبدل رمز InfobloxNIOS المميز بقيمة من اختيارك للمحلل الخاص بك. أخبر مستخدمي المحلل أنه يجب عليهم تحديث قائمة مشاهدة ASimSourceType باستخدام القيمة المحددة وقائمة المصادر التي ترسل أحداثا من هذا النوع.

التصفية استنادًا إلى معلمات المحلل

عند تطوير محللات التصفية، تأكد من أن المحلل يقبل معلمات التصفية للمخطط ذي الصلة، كما هو موثق في المقالة المرجعية لهذا المخطط. استخدام محلل موجود كنقطة بداية يضمن أن المحلل الخاص بك يتضمن توقيع الدالة الصحيح. في معظم الحالات، تكون التعليمات البرمجية للتصفية الفعلية مشابهة أيضًا لتصفية محللات نفس المخطط.

عند التصفية، تأكد من أنك:

  • تقوم بالتصفية قبل التحليل باستخدام الحقول الفعلية. إذا لم تكن النتائج المصفاة دقيقة بما فيه الكفاية، فكرر الاختبار بعد التحليل لضبط النتائج. لمزيد من المعلومات، راجع تحسين عمليات التصفية.
  • لا تقم بالتصفية إذا لم يتم تعريف المعلمة ولا تزال لها القيمة الافتراضية.

الأمثلة التالية توضح كيفية تنفيذ التصفية لمعلمة سلسلة، حيث تكون القيمة الافتراضية عادة '*'، وبالنسبة لمعلمة قائمة، حيث تكون القيمة الافتراضية عادة قائمة فارغة.

srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)

تحسين التصفية

لضمان أداء المحلل، لاحظ توصيات التصفية التالية:

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

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

على سبيل المثال، راجع القصاصة البرمجية لمحلل Infoblox DNS التالي. يتحقق المحلل أولا من أن الحقل SyslogMessage يحتوي على كلمة عميل. ومع ذلك، قد يتم استخدام المصطلح في مكان مختلف في الرسالة، لذلك بعد تحليل حقل Log_Type، يتحقق المحلل مرة أخرى من أن كلمة عميل كانت بالفعل قيمة الحقل.

Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
      | extend Log_Type = tostring(Parser[1]),
      | where Log_Type == "client"

يتم الآن التحليل

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

مرتبة من خلال تحسين أدائها، يتم سرد عوامل تشغيل KQL التي تقوم بتحليلها أدناه. الأول يوفر الأداء الأكثر تحسينًا، بينما الأخير يوفر الأداء الأقل تحسينًا.

عامل ‏‏الوصف
split تحليل سلسلة من القيم المحددة.
parse_csv قم بتحليل سلسلة من القيم المنسقة كخط CSV (قيم مفصولة بفواصل).
parse قم بتحليل قيم متعددة من سلسلة عشوائية باستخدام نمط، والذي يمكن أن يكون نمطًا مبسطًا بأداء أفضل، أو تعبيرًا عاديًا.
extract_all قم بتحليل قيم مفردة من سلسلة عشوائية باستخدام تعبير عادي. extract_all أداء مشابه لتحليل إذا كان الأخير يستخدم تعبيرا عاديا.
extract قم باستخراج قيمة مفردة من سلسلة عشوائية باستخدام تعبير عادي. يوفر استخدام الاستخراج أداء أفضل من التحليل أو extract_all إذا كانت هناك حاجة إلى قيمة واحدة. ومع ذلك، فإن استخدام عمليات تنشيط متعددة لاستخراج عبر نفس السلسلة المصدر أقل كفاءة من تحليل واحد أو extract_all ويجب تجنبه.
parse_json تحليل القيم في سلسلة منسقة بصفتها JSON. إذا كانت هناك حاجة إلى قيم قليلة فقط من JSON، فإن استخدام التحليل أو الاستخراج أو extract_all يوفر أداء أفضل.
parse_xml تحليل القيم في سلسلة منسقة بصفتها XML. إذا كانت هناك حاجة إلى قيم قليلة فقط من XML، فإن استخدام التحليل أو الاستخراج أو extract_all يوفر أداء أفضل.

بالإضافة إلى سلسلة التحليل، قد تتطلب مرحلة التحليل المزيد من معالجة القيم الأصلية، بما في ذلك:

  • تحويل التنسيق والنوع. قد يحتاج الحقل المصدر، بمجرد استخراجه، إلى تنسيق ليناسب حقل المخطط الهدف. على سبيل المثال، قد تحتاج إلى تحويل سلسلة تمثل التاريخ والوقت إلى حقل تاريخ ووقت. وظائف مثل todatetime و tohex مفيدة في هذه الحالات.

  • البحث عن القيمة. بمجرد استخراجها، قد تحتاج قيمة الحقل المصدر إلى تعيينها إلى مجموعة القيم المحددة لحقل المخطط الهدف. على سبيل المثال، تقوم بعض المصادر بالإبلاغ عن رموز استجابة DNS الرقمية، بينما يفرض المخطط رموز استجابة النص الأكثر شيوعا. يمكن أن تكون الدالات iff وحالة مفيدة لتعيين بعض القيم.

    على سبيل المثال، يقوم محلل Microsoft DNS بتعيين الحقل EventResult استنادا إلى معرف الحدث ورمز الاستجابة باستخدام عبارة iff، كما يلي:

    extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')
    

    بالنسبة للعديد من القيم، استخدم جدول البيانات والبحث، كما هو موضح في محلل DNS نفسه:

    let RCodeTable = datatable(ResponseCode:int,ResponseCodeName:string) [ 0, 'NOERROR', 1, 'FORMERR'....];
    ...
     | lookup RCodeTable on ResponseCode
     | extend EventResultDetails = case (
     isnotempty(ResponseCodeName), ResponseCodeName,
     ResponseCode between (3841 .. 4095), 'Reserved for Private Use',
     'Unassigned')
    

تعيين القيم

في كثير من الحالات، يجب تسوية القيمة الأصلية المستخرجة. على سبيل المثال، في ASIM يستخدم عنوان MAC النقطتين كفاصل، بينما قد يرسل المصدر عنوان MAC محدد الواصلة. يتم توسيع عامل التشغيل الأساسي لتحويل القيم، جنبا إلى جنب مع مجموعة واسعة من سلسلة KQL والدالات الرقمية والتاريخ، كما هو موضح في قسم التحليل أعلاه.

استخدم عبارات حالة الأحرف والفاحص والبحث عندما تكون هناك حاجة لتعيين مجموعة من القيم إلى القيم التي يسمح بها الحقل الهدف.

عندما يتم تعيين كل قيمة مصدر إلى قيمة مستهدفة، حدد التعيين باستخدام عامل تشغيل جدول البيانات والبحث لتعيينه. على سبيل المثال

let NetworkProtocolLookup = datatable(Proto:real, NetworkProtocol:string)[
        6, 'TCP',
        17, 'UDP'
   ];
    let DnsResponseCodeLookup=datatable(DnsResponseCode:int,DnsResponseCodeName:string)[
      0,'NOERROR',
      1,'FORMERR',
      2,'SERVFAIL',
      3,'NXDOMAIN',
      ...
   ];
   ...
   | lookup DnsResponseCodeLookup on DnsResponseCode
   | lookup NetworkProtocolLookup on Proto

لاحظ أن البحث مفيد وفعال أيضًا عندما يحتوي التعيين على قيمتين محتملتين فقط.

عندما تكون شروط التعيين أكثر تعقيدا، استخدم دالات الأحرف أو الحالة . تتيح الدالة iff تعيين قيمتين:

| extend EventResult = 
      iff(EventId==257 and ResponseCode==0,'Success','Failure’)

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

| extend DnsResponseCodeName = 
      case (
        DnsResponseCodeName != "", DnsResponseCodeName,
        DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
        'Unassigned'
      )

إعداد الحقول في مجموعة النتائج

يجب على المحلل إعداد الحقول في مجموعة النتائج للتأكد من استخدام الحقول التي تمت تسويتها.

يتم استخدام عوامل تشغيل KQL التالية لإعداد الحقول في مجموعة النتائج الخاصة بك:

عامل ‏‏الوصف متى تستخدمه في محلل
project-rename إعادة تسمية الحقول. إذا كان هناك حقل موجود في الحدث الفعلي ولا يحتاج إلا إلى إعادة تسميته، فاستخدم إعادة تسمية المشروع. لا يزال الحقل الذي تمت إعادة تسميته يتصرف مثل حقل مضمن، كما أن العمليات في الحقل لها أداء أفضل بكثير.
project-away إزالة الحقول. استخدم project-away لحقول معينة تريد إزالتها من مجموعة النتائج. نوصي بعدم إزالة الحقول الأصلية التي لم تتم تسويتها من مجموعة النتائج، ما لم تخلق ارتباكا أو كبيرة جدا وقد يكون لها آثار على الأداء.
project يحدد الحقول الموجودة من قبل، أو التي تم إنشاؤها كجزء من العبارة، ويزيل كافة الحقول الأخرى. غير مستحسن للاستخدام في المحلل، حيث لا يجب على المحلل إزالة أي حقول أخرى لم تتم تسويتها. إذا كنت بحاجة إلى إزالة حقول معينة، مثل القيم المؤقتة المستخدمة أثناء التحليل، فاستخدم المشروع بعيدا لإزالتها من النتائج.
extend إضافة أسماء مستعارة. بالإضافة إلى دوره في إنشاء الحقول المحسوبة، يتم استخدام عامل تشغيل التوسيع أيضا لإنشاء أسماء مستعارة.

معالجة متغيرات التحليل

في كثير من الحالات، الأحداث في دفق الأحداث تتضمن متغيرات تتطلب منطق تحليل مختلف. لتحليل متغيرات مختلفة في محلل واحد، استخدم عبارات شرطية مثل iff و case، أو استخدم بنية اتحاد.

لاستخدام الاتحاد لمعالجة متغيرات متعددة، قم بإنشاء دالة منفصلة لكل متغير، واستخدم عبارة الاتحاد لدمج النتائج:

let AzureFirewallNetworkRuleLogs = AzureDiagnostics
    | where Category == "AzureFirewallNetworkRule"
    | where isnotempty(msg_s);
let parseLogs = AzureFirewallNetworkRuleLogs
    | where msg_s has_any("TCP", "UDP")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        ":"                  srcPortNumber:int
    …
    | project-away msg_s;
let parseLogsWithUrls = AzureFirewallNetworkRuleLogs
    | where msg_s has_all ("Url:","ThreatIntel:")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        " to "               dstIpAddr:string
    …
union parseLogs,  parseLogsWithUrls…

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

نشر المحللات

انشر المحللات يدويًا عن طريق نسخها إلى صفحة Azure Monitor Log وحفظ الاستعلام كدالة. هذا الأسلوب مفيد للاختبار. لمزيد من المعلومات، راجع إنشاء دالة.

لنشر عدد كبير من المحللات، نوصي باستخدام قوالب ARM المحلل، كما يلي:

  1. أنشئ ملف YAML استنادًا إلى القالب ذي الصلة لكل مخطط وتضمين الاستعلام فيه. ابدأ بـ قالب YAML ذي الصلة بنوع المخطط والموزع، أو التصفية أو بدون معلمة.

  2. استخدم محول قالب ASIM Yaml إلى ARM لتحويل ملف YAML إلى قالب ARM.

  3. في حالة نشر تحديث، احذف الإصدارات القديمة من الدوال باستخدام المدخل أو أداة حذف الدالة PowerShell.

  4. انشر قالبك باستخدام مدخل Azure أو PowerShell.

يمكنك أيضا دمج قوالب متعددة في عملية توزيع واحدة باستخدام قوالب مرتبطة.