审核和跟踪 Microsoft Sentinel 中事件任务的更改

事件任务可确保所有 SOC 人员都能全面和统一地处理事件。 任务列表通常根据高级分析师或 SOC 经理的决定进行定义,并使用自动化规则或 playbook 付诸实践。

分析师可以在事件详细信息页上查看需要为特定事件执行的任务列表,并随时将它们标记为完成。 分析师还可以直接在事件中立即手动创建自己的任务。

本文介绍了作为 SOC 经理该如何审核 Microsoft Sentinel 事件任务的历史记录,并跟踪这些任务在整个生命周期中所做的更改,以衡量任务分配的成效及其对 SOC 的效率和正常运行的贡献。

SecurityIncident 表中 Tasks 数组的结构

SecurityIncident 表是一个审核表,它存储的不是事件本身,而是对事件生存期的记录:事件的创建和对事件所做的任何更改。 每当创建事件或更改事件时,都会在此表中生成一条记录,其中显示该事件的当前状态。

通过向此表的架构添加任务详细信息,可以更深入地审核任务。

添加到“任务”字段的详细信息由采用以下结构的键值对组成:

密钥 值说明
createdBy 创建任务的标识:
- email:标识的电子邮件地址
- name:标识的名称
- objectId:标识的 GUID
- userPrincipalName:标识的 UPN
createdTimeUtc 任务创建时间 (UTC)。
lastCompletedTimeUtc 任务标记为完成的时间 (UTC)。
lastModifiedBy 上次修改任务的标识:
- email:标识的电子邮件地址
- name:标识的名称
- objectId:标识的 GUID
- userPrincipalName:标识的 UPN
lastModifiedTimeUtc 上次修改任务的时间 (UTC)。
status 任务的当前状态:新建、已完成、已删除。
taskId 任务的资源 ID。
title 创建者为任务提供的易记名称。

查看 SecurityIncident 表中的事件任务

除了事件任务工作簿外,还可以通过查询日志中的 SecurityIncident 表来审核任务活动。 本文的其余部分介绍如何执行此操作,以及如何读取和理解查询结果以获取任务活动信息。

  1. 在“日志”页中,在查询窗口中输入以下查询并运行。 此查询将返回分配了任务的所有事件。

    SecurityIncident
    | where array_length( Tasks) > 0
    

    可以将任意数量的语句添加到查询中,以筛选结果和缩小结果范围。 为了演示如何查看和理解结果,我们将添加语句来筛选结果,以便只看到单个事件的任务,我们还将添加一个 project 语句,以便只看到那些对我们的目标有用的字段,以免繁杂混乱。

    详细了解如何使用 Kusto 查询语言

    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. 在“事件”页上,在搜索栏中输入事件 ID 号。

    2. 打开事件详细信息页,然后从工具栏中选择“任务”

    3. 添加新任务,将其命名为“此任务是测试任务!”,然后选择“保存”。 下面显示的是应在最后完成的最终任务:

      Screenshot shows incident tasks panel.

  2. 现在,让我们返回到“日志”页并再次运行查询。

    在结果中,你将看到表中有一条针对此相同事件的新记录(记下时间戳)。 展开记录,你将看到,虽然我们之前看到的记录在其 Tasks 数组中具有两个任务,但新记录有三个任务。 最新的任务是我们刚刚添加的任务,正如标题所示。

    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 表中该事件的新记录的 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
| order by lastModifiedTimeUtc desc

后续步骤