تدقيق وتعقب التغييرات على مهام الحوادث في Microsoft Sentinel

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

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

تشرح هذه المقالة كيف يمكنك، بصفتك مدير SOC، تدقيق محفوظات مهام حوادث Microsoft Sentinel، وتتبع التغييرات التي تم إجراؤها عليها طوال دورة حياتها، من أجل قياس فعالية تعيينات المهام ومساهمتها في كفاءة SOC وأدائه السليم.

بنية صفيف المهام في جدول SecurityIncident

جدول SecurityIncident هو جدول تدقيق - لا يخزن الحوادث نفسها، بل يسجل عمر الحدث: إنشائه وأي تغييرات تم إجراؤها عليه. في أي وقت يتم فيه إنشاء حادث أو إجراء تغيير على حدث، يتم إنشاء سجل في هذا الجدول يعرض الحالة الحالية للحدث.

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

تتكون المعلومات التفصيلية المضافة إلى حقل المهام من أزواج قيم المفاتيح التي تأخذ البنية التالية:

مفتاح وصف القيمة
تم الإنشاء من خلال الهوية التي أنشأت المهمة:
- البريد الإلكتروني: عنوان البريد الإلكتروني للهوية
- الاسم: اسم الهوية
- معرف الكائن: GUID للهوية
- userPrincipalName: UPN للهوية
تم الإنشاءTimeUtc وقت إنشاء المهمة، بالتوقيت العالمي المتفق عليه.
lastCompletedTimeUtc الوقت الذي تم فيه وضع علامة على المهمة مكتملة، بالتوقيت العالمي المتفق عليه.
التعديل الأخير من خلال الهوية التي عدلت المهمة آخر إجراء:
- البريد الإلكتروني: عنوان البريد الإلكتروني للهوية
- الاسم: اسم الهوية
- معرف الكائن: GUID للهوية
- userPrincipalName: UPN للهوية
LastModifiedTimeUtc وقت آخر تعديل للمهمة، بالتوقيت العالمي المتفق عليه.
الحالة الحالة الحالية للمهمة: جديد، مكتمل، محذوف.
معرف المهمة معرف المورد للمهمة.
title الاسم المألوف للمهمة من قبل منشئها.

عرض مهام الحوادث في جدول SecurityIncident

وبصرف النظر عن مصنف مهام الحوادث، يمكنك تدقيق نشاط المهمة عن طريق الاستعلام عن جدول SecurityIncident في السجلات. توضح لك بقية هذه المقالة كيفية القيام بذلك، بالإضافة إلى كيفية قراءة نتائج الاستعلام وفهمها للحصول على معلومات نشاط المهمة.

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

    SecurityIncident
    | where array_length( Tasks) > 0
    

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

    تعرف على المزيد حول استخدام Kusto Query Language.

    SecurityIncident
    | where array_length( Tasks) > 0
    | where IncidentNumber == "405211"
    | sort by LastModifiedTime desc 
    | project IncidentName, Title, LastModifiedTime, Tasks
    
  2. لنلق نظرة على أحدث سجل لهذا الحادث، ونعثر على قائمة المهام المقترنة به.

    1. حدد الموسع الموجود بجانب الصف العلوي في نتائج الاستعلام (التي تم فرزها بترتيب تنازلي للراحة).

      Screenshot of query results showing an incident with its tasks.

    2. حقل المهام هو صفيف من الحالة الحالية لجميع المهام في هذا الحدث. حدد الموسع لعرض كل عنصر في الصفيف في صفه الخاص.

      Screenshot of query results showing an incident with its tasks expanded.

    3. الآن ترى أن هناك مهمتين في هذا الحدث. يتم تمثيل كل واحد بدوره بواسطة صفيف قابل للتوسيع. حدد موسع مهمة واحدة لعرض معلوماته.

      Screenshot of query results showing an incident with a single task expanded.

    4. هنا ترى تفاصيل المهمة الأولى في الصفيف ("0" هو موضع فهرس المهمة في الصفيف). يعرض حقل العنوان اسم المهمة كما هو معروض في الحدث.

عرض المهام المضافة إلى القائمة

  1. دعونا نضيف مهمة إلى الحدث، ثم سنعود إلى هنا، ونشغل الاستعلام مرة أخرى، ونشاهد التغييرات في النتائج.

    1. في صفحة الحوادث ، أدخل رقم معرف الحادث في شريط البحث.

    2. افتح صفحة تفاصيل الحدث وحدد المهام من شريط الأدوات.

    3. أضف مهمة جديدة، وأعطها الاسم "هذه المهمة مهمة اختبار!"، ثم حدد حفظ. المهمة الأخيرة الموضحة أدناه هي ما يجب أن ينتهي بك الأمر:

      Screenshot shows incident tasks panel.

  2. الآن دعونا نعود إلى صفحة السجلات ونشغل استعلامنا مرة أخرى.

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

    Screenshot of query results showing an incident with its newly created task.

عرض تغييرات الحالة على المهام

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

Screenshot of query results showing an incident task with its new status.

عرض حذف المهام

لنعد إلى قائمة المهام في صفحة تفاصيل الحدث ونحذف المهمة التي أضفناها سابقا.

عندما نعود إلى السجلات ونشغل الاستعلام مرة أخرى، سنرى سجلا جديدا آخر، وهذه المرة فقط حالة مهمتنا - السجل الذي بعنوان "هذه المهمة مهمة اختبار!" —سيتم حذفه.

ومع ذلك، بمجرد ظهور المهمة مرة واحدة في الصفيف (بحالة محذوفة )، لن تظهر بعد ذلك في صفيف المهام في سجلات جديدة لهذا الحدث في جدول SecurityIncident . والسجلات الموجودة، كتلك التي رأيناها أعلاه، ستستمر في الاحتفاظ بالأدلة على أن هذه المهمة كانت موجودة في السابق.

عرض المهام النشطة التي تنتمي إلى حادث مغلق

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

SecurityIncident
| summarize arg_max(TimeGenerated, *) by IncidentNumber
| where Status == 'Closed'
| mv-expand Tasks
| evaluate bag_unpack(Tasks)
| summarize arg_max(lastModifiedTimeUtc, *) by taskId
| where status !in ('Completed', 'Deleted')
| project TaskTitle = ['title'], TaskStatus = ['status'], createdTimeUtc, lastModifiedTimeUtc = column_ifexists("lastModifiedTimeUtc", datetime(null)), TaskCreator = ['createdBy'].name, lastModifiedBy, IncidentNumber, IncidentOwner = Owner.userPrincipalName
| order by lastModifiedTimeUtc desc

الخطوات التالية