构建复合检测规则
本文档提供了一份技术指南,介绍了如何在 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.hostnameUDM 字段。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)与跃点窗口重叠,则复合规则跃点窗口会触发匹配。
例如:
- 复合规则具有 60 分钟的跃点窗口:跃点 1(18:58 - 19:58)和跃点 2(19:58 - 20:58)。
- 上游生产者检测的窗口为 19:57:54 - 20:56:54(时长 59 分钟)。
- 由于生产者窗口的开始时间为 19:57:54(比跃点 1 结束时间早 6 秒),结束时间为 20:56:54(在跃点 2 期间),因此它与两个跃点窗口都重叠。
- 这会触发两个复合检测(一个用于跃点 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 专业人士的解答。