构建复合检测规则

支持平台:

本文档提供了一份技术指南,介绍了如何在 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.outcomes["dest_domain"],用于访问 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.urlprincipal.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 部分。这些变量可以包括规则标签、结果变量、匹配变量、检测字段或集合元素。

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

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

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

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

例如:

  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.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

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

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

$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 专业人士的解答。