Kontrolowanie i śledzenie zmian w zadaniach dotyczących incydentów w usłudze Microsoft Sentinel w portalu Azure

Zadania związane z incydentami zapewniają kompleksowe i jednolite traktowanie zdarzeń dla wszystkich pracowników SOC. Listy zadań są zwykle definiowane zgodnie z ustaleniami dokonanymi przez starszych analityków lub menedżerów SOC i stosowane w praktyce przy użyciu reguł automatyzacji lub podręczników.

Analitycy mogą zobaczyć na stronie szczegółów incydentu listę zadań, które muszą wykonać dla danego incydentu, i oznaczać je jako ukończone w miarę wykonywania. Analitycy mogą również ręcznie tworzyć własne zadania na miejscu bezpośrednio z poziomu zdarzenia.

W tym artykule wyjaśniono, jak jako menedżer SOC możesz sprawdzać historię zadań incydentów w Microsoft Sentinel i śledzić zmiany wprowadzane w nich na przestrzeni całego ich cyklu życia, aby ocenić skuteczność przypisywania zadań oraz ich wpływ na wydajność i prawidłowe funkcjonowanie Twojego SOC.

Struktura tablicy Zadania w tabeli SecurityIncident

Tabela SecurityIncident jest tabelą inspekcji — przechowuje nie same zdarzenia, ale raczej rekordy życia zdarzenia: jego utworzenie i wszelkie wprowadzone w nim zmiany. Za każdym razem, gdy zostanie utworzone zdarzenie lub zostanie wprowadzona zmiana w zdarzeniu, w tej tabeli zostanie wygenerowany rekord przedstawiający bieżący stan zdarzenia.

Dodanie pól szczegółów zadań do schematu tabeli SecurityIncident pozwala na głębszy audyt zadań.

Szczegółowe informacje dodane do pola Zadania składają się z par klucz-wartość, które mają następującą strukturę:

Klucz Opis wartości
createdBy Tożsamość, która utworzyła zadanie:
- adres e-mail: adres e-mail tożsamości
- name: nazwa tożsamości
- objectId: identyfikator GUID tożsamości
- userPrincipalName: UPN tożsamości
createdTimeUtc Czas utworzenia zadania w formacie UTC.
lastCompletedTimeUtc Godzina oznaczenia zadania jako ukończonego, w czasie UTC.
lastModifiedBy Tożsamość, która ostatnio zmodyfikowała zadanie:
- adres e-mail: adres e-mail tożsamości
- name: nazwa tożsamości
- objectId: identyfikator GUID tożsamości
- userPrincipalName: UPN tożsamości
lastModifiedTimeUtc Czas ostatniej modyfikacji zadania w formacie UTC.
Stan Bieżący stan zadania: Nowy, Ukończony, Usunięty.
taskId Identyfikator zasobu zadania.
Tytuł Przyjazna nazwa nadana zadaniu przez jego twórcę.

Wyświetl zadania dotyczące zdarzeń w tabeli SecurityIncident

Oprócz skoroszytu Zadania incydentów możesz monitorować aktywność zadań, wysyłając zapytanie do tabeli SecurityIncident w Logs. Ta sekcja pokazuje, jak zapytać tabelę oraz czytać i rozumieć wyniki, aby uzyskać informacje o aktywności zadaniowej.

  1. Na stronie Dzienniki wprowadź następujące zapytanie w oknie zapytania i uruchom go. To zapytanie zwróci wszystkie zdarzenia, które mają przypisane zadania.

    SecurityIncident
    | where array_length( Tasks) > 0
    

    Możesz dodać dowolną liczbę instrukcji do zapytania, aby filtrować i zawęzić wyniki. Aby zademonstrować sposób wyświetlania i zrozumienia wyników, dodamy instrukcje filtrowania wyników tak, aby były widoczne tylko zadania dla pojedynczego zdarzenia, a także dodamy instrukcję project , aby zobaczyć tylko te pola, które będą przydatne do naszych celów, bez dużej ilości bałaganu.

    Aby uzyskać więcej informacji, zobacz omówienie języka zapytań Kusto.

    SecurityIncident
    | where array_length( Tasks) > 0
    | where IncidentNumber == "405211"
    | sort by LastModifiedTime desc 
    | project IncidentName, Title, LastModifiedTime, Tasks
    
  2. Przyjrzyjmy się najnowszemu rekordowi tego incydentu i znajdźmy listę skojarzonych z nim zadań.

    1. Wybierz ikonę rozwijania obok pierwszego wiersza w wynikach zapytania (które posortowano w kolejności od najnowszych do najstarszych).

      Zrzut ekranu wyników zapytania przedstawiający incident wraz z jego zadaniami.

    2. Pole Zadania to tablica bieżącego stanu wszystkich zadań w tym zdarzeniu. Wybierz ekspander, aby wyświetlić każdy element w tablicy we własnym wierszu.

      Zrzut ekranu wyników zapytania przedstawiający incydent z rozwiniętymi zadaniami.

    3. Teraz widzisz, że w tym incydencie są dwa zadania. Każdy z nich jest reprezentowany z kolei przez tablicę rozszerzalną. Wybierz ekspander pojedynczego zadania, aby wyświetlić jego informacje.

      Zrzut ekranu wyników zapytania przedstawiający incydent z rozwiniętym pojedynczym zadaniem.

    4. Tutaj zobaczysz szczegóły pierwszego zadania w tablicy ("0" jest pozycją indeksu zadania w tablicy). Pole title wyświetla nazwę zadania widoczną w incydencie.

Wyświetlanie zadań dodanych do listy

Wykonaj następujące kroki, aby dodać zadanie do incydentu i obserwuj, jak zmienia się rekord Incydentu SecurityIncident .

  1. Dodajmy zadanie do zdarzenia, a następnie wrócimy tutaj, uruchomimy zapytanie ponownie i zobaczymy zmiany w wynikach.

    1. Na stronie Zdarzenia wprowadź numer identyfikatora zdarzenia na pasku wyszukiwania.

    2. Otwórz stronę szczegółów zdarzenia i wybierz pozycję Zadania na pasku narzędzi.

    3. Dodaj nowe zadanie, nadaj mu nazwę "To zadanie jest zadaniem testowym!", a następnie wybierz pozycję Zapisz. Ostatnie zadanie pokazane poniżej to to, co powinieneś otrzymać na końcu:

      Zrzut ekranu pokazuje panel zadań incydentu.

  2. Teraz wróćmy do strony Logi i ponownie uruchommy zapytanie SecurityIncident .

    W wynikach zobaczysz, że w tabeli znajduje się nowy rekord dla tego samego zdarzenia (zanotuj sygnatury czasowe). Rozwiń rekord i zobaczysz, że podczas gdy rekord, który widzieliśmy wcześniej, miał dwa zadania w tablicy Zadania , nowy ma trzy. Najnowsze zadanie to to, które właśnie dodaliśmy, jak widać po jego tytule.

    Zrzut ekranu przedstawiający wyniki zapytania przedstawiające zdarzenie z nowo utworzonym zadaniem.

Wyświetlanie zmian stanu zadań

Teraz, jeśli wrócimy do zadania zatytułowanego "To zadanie jest zadaniem testowym!" na stronie szczegółów zdarzenia i oznaczymy je jako ukończone, a następnie wrócimy do obszaru Dzienniki i ponownie uruchomimy zapytanie, zobaczymy kolejny nowy rekord dla tego samego zdarzenia, tym razem pokazując nowy stan zadania jako Ukończono.

Zrzut ekranu przedstawiający wyniki zapytania pokazujące zadanie incydentu z nowym statusem.

Wyświetlanie usuwania zadań

Wróćmy do listy zadań na stronie szczegółów zdarzenia i usuńmy zadanie zatytułowane "To zadanie jest zadaniem testowym!".

Gdy wrócimy do logów i ponownie uruchomimy zapytanie o zadanie incydentu, zobaczymy kolejny nowy rekord, tym razem tylko status naszego zadania — tego zatytułowanego "To zadanie jest zadaniem testowym!" —zostanie usunięty.

Jednak gdy zadanie pojawi się raz w tablicy (ze stanem Usunięto ), nie będzie już wyświetlane w tablicy Zadania w nowych rekordach dla tego zdarzenia w tabeli SecurityIncident . Istniejące, wcześniejsze zapisy dotyczące incydentu będą nadal zachowywać dowody na to, że to zadanie kiedyś istniało.

Wyświetlanie aktywnych zadań należących do zamkniętego incydentu

Poniższe zapytanie umożliwia sprawdzenie, czy zdarzenie zostało zamknięte, ale nie wszystkie przydzielone do niego zadania zostały ukończone. Ta wiedza może pomóc Ci sprawdzić, czy wszelkie pozostałe nierozstrzygnięte kwestie w toku postępowania zostały doprowadzone do końca — wszystkie odpowiednie strony zostały powiadomione, wszystkie uwagi zostały odnotowane, wszystkie odpowiedzi zostały zweryfikowane itd. Zapytanie wykorzystuje arg_max funkcję agregacji, aby zwracać tylko najnowszy rekord dla każdego incydentu i każdego zadania, tak aby wyniki odzwierciedlały najnowszy stan.

Wykonaj następujące zapytanie, aby pobrać najnowszy rekord dla każdego incydentu, przefiltrować zamknięte incydenty i zwrócić wszystkie zadania, które jeszcze nie zostały ukończone lub usunięte:

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
| sort by lastModifiedTimeUtc desc

Więcej informacji o operatorach i funkcjach Kusto używanych w przykładowych zapytaniach w tym artykule, zobacz:

Aby uzyskać więcej informacji na temat języka KQL, zobacz omówienie języka zapytań Kusto (KQL).

Inne zasoby:

Następne kroki