次の方法で共有


Azure portal で Microsoft Sentinel のインシデント タスクへの変更を監査および追跡する

インシデント タスクは、SOC 担当者全員がインシデントを包括的かつ統一的に処理するためのものです。 タスク リストは、通常、上級アナリストまたは SOC マネージャーの決定に従って定義され、自動化ルールまたはプレイブックを使用して実施されます。

アナリストは、特定のインシデントに対して実行する必要があるタスクの一覧をインシデントの詳細ページで確認し、進行に合わせて完了とマークすることができます。 アナリストは、インシデント内からその場で、手動で自分のタスクを作成することもできます。

この記事では、SOC マネージャーとして、タスクの割り当てを把握し、それが SOC の効率性と有効性に寄与しているかどうかを判断するために、Microsoft Sentinel のインシデント タスクの履歴を監査し、行われた変更をライフ サイクル全体で追跡する方法について説明します。

SecurityIncident テーブル内の Tasks 配列の構造

SecurityIncident テーブルは監査テーブルであり、インシデント自体ではなく、インシデントの一生 (インシデントの作成とそれに対する変更) の記録が格納されます。 インシデントが作成されたり、インシデントに変更が加えられたりするたびに、このテーブルにはインシデントの現在の状態を示すレコードが生成されます。

このテーブルのスキーマにタスクの詳細情報を追加すると、タスクをより詳細に監査できます。

Tasks フィールドに追加される詳細情報は、次のような構造を持つキーと値のペアで構成されます:

キー 値の説明
CreatedBy タスクを作成した ID:
- email: ID のメール アドレス
- name: ID の名前
- objectId: ID の GUID
- userPrincipalName: ID の UPN
createdTimeUtc タスクが作成された日時 (UTC)。
lastCompletedTimeUtc タスクが完了としてマークされた日時 (UTC)。
LastModifiedBy タスクを最後に変更した ID:
- email: ID のメール アドレス
- name: ID の名前
- objectId: ID の GUID
- userPrincipalName: ID の UPN
Site.LastModifiedTimeUtc タスクが最後に変更された日時 (UTC)。
status タスクの現在の状態: New、Completed、Deleted。
taskId タスクのリソース ID。
title 作成者がタスクにつけたフレンドリ名。

SecurityIncident テーブルのインシデント タスクを表示する

インシデント タスク ブックとは別に、[ログ]SecurityIncident テーブルにクエリを実行して、タスク アクティビティを監査することができます。 この記事の残りの部分では、これを行う方法と、クエリ結果を読んで解釈し、タスク アクティビティ情報を得る方法について説明します。

  1. [ログ] ページで、クエリ ウィンドウに次のクエリを入力して実行します。 このクエリは、割り当てられたタスクがあるすべてのインシデントを返します。

    SecurityIncident
    | where array_length( Tasks) > 0
    

    クエリに任意の数のステートメントを追加して、結果をフィルターして絞り込むことができます。 結果を見て解釈する方法を説明するために、1 つのインシデントのタスクのみが得られるように結果をフィルターするステートメントを追加し、また余計な結果を減らして目的に役立つフィールドのみが表示されるよう、project ステートメントも追加します。

    Kusto 照会言語の使用方法についてはこちら

    SecurityIncident
    | where array_length( Tasks) > 0
    | where IncidentNumber == "405211"
    | sort by LastModifiedTime desc 
    | project IncidentName, Title, LastModifiedTime, Tasks
    
  2. このインシデントの最新のレコードを見て、関連付けられているタスクの一覧を見てみましょう。

    1. クエリ結果 (新着順に並べられています) の一番上の行の横にある展開コントロールを選択します。

      インシデントとそのタスクが表示されたクエリ結果のスクリーンショット。

    2. Tasks フィールドは、このインシデント内のすべてのタスクの現在の状態の配列です。 展開コントロールを選択すると、配列の各項目がそれぞれの行で表示されます。

      タスクが展開されたインシデントを示すクエリ結果のスクリーンショット。

    3. これで、このインシデントには 2 つのタスクがあることがわかります。 各タスクは、展開可能な配列で順番に表示されます。 1 つのタスクの展開コントロールを選択して、情報を表示します。

      1 つのタスクが展開されたインシデントを示すクエリ結果のスクリーンショット。

    4. 配列の最初のタスクの詳細が表示されています ("0" はタスクの配列内でのインデックス位置です)。 title フィールドには、インシデントに表示されるタスクの名前が表示されます。

リストに追加されたタスクを確認する

  1. インシデントにタスクを追加し、ここに戻ってもう一度クエリを実行して、結果の変化を確認しましょう。

    1. [インシデント] ページで、[検索] バーにインシデント ID 番号を入力します。

    2. インシデントの詳細ページを開き、ツール バーから [タスク] を選びます。

    3. 新しいタスクを追加し、「これはテスト タスクです」という名前を付けて、[保存] を選択します。 次に示す最後のタスクが、最終的にできるものです。

      インシデント タスク パネルを示すスクリーンショット。

  2. [ログ] ページに戻り、クエリをもう一度実行しましょう。

    結果を見ると、この同じインシデントのテーブルに新しいレコードがあることがわかります (タイムスタンプに注目してください)。 レコードを展開すると、前に見たレコードでは Tasks 配列に 2 つのタスクがあったのに対し、新しいレコードでは 3 つあることがわかります。 最新のタスクは、タイトルを見ればわかるように、先ほど追加したタスクです。

    インシデントと新たに作成されたタスクを示すクエリ結果のスクリーンショット。

タスクのステータス変更を確認する

ここで、インシデントの詳細ページであの新しいタスクに戻り、完了としてマークした後、[ログ] に戻ってクエリをもう一度再実行すると、同じインシデントの新しいレコードがまた 1 つ増えますが、今度はタスクの新しいステータスが Completed であることが示されています。

インシデント タスクとその新しいステータスを示すクエリ結果のスクリーンショット。.

タスクの削除を確認する

インシデントの詳細ページのタスク リストに戻り、前に追加したタスクを削除しましょう。

[ログ] に戻ってクエリをもう一度実行すると、別の新しいレコードが表示されますが、今回は「これはテスト タスクです」というタイトルのタスクのステータスが Deleted になっています。

ただし、このような (Deleted ステータスの) タスクは、配列に一度現れると、SecurityIncident テーブルのそのインシデントの新しいレコードでは、Tasks 配列に表示されなくなります。 上記のような既存のレコードは、このタスクが過去に存在したという証拠を保持し続けます。

終了したインシデントに属するアクティブなタスクを確認する

次のクエリを使用すると、インシデントは終了していても、割り当てられたタスクがすべて完了していないかどうかを確認できます。 この知識は、調査で残っていた未解決の部分が結論に至った (すべての関係者に通知が送られ、すべてのコメントが入力され、すべての回答が検証された) かどうかを確認するのに役立ちます。

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

上の例で使用されている次の項目の詳細については、Kusto ドキュメントを参照してください。

KQL の詳細については、「Kusto 照会言語 (KQL) の概要」を参照してください。

その他のリソース:

次のステップ