创建自定义分析规则以检测威胁

数据源连接到 Microsoft Sentinel 后,需创建自定义分析规则,帮助发现环境中的威胁和异常行为。

分析规则将在你的整个环境中搜索特定事件或事件集,在达到特定事件阈值或条件时发出警报,生成故障事件以供 SOC 进行会审和调查,并通过自动化跟踪和修正流程来响应威胁。

提示

创建自定义规则时,请使用现有规则作为模板或参考。 使用现有规则作为基线有助于在进行任何需要的更改之前构建大部分的逻辑。

  • 创建分析规则
  • 定义处理事件和警报的方式
  • 定义生成警报和故障事件的方式
  • 为规则选择自动化威胁响应

使用计划查询创建自定义分析规则

  1. 从 Microsoft Sentinel 导航菜单中,选择“分析”。

  2. 在顶部的操作栏中,选择“+创建”,然后选择“计划查询规则”。 这样会打开“分析规则向导”。

    Create scheduled query

分析规则向导 -“常规”选项卡

  • 提供一个唯一的“名称”和“说明”。

  • 在“策略和技术”字段中,可以从攻击类别中进行选择,对规则进行分类。 这些类别基于 MITRE ATT&CK 框架的策略和技术生成。

    根据映射到 MITRE ATT&CK 策略和技术的规则检测到的警报创建的事件会自动继承该规则的映射。

  • 根据需要设置警报严重性,如果规则的状态为“真正”,则匹配触发该规则的活动可能对目标环境的影响。

    • 信息性。 对系统没有影响,但信息可能表明威胁行动者计划了未来步骤。
    • 。 直接影响将是微乎其微的。 威胁行动者可能需要执行多个步骤,才能对环境产生影响。
    • 。 威胁行动者可能通过此活动对环境产生一些影响,但影响范围有限或需要其他活动。
    • 。 确定的活动为威胁行动者提供了广泛的访问权限来对环境执行操作,或者由对环境的影响触发。

    严重性级别默认值不能保证当前或环境影响级别。 自定义警报详细信息,从而使用查询输出中任何相关字段的值自定义给定警报实例的严重性、策略和其他属性。

    Microsoft Sentinel 分析规则模板的严重性定义仅与分析规则创建的警报相关。 对于从其他服务引入的警报,严重性由源安全服务定义。

  • 在你创建规则时,默认情况下规则的“状态”为“已启用”,这表示当你完成创建后,它将立即运行。 如果你不需要让此规则立即运行,请选择“已禁用”,这样就会将它添加到“可用规则”选项卡中,当你需要运行此规则时,可从该选项卡中启用它。

    Start creating a custom analytics rule

定义规则查询逻辑并配置设置

在“设置规则逻辑”选项卡中,可以直接在“规则查询”字段中编写查询,也可以在 Log Analytics 中创建查询,然后将创建的查询复制并粘贴到字段中。

  • 采用 Kusto 查询语言 (KQL) 编写查询。 有关详细信息,请参阅 KQL 概念查询以及这篇很方便使用的快速参考指南

  • 下面的屏幕截图中展示的示例查询 SecurityEvent 表,以显示失败的 Windows 登录事件类型。

    Configure query rule logic and settings

  • 下面提供了另一个查询示例,此查询将在 Azure 活动中创建的资源数异常时发出警报。

    AzureActivity
    | where OperationNameValue == "MICROSOFT.COMPUTE/VIRTUALMACHINES/WRITE" or OperationNameValue == "MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE"
    | where ActivityStatusValue == "Succeeded"
    | make-series dcount(ResourceId)  default=0 on EventSubmissionTimestamp in range(ago(7d), now(), 1d) by Caller
    

    注意

    规则查询最佳做法:

    • 查询长度应介于 1 到 10,000 个字符之间,并且不得包含“search *”或“union *”。 你可以使用用户定义的函数来克服查询长度限制。

    • 不支持在 Log Analytics 查询窗口中使用 ADX 函数创建 Azure 数据资源管理器查询。

    • 在查询中使用 bag_unpack 函数时,如果使用“project field1将列投影为字段而列不存在,此时查询将失败。 为了防止这种情况发生,必须按以下方式对列进行投影

      • project field1 = column_ifexists("field1","")

警报扩充

  • 使用实体映射配置部分将查询结果中的参数映射到 Microsoft Sentinel 识别的实体。 实体可通过基本信息扩充规则的输出(警报和故障事件),这些信息将用作后续调查过程和补救操作的构建基块。 在“故障事件设置”选项卡中,你也可以根据这些信息将警报分组到故障事件中。

    有关详细信息,请参阅 Microsoft Sentinel 中的实体

    请参阅在 Microsoft Sentinel 中将数据字段映射到实体,查看完整的实体映射说明,并了解有关限制和后向兼容性的重要信息。

  • 使用“自定义详细信息”配置部分,从查询中提取事件数据项,并在此规则生成的警报中展现这些项,这样你就可以从警报和故障事件中迅速了解事件内容。

    请详细了解如何在警报中展现自定义详细信息,并参阅完整说明

  • 使用“警报详细信息”配置部分,以使用基础查询结果中的详细信息替代警报的属性的默认值。 警报详细信息可以让你在警报的标题中显示攻击者的 IP 地址或帐户名称,使其显示在你的事件队列中,以便你能更详细、更清晰地了解威胁状况。

    请参阅有关自定义警报详细信息的完整说明。

注意

整个警报的大小限制为 64 KB。

  • 增长超过 64 KB 的警报将被截断。 识别出实体后,它们将被逐一添加到警报中,直到警报大小达到 64 KB,并且任何剩余的实体都将从警报中删除。

  • 其他警报扩充也会影响警报的大小。

  • 若要减小警报的大小,请在查询中使用 project-away 运算符来删除所有不必要的字段。 (如果只有几个字段需要保留,请考虑使用 project 运算符。)

查询计划和警报阈值

  • 在“查询计划”部分中,设置以下参数:

    Set query schedule and event grouping

    • 设置“查询运行频率”,以控制运行查询的频率 - 可像每 5 分钟一次一样频繁,也可像每 14 天一次一样间隔较长。

    • 设置“数据查找时段”,以确定查询所覆盖数据的时段 - 例如,可以查询过去 10 分钟的数据,也可以查询过去 6 小时的数据。 最大值为 14 天。

    • 对于新的“开始运行”设置(处于语预览状态):

      • 将它保留为“自动”以继续执行原始行为:规则将在创建后立即开始首次运行,之后将按“查询运行频率”设置中所设置的间隔运行。

      • 如果要确定规则首次运行的时间,而不是立即运行规则,则将开关切换到“在特定时间”。 然后使用日历选取器选择日期,并按所示的示例格式输入时间。

        Screenshot of advanced scheduling toggle and settings.

        规则未来运行将按首次运行后指定的间隔进行。

      开始运行”设置下的文本行(其左侧带有信息图标)汇总了当前查询计划和回溯设置。

      注意

      查询间隔和回看时段

      这两个设置在某种程度上相互独立。 你可以采用一个短暂的间隔运行查询,来覆盖长于该间隔的时段(实际上是存在重叠的查询),但是不能采用超出该覆盖时段的间隔运行查询,否则整个查询覆盖面将存在缺口。

      引入延迟

      为了考虑在源中生成事件与将事件引入 Microsoft Sentinel 之间可能出现的延迟,并确保实现完全覆盖且数据不会重复,Microsoft Sentinel 从计划的时间起延迟五分钟运行计划的分析规则 。

      有关详细信息,请参阅处理计划分析规则中的引入延迟

  • 使用“警报阈值”部分定义规则的敏感度级别。 例如,如果希望规则每次运行时只在查询返回超过 1000 个结果时生成警报,则将“生成警报的条件是查询结果数”设置为“大于”,并输入数字 1000。 这是一个必填字段,因此如果你不需要设置阈值,也就是说,如果你希望警报注册每一个事件,则在数字字段中输入 0。

结果模拟

在向导右侧的“结果模拟”区域中,选择“使用当前数据进行测试”,Microsoft Sentinel 将提供一个图表,其中是按照当前定义的计划查询将在最近 50 次运行过程中生成的结果(日志事件) 。 如果要修改查询,请再次选择“使用当前数据进行测试”,以更新此图表。 此图表展示了定义的时段内的结果数,该时段由“查询计划”部分中的设置确定。

上面的屏幕截图中的查询的结果模拟如下所示。 左侧是默认视图,右侧是将鼠标指针悬停在图表上的某个时间点上时所显示的内容。

Results simulation screenshots

如果你发现查询将触发的警报过多或过于频繁,可以利用“查询计划”和“警报阈值”部分中的设置进行试验,然后再次选择“使用当前数据进行测试”。

事件分组和规则抑制

  • 在“事件分组”下,选择以下两种方式之一来处理将事件分组到警报的操作:

    • 将所有事件分组到一个警报(默认设置)。 只要查询返回的结果数超过上面指定的警报阈值,此规则每次运行时就生成一个警报。 警报汇总了结果中返回的所有事件。

    • 为每个事件触发警报。 此规则将针对查询返回的每一个事件生成一个独一无二的警报。 如果你希望单独显示各个事件,或者希望按特定参数(按用户、主机名或其他内容)将事件分组,此规则会很有用。 你可以在查询中定义这些参数。

      目前,规则可以生成的警报数上限为 150。 在特定规则中,如果“事件分组”设置为“为每个事件触发警报”,并且该规则的查询返回 150 个以上的事件,则前 149 个事件都会生成独一无二的警报,第 150 个警报将汇总返回的所有事件。 换句话说,第 150 个警报是将会按照“将所有事件分组到一个警报”选项生成的警报。

      如果选择此选项,Microsoft Sentinel 会将新字段“OriginalQuery”添加到查询结果中。 以下比较了现有查询字段和新字段:

      字段名称 包含 在此字段中运行查询
      结果...
      查询 生成此警报实例的事件的压缩记录 生成此警报实例的事件;
      限制为 10240 个字节
      OriginalQuery 在分析规则中编写的原始查询 运行查询的时间范围内的最近事件,这些事件符合查询定义的参数

      换句话说,OriginalQuery 字段的行为类似于查询字段的行为。 此额外字段的结果是,下面的故障排除部分中第一项描述的问题已经得到了解决。

    注意

    事件和警报之间有何区别?

    • 事件用于描述单次出现的操作。 例如,日志文件中的一个项可以计为一个事件。 在这个背景下,事件指的是分析规则中的查询返回的单个结果。

    • 警报是一组事件,从安全性角度而言,这些事件组合在一起后有重要意义。 如果事件具有重大安全影响,则警报可能包含单个事件 - 例如,在工作时间以外从外国/地区进行的管理登录。

    • 那么,什么是故障事件呢? Microsoft Sentinel 的内部逻辑会通过警报或一组警报生成故障事件 。 SOC 分析人员围绕故障事件队列展开工作(会审、调查和修正)。

    Microsoft Sentinel 从某些数据源引入原始事件,并从其他数据源引入已处理的警报。 请务必随时注意自己所处理的内容。

  • 如果需要让规则在生成警报后于一个时段内(长于查询间隔)暂停运行,则可以在“抑制”部分中将“生成警报后停止运行查询”设置为“启用” 。 如果启用此设置,则必须将“停止运行查询的时长”设置为查询应停止运行的时长,最多为 24 小时。

配置故障事件生成设置

在“故障事件设置”选项卡中,可以选择是否将警报转化为可操作的故障事件,以及如何使用 Microsoft Sentinel 来执行此操作。 如果保留此选项卡不变,Microsoft Sentinel 将通过每个警报创建一个单独的事件。 你可以选择更改此选项卡中的设置,这样就不会创建任何故障事件,也不会将几个警报分组到一个故障事件中。

例如:

Define the incident creation and alert grouping settings

事件设置

在“故障事件设置”部分中,默认情况下,将“通过此分析规则触发的警报创建故障事件”设置为“已启用”,这意味着 Microsoft Sentinel 将通过该规则触发的每一个警报单独创建一个故障事件 。

  • 如果你不需要让此规则生成任何故障事件(例如,在此规则只用于收集信息以供以后进行分析的情况下),则将此设置设为“已禁用”。

  • 如果想要通过一组警报创建单个故障事件,而不是为每一个警报生成一个故障事件,请参阅下一节内容。

警报分组

如果需要通过一组(最多 150 个)相似警报或重复警报(请参阅注释)生成一个故障事件,则在“警报分组”部分中则将“将此分析规则触发的相关警报分组到故障事件”设置为“已启用”,并设置以下参数。

  • 将组范围限制为所选时段内创建的警报:确定将哪个时段内的相似警报或重复警报组合在一起。 此时段内对应的所有警报将共同生成一个或一组故障事件(具体取决于下面的分组设置)。 此时段之外的警报将单独生成一个或一组故障事件。

  • 将此分析规则触发的警报分组到一个故障事件的依据:选择组合警报的依据:

    选项 说明
    如果所有实体都匹配,则将警报分组为单个事件 如果警报映射的每个实体(定义参见上面的设置规则逻辑选项卡)值都相同,则将警报组合在一起。 建议使用此设置。
    将此规则触发的所有警报分组到单个事件中 将此规则生成的所有警报都组合在一起,即使这些警报没有相同的值也是如此。
    如果所选实体和详细信息匹配,则将警报分组到单个事件中 如果警报的值与各自下拉列表中选择的所有映射实体、警报详细信息和自定义详细信息完全相同,则将警报组合在一起。

    例如,如果你想要基于源或目标 IP 地址创建单独的事件,或者想要对匹配特定实体和严重性的警报进行分组,则可能需要使用此设置。

    注意:如果选择此选项,则必须至少为该规则选择一个实体类型或字段。 否则,规则验证将失败,并且不会创建规则。
  • 重新打开已关闭的匹配故障事件:如果某个故障事件已解决并已关闭,而稍后系统生成了应属于该故障事件的另一个警报,在这种情况下,如果要重新打开这个已关闭的故障事件,则将此设置设为“已启用”,如果要该警报创建一个新的故障事件,则将此设置保留为“已禁用”。

    注意

    最多可将 150 个警报分组到一个故障事件。

    • 只有在生成所有警报后才会创建事件。 所有警报将在事件创建后立即添加到事件中。

    • 如果将警报分组到一个故障事件的规则生成了 150 个以上的警报,该规则将使用与初始故障事件详细信息同样的内容生成一个新故障事件,并将超出数目的警报分组到这个新的故障事件。

设置自动响应并创建规则

在“自动化响应”选项卡中,可以使用自动化规则将自动化响应设为在以下三种情形之一出现时触发:

  • 当此分析规则生成警报时。
  • 当创建了包含由此分析规则生成的警报的事件时。
  • 当更新了包含由此分析规则生成的警报的事件时。

自动化规则”下显示的网格将显示已应用于此分析规则的自动化规则(因为它满足这些规则中定义的条件)。 可以通过选择每行末尾的省略号来编辑其中的任一规则。 或者,可以创建新的自动化规则

使用自动化规则执行基本会审、分配、工作流和事件关闭。

通过从这些自动化规则调用 playbook 来自动执行更复杂的任务并调用来自远程系统的响应以修正威胁。 可以针对事件和单个警报执行此操作。

  • 有关创建 playbook 和自动化规则的详细信息和说明,请参阅自动执行威胁响应

  • 有关事件创建的触发器事件更新的触发器警报创建的触发器的适用场景的详细信息,请参阅在 Microsoft Sentinel playbook 中使用触发器和操作

    Define the automated response settings

  • 在屏幕底部的“警报自动化(经典)”下,你将看到已配置为在使用旧方法生成警报时自动运行的任何 playbook。

    • 自 2023 年 6 月起,你无法再向此列表添加 playbook。 此处已列出的 playbook 将继续运行,直到此方法在 2026 年 3 月被弃用。

    • 如果你仍有此处列出的任何 playbook,则应改为基于“警报创建的触发器”创建自动化规则,并从那里调用 playbook。 完成此操作后,选择此处列出的 playbook 行尾的省略号,然后选择“删除”。 有关完整说明,请参阅将 Microsoft Sentinel 警报触发器 playbook 迁移到自动化规则

选择“查看和创建”,以查看新分析规则的所有设置。 在出现“已通过验证”消息时,选择“创建”。

Review all settings and create the rule

查看规则及其输出

  • 可在主“分析”屏幕上的“可用规则”选项卡下的表格中找到新创建的自定义规则(类型为“已计划”)。 你可以从此列表启用、禁用或删除每个规则。

  • 要查看所创建的分析规则的结果,请转到“事件”页面,可以在此处会审、调查事件,并修正威胁

  • 你可以更新规则查询以排除误报。 有关详细信息,请参阅在 Microsoft Sentinel 中处理误报

注意

可通过 Microsoft Graph 安全性访问 Microsoft Sentinel 中生成的警报。 有关详细信息,请参阅 Microsoft Graph 安全性警报文档

将规则导出到 ARM 模板

如果要将你的规则打包作为代码进行管理和部署,你可以轻松地将规则导出到 Azure 资源管理器 (ARM) 模板。 你还可以从模板文件导入规则,以便在用户界面中进行查看和编辑。

故障排除

问题:查询结果中未显示事件

当“事件分组”设置为“为每个事件触发警报”时,稍后查看的查询结果可能缺失或与预期不同。 例如,可以稍后在转回相关事件的结果时查看查询的结果。

  • 结果随警报一起自动保存。 但是,如果结果太大,则不保存任何结果,然后再次查看查询结果时将不会显示任何数据。
  • 如果存在引入延迟,或者由于聚合导致查询不确定,则警报的结果可能与手动运行查询显示的结果不同。

注意

此问题已得到解决,解决方式是在选中此事件分组选项时将新字段 OriginalQuery 添加到结果中。 请参阅上述说明

问题:计划的规则执行失败,或显示时其名称中添加了“自动禁用”

计划的查询规则运行失败,这种情况很少见,但也有可能发生。 根据故障的特定类型和导致故障的情况,Microsoft Sentinel 预先将故障分类为“暂时性”或“永久性”。

暂时性故障

暂时性故障败是由于某种情况而发生的,这种情况是暂时性的,很快就会恢复正常,到时候规则执行就会成功。 Microsoft Sentinel 分类为暂时性故障的一些示例:

  • 规则查询运行时间过长并超时。
  • 数据源和 Log Analytics 之间或 Log Analytics 与 Microsoft Sentinel 之间的连接出现问题。
  • 任何其他新故障和未知故障都被视为暂时性故障。

出现暂时性故障时,Microsoft Sentinel 会在预定的、不断增加的时间间隔后,继续尝试重新执行规则,一直持续到某个时间点。 在此之后,规则将只会在下一个计划的时间重新运行。 在任何情况下,规则都不会由于暂时性故障而自动禁用。

永久性故障 - 规则自动禁用

永久性故障是由允许规则运行的条件发生变化(如果没有人工干预,这些条件无法恢复到以前的状态)导致的。 分类为永久性故障的示例:

  • 目标工作区(规则查询操作的工作区)已被删除。
  • 目标表(规则查询操作的表)已被删除。
  • Microsoft Sentinel 已从目标工作区中被删除。
  • 规则查询使用的某个函数不再有效;已被修改或删除。
  • 对规则查询数据源之一的权限以发生更改(查看以下示例)。
  • 规则查询的数据源之一已被删除。

如果同一个规则连续出现预定数量、同种类型的永久性故障,Microsoft Sentinel 将停止尝试执行该规则,还会执行以下步骤:

  • 禁用规则。
  • 将“自动禁用”字样添加到规则名称的开头。
  • 将故障(和禁用)原因添加到规则的说明中。

通过按名称对规则列表进行排序,可以轻松确定是否存在自动禁用的规则。 自动禁用的规则将位于列表顶部或顶部附近。

SOC 管理员务必要定期检查规则列表,确定是否存在自动禁用的规则。

由于资源耗尽而出现永久性故障

另一种永久性故障是由于查询构建不正确而发生的,该查询会导致规则消耗过多的计算资源,并有耗尽系统性能的风险。 当 Microsoft Sentinel 识别出此类规则时,它会针对其他永久性故障执行上述三个相同步骤:禁用规则,在规则名称前面附加“AUTO DISABLED”,以及将故障原因添加到说明中。

若要重新启用该规则,必须解决导致其使用过多资源的查询中的问题。 有关优化 Kusto 查询的最佳做法,请参阅以下文章:

另请参阅用于在 Microsoft Sentinel 中使用 Kusto 查询语言的有用资源,以获取进一步的帮助。

由于失去跨订阅/租户的访问权限而永久失败

由于数据源上的权限更改(请参阅上面的列表)而可能发生永久失败的一个特定示例涉及 MSSP 的情况,或者分析规则跨订阅或租户进行查询的任何其他方案。

在创建分析规则时,访问权限令牌将应用于该规则并与其一起保存。 此令牌可确保规则可以访问包含规则所查询的数据的工作区,并且即使规则创建者失去对该工作区的访问权限,也会保持此访问权限。

但是,有一个例外:在创建规则以访问其他订阅或租户中的工作区(例如对于 MSSP 所发生的情况)时,Microsoft Sentinel 会采取额外的安全措施来防止未经授权访问客户数据。 对于这些种类的规则,创建规则的用户的凭据将会应用于规则而不是独立的访问令牌,以便当用户不再有权访问其他租户时,规则将停止工作。

如果在跨订阅或跨租户方案中操作 Microsoft Sentinel,请注意,如果其中一名分析师或工程师失去对特定工作区的访问权限,则该用户创建的任何规则将会停止工作。 你将收到有关“资源访问权限不足”的运行状况监视消息,并将根据上述程序自动禁用该规则。

后续步骤

使用分析规则检测来自 Microsoft Sentinel 的威胁时,请务必启用与连接的数据源关联的所有规则,以确保环境的全方位安全性。

若要自动启用规则,可以通过 APIPowerShell 将规则推送到 Microsoft Sentinel,但这样做需要付出额外的工作。 使用 API 或 PowerShell 时,必须先将规则导出到 JSON,然后才能启用规则。 在 Microsoft Sentinel 的多个实例(每个实例的设置都相同)中启用规则时,API 或 PowerShell 可能会有所帮助。

有关详细信息,请参阅:

此外,学习此示例:通过自定义连接器监视 Zoom 时使用自定义分析规则。