匹配部分语法

支持的平台:

match 部分提供了必要的参数,用于将多个相关事件关联到单个检测中。只有在规则关联两个或更多不同事件时,才需要指定此参数。您可以使用它来指定以下内容,从而定义此相关性的条件:

  • 分组字段(键):事件(在 events 部分中定义)中的特定字段,这些字段必须具有相同的值,才能将事件在逻辑上关联起来。

  • 时间限制:相关事件必须在连续的时间窗口内发生,才能构成一次完整的匹配。此设置仅适用于规则,搜索和信息中心不需要此设置。

定义匹配部分

规则要求匹配变量是 event 部分中定义的占位符。您还可以在“搜索”和“信息中心”中指定 event 字段。

使用 events 部分中定义的占位符变量来指定事件需要在哪个时间窗口内发生。对于特定检测组,系统会忽略在指定时间窗口之外发生的任何匹配事件。

使用 over 关键字和语法 <number><m/h/d>(其中 m/h/d 表示分钟、小时和天)指定时间窗口。您可以指定最短 1 分钟,最长 48 小时。

此示例规则可检测到 10 分钟内发生的登录失败事件。在短时间内多次登录失败通常表示有人试图进行暴力破解或未经授权的访问。

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  condition:
    #e >= 5
}

match 部分查找在 10 分钟间隔内于新位置登录失败的用户:

match:
   $user over 10m

匹配部分中的零值

Google SecOps 会隐式过滤掉 match 部分中使用的所有占位符的零值("" 表示字符串,0 表示数字,false 表示布尔值,枚举类型表示位置 0 中的值)。

示例:过滤掉零值

以下示例展示了过滤掉零值的查询。

rule ZeroValuePlaceholderExample {
  meta:
  events:
    // Because $host is used in the match section, the query behaves
    // as if the following predicate was added to the events section:
    // $host != ""
    $host = $e.principal.hostname

    // Because $otherPlaceholder was not used in the match,
    // there is no implicit filtering of zero values for $otherPlaceholder.
    $otherPlaceholder = $e.principal.ip

  match:
    $host over 5m

  condition:
    $e
}

不过,如果为函数分配了占位变量,查询不会隐式过滤掉 match 部分中使用的占位变量的零值。

如需停用对零值的隐式过滤,您可以在“选项”部分中使用 allow_zero_values 选项。allow_zero_values 选项仅在“规则”中提供。

示例:允许零值

以下示例展示了不会隐式过滤掉 match 部分中所用占位符的零值的查询:

rule ZeroValueFunctionPlaceholder {
  meta:
  events:
    // Even though $ph is used in the match section, there is no
    // implicit filtering of zero values for $ph, because $ph is assigned to a function.
    $ph = re.capture($e.principal.hostname, "some-regex")

  match:
    $ph over 5m

  condition:
    $e
}

支持的时间窗口

您可以使用以下支持的时间窗口,按指定的时间粒度match 部分中的事件字段和占位变量进行分组。

  • 跳跃窗口(重叠窗口)
  • 翻滚窗口(不重叠的窗口)
  • 滑动窗口(由透视生成的窗口)

跳跃窗口

跃点窗口是一种多事件查询类型,用于将指定时间范围内符合查询条件的事件分组,而无论这些事件的发生顺序如何。默认情况下,包含 match 部分的 YARA-L 查询使用跳跃窗口来关联一段时间内的多个事件。查询的执行时间范围分为一组重叠的跃点窗口,每个窗口的持续时间都在 match 部分指定。然后,在每个跃点窗口中关联事件。

例如,对于在时间范围 [1:00, 2:00] 内运行的查询,如果 match 部分超过 30m,则可能生成的一组重叠的跳跃窗口为 [1:00, 1:30]、[1:03, 1:33] 和 [1:06, 1:36]。 这些窗口用于关联多个事件。

翻滚窗口

翻滚窗口将数据流分段为固定大小、不重叠且连续的时间间隔。每个数据事件仅分配给一个窗口。这与滑动窗口或跳跃窗口不同,后者可以具有重叠的时间间隔。

例如,如果滚动窗口时长为 30 分钟,则在 1:00:00 到 1:29:59 之间发生的事件会一起处理。然后,系统会单独处理下一组事件(从 1:30:00 到 1:59:59)。

滑动窗口

如果您需要搜索以特定相对顺序发生的事件(例如,e1e2 之后最多两分钟内发生),滑动窗口非常有效。当时间限制以指定的数据透视事件变量开始或结束时,会生成滑动窗口。此变量可动态跟踪事件序列以及相对于特定枢轴事件变量的时间。

然后,在每个滑动窗口内,事件是相关的。这样,您就可以搜索按特定顺序发生的事件(例如,e1 会在 e2 的 2 分钟内发生)。如果事件 e1 发生在事件 e2 后的滑动窗口内,则事件 e1 与事件 e2 的发生是相关的。

  • 滑动窗口基于数据透视事件变量 (pivot-event-var)。
  • 使用 before 关键字可生成以每次发生透视事件结尾的滑动窗口。
  • 使用 after 关键字可生成从每次发生透视事件开始的滑动窗口。

在查询的 match 部分中指定滑动窗口,如下所示:

<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>

以下示例展示了有效的滑动窗口:

$var1, $var2 over 5m after $e1

$user over 1h before $e2

注意:

  • 其他滑动窗口示例
  • 已知使用滑动窗口代替跃点窗口会导致性能下降。我们建议仅在特定情况下使用滑动窗口,例如绝对有必要使用事件顺序或搜索不存在的事件时。

  • 由于滑动窗口旨在检测多个事件,因此我们建议您不要将滑动窗口用于单事件查询。请改为使用以下任一解决方法:

    • 将查询转换为使用多个事件变量,并更新条件部分(如果查询需要多次出现相应事件)。
    • 您可以考虑添加时间戳过滤条件,而不是使用滑动窗口。例如:$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds
    • 移除滑动窗口。

后续步骤

其他信息

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