构建复合检测规则

支持:

本文档提供了一份技术指南,介绍了如何在 Google Security Operations 平台中构建复合规则,该过程涉及连接多个 YARA-L 2.0 规则以识别复杂的攻击模式。复合检测以多事件规则的形式构建,与标准单事件规则保持相同的基本语法。如需了解详情,请参阅复合检测概览。

了解规则结构

复合检测规则始终是多事件规则,并且遵循与单事件规则相同的结构和语法。

复合规则包含以下基本组成部分:

  • events 部分:定义输入,即规则分析的特定检测或事件。

  • match 部分:指定在定义的时间窗口内应如何连接输入。

  • condition 部分:包含最终逻辑,用于确定联接的事件是否符合触发提醒的条件。

在 events 部分中定义输入

构建复合检测规则的第一步是在 events 部分中定义规则的输入。复合规则的输入来自集合,其中存储了其他查询生成的检测结果。 Google SecOps 提供以下两种方法来访问集合中的数据。

使用变量或元标签引用检测内容

如需在不引用原始 UDM 事件的情况下访问检测中的数据,您可以使用 outcome 变量、match 变量或 meta 标签。我们建议您采用这种方法,因为它可提供更高的灵活性,并且在不同规则类型之间具有更好的兼容性。

例如,如果您要在不同上下文中查找某个字符串(例如网址、文件名或注册表项),则多个规则可以将该字符串存储在通用 outcome 变量中。如需从复合规则访问此字符串,请从 detection 开始,然后使用集合资源中的元素找到相关信息。

示例:假设检测规则生成了以下信息:

  • 结果变量:dest_domain = "cymbal.com"

  • UDM 字段:target.hostname = "cymbal.com"

在复合规则中,您可以使用以下路径访问此数据:

  • detection.detection.variables["dest_domain"].string_val 来访问 dest_domain 结果变量。

  • detection.collection_elements.references.event.target.hostname 访问 target.hostname UDM 字段。

  • detection.time_window.start_time.seconds 可访问检测的开始时间戳。

Collection API 和 SecurityResult API 均可用于访问以下内容:

  • 检测元数据和结果值 (detection.detection)
  • 来自所引用规则的基础 UDM 事件 (collection_elements)

通过规则 ID 或名称引用检测内容

您可以通过规则名称或 ID 引用规则。如果您的检测逻辑依赖于特定规则,并且您希望将分析的数据范围缩小到仅这些规则的结果,我们建议您采用这种方法。按名称或 ID 引用相关规则可减少分析的数据量,从而提高性能并防止超时。例如,您可以直接从已知的先前检测结果中查询 target.url 或 principal.ip 等字段。

  • 按规则 ID 引用规则(推荐):使用 detection.detection.rule_id 字段按 ID 引用规则。您可以在 Google SecOps 中规则的网址中找到规则 ID。用户生成的规则的 ID 格式为 ru_UUID,而精选检测的 ID 格式为 ur_UUID。例如:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • 按规则名称引用规则:使用 detection.detection.rule_name 字段按名称引用规则。您可以指定确切的规则名称,也可以使用正则表达式来匹配。例如:

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

match 部分中的联接输入源

如需在复合规则中关联相关检测结果、事件或实体,请使用 events 部分中定义的变量来定义 match 部分。这些变量可以包括规则标签、结果变量、匹配变量、检测字段或集合元素。

如需了解相关语法,请参阅匹配部分语法。

复合规则:时间间隔和跳跃窗口

复合规则会根据时间间隔(而非单个时间点)来匹配检测结果和事件。如果输入检测时间窗口与该跳跃窗口重叠(例如,活动在该时间段内处于活跃状态),则它们与复合跳跃窗口匹配。

如果检测跨越相邻跳跃窗口之间的边界,则单次检测可能会触发多个提醒(由于流水线延迟,这些历史匹配项会在稍后显示)。具体而言,如果输入检测时间窗口(WindowStart 到 WindowEnd)与跳跃窗口重叠,复合规则跳跃窗口就会触发匹配。

例如:

  1. 复合规则具有 60 分钟的跳跃窗口:跃点 1(18:58 - 19:58)和跃点 2(19:58 - 20:58)。
  2. 上游制作方检测的时间窗口为 19:57:54 - 20:56:54(时长 59 分钟)。
  3. 由于生产者窗口从 19:57:54 开始(比跳跃 1 结束时间早 6 秒),到 20:56:54 结束(在跳跃 2 期间),因此它与两个跳跃窗口都重叠。
  4. 这会触发两次复合检测(一次针对跃点 1,一次针对跃点 2),有助于防止出现假负例:误报。如果提供方规则在重叠时未匹配,则不会考虑部分重叠检测结果,无论是对于跳数 1 还是跳数 2,并且会错过检测结果与其他事件之间的相关性。

如需详细了解如何指定跳跃窗口并查看相关示例,请参阅跳跃窗口。

定义 condition 部分

定义 condition 部分,以评估 match 部分的结果。 如果条件为 true,系统会生成提醒。如需了解相关语法,请参阅条件部分语法。

将高级技巧应用于复合规则

本部分介绍了如何在构建复合规则时应用高级技术。

合并事件和检测结果

复合规则可以组合多个数据源,包括 UDM 事件、实体图数据和检测字段。需遵守以下指南:

  • 为每个来源使用不同的变量:为每个数据源(例如,$e 表示事件,$d 表示检测结果)分配唯一的事件变量,其中数据源包括事件、实体和检测结果。

  • 基于共享上下文联接来源:使用规则条件中的通用值(例如用户 ID、IP 地址或域名)连接数据源。

  • 定义匹配窗口:始终包含 match 子句,且时间窗口不超过 48 小时。

示例:合并事件和检测结果

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

创建顺序复合检测

依序复合检测可识别相关事件的模式,其中检测顺序非常重要,例如检测到暴力破解登录尝试,随后检测到成功登录。这些模式可以组合使用多个基本检测、原始 UDM 事件或同时使用两者。

如需创建顺序复合检测,您必须在规则中强制执行该顺序。如需强制执行预期序列,请使用以下方法之一:

  • 滑动窗口:在 match 条件中使用滑动窗口定义检测序列。

  • 时间戳比较:比较规则逻辑中的检测时间戳,以验证它们是否按所选顺序发生。

示例:依序复合检测

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.variables["user"].string_val
    $hostname = $d1.detection.detection.variables["hostname"].string_val

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.variables["user"].string_val
    $hostname = $d2.detection.detection.variables["hostname"].string_val

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.variables["user"].string_val
    $hostname = $d3.detection.detection.variables["hostname"].string_val

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。