通过 YARA-L 2.0 进行搜索时的统计信息和汇总
本页介绍了如何使用 YARA-L 2.0 对 UDM 事件运行统计查询,并对结果进行分组以供分析。
在处理环境中生成的大量 UDM 事件时,了解 UDM 搜索数据的趋势非常重要。您可以使用统计函数和聚合函数从 UDM 日志中获取可据以采取行动的数据分析。UDM 搜索支持 YARA-L 2.0 中的所有聚合函数。
统计查询的使用场景
您可以将统计查询用于以下用例:
跟踪关键指标:您可以衡量 UDM 事件和关联资产(例如与已知恶意 IP 地址通信的主机)的分布和频率。
检测异常行为:您可以识别可能表明发生了安全突发事件的活动高峰,例如意外的网络流量激增或在非工作时间登录。
分析随时间变化的趋势:您可以评估安全状况变化,以评估控制措施的有效性或确定需要改进的方面,例如监控漏洞数量随时间的变化。
搜索中的 YARA-L 2.0 查询结构
您可以使用与检测引擎规则中使用的 YARA-L 结构类似的语法,对 UDM 搜索查询结果进行分组和排序。如需了解详情,请参阅 YARA-L 2.0 语言语法。
YARA-L 2.0 查询结构如下:
过滤语句:指定过滤事件的条件。
匹配(可选):定义要分组的字段。如需了解详情,请参阅 Match 部分语法。
结果:指定查询的输出。如需了解详情,请参阅结果部分语法。
顺序:确定查询结果的顺序,可以是
asc
(升序)或desc
(降序)。如果未指定排序顺序(asc
或desc
),则默认为asc
。限制(可选):设置查询返回的最大行数。
以下是排序和限制使用情况的示例:
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
数据汇总
UDM 搜索支持以下聚合函数:
数组
array(expression)
说明
array
函数会以列表的形式返回所有值。它会将列表截断为最多 25 个随机元素。
形参数据类型
STRING
返回类型
LIST
代码示例
示例
返回一个包含事件类型的数组。
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
说明
array_distinct
函数以列表的形式返回所有不同的值。它会将列表截断为最多 25 个随机元素。去重以获取去重后的列表是在截断之前进行的。
形参数据类型
STRING
返回类型
LIST
代码示例
示例
返回包含不同事件类型的数组。
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
平均值
avg(numericExpression)
说明
avg
函数返回数值列中值的平均值。在计算过程中,系统会忽略 NULL
值。它通常与 match
搭配使用,以计算数据中特定群组的平均值。
形参数据类型
NUMBER
返回类型
NUMBER
代码示例
示例
查找 target.ip
不为空的所有事件。对于所有与 principal.ip
匹配的事件,将 metadata.event_timestamp.seconds
的平均值存储在一个名为 avg_seconds
的变量中。
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
计数
count(expression)
说明
count
函数用于返回组中的行数。它通常与 match
结合使用,以获取数据中特定组的计数。
形参数据类型
STRING
返回类型
NUMBER
代码示例
示例
返回一段时间内用户成功登录的次数。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count(metadata.id)
count_distinct
count_distinct(expression)
说明
count_distinct
函数返回组中具有不同值的行数。它通常与 match
结合使用,以获取数据中特定组的计数。
形参数据类型
STRING
返回类型
NUMBER
代码示例
示例
返回一段时间内成功登录的不同用户的数量。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count_distinct(metadata.id)
max
max(numericExpression)
说明
max
函数返回数值列中的最大值。它通常与 match
结合使用,以获取数据中每个组的最大值。
形参数据类型
NUMBER
返回类型
NUMBER
代码示例
示例
查找 target.ip
不为空的所有事件。对于所有与 principal.ip
匹配的事件,将 metadata.event_timestamp.seconds
的最大值存储在一个名为 max_seconds
的变量中。
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
分钟
min(numericExpression)
说明
min
函数可返回数值列中的最小值。它通常与 match
搭配使用,以获取数据中每个组的最小值。
形参数据类型
NUMBER
返回类型
NUMBER
代码示例
示例
查找 target.ip
不为空的所有事件。对于所有与 principal.ip
匹配的事件,将 metadata.event_timestamp.seconds
的最小值存储在一个名为 min_seconds
的变量中。
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
总和
sum(numericExpression)
说明
sum
函数返回数值列中值的总和。在计算过程中,它会忽略 NULL
值。它通常与 match
搭配使用,以计算数据中不同组的总和。
形参数据类型
NUMBER
返回类型
NUMBER
代码示例
示例
查找 target.ip
不为空的所有事件。对于所有与 principal.ip
匹配的事件,将 network.sent_bytes
的总和存储在一个名为 sent_bytes
的变量中。
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
stddev
stddev(numericExpression)
说明
stddev
函数返回所有可能值的标准差。
形参数据类型
NUMBER
返回类型
NUMBER
代码示例
示例
查找 target.ip
不为空的所有事件。对于所有与 principal.ip
匹配的事件,将 metadata.event_timestamp.seconds
的标准差存储在一个名为 stddev_seconds
的变量中。
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
最早
earliest(timestamp)
说明
earliest
函数会返回一组记录中最早的时间戳,精确到微秒。
形参数据类型
TIMESTAMP
返回类型
TIMESTAMP
代码示例
示例
对于所有与 hostname
匹配的事件,将最早的 metadata.event_timestamp
存储在 start
变量中。
$hostname = principal.hostname
match:
$hostname
outcome:
$start = earliest(metadata.event_timestamp)
最新
latest(timestamp)
说明
latest
函数会返回一组记录中的最新时间戳,精确到微秒。
形参数据类型
TIMESTAMP
返回类型
TIMESTAMP
代码示例
示例
对于所有与 hostname
匹配的事件,将 metadata.event_timestamp
的最新值存储在 end
变量中。
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0:搜索与 UDM 用法
搜索不支持用于活动窗口搜索的
over
关键字。UDM 搜索查询不包含
condition
和option
部分。
按时间粒度分组
您可以在 match
部分中按指定的时间粒度对事件字段和占位符进行分组,类似于在 SQL 中对列进行分组。
语法如下:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
如需按时间粒度进行分组,您可以使用关键字 by
或 over
every
。允许的时间粒度如下:
MINUTE
或m
HOUR
或h
DAY
或d
WEEK
或w
MONTH
或mo
by
和 over every
关键字在功能上是等效的。您可以选择使用其中一种。
示例
按小时对 IP 地址和主机名进行分组。
$hostname = principal.hostname
match:
$hostname, target.ip by hour
按主机名和事件发生日期对所有事件的计数进行分组。
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
某些数据源(例如实体上下文)在时间范围 (<start_time>
, <end_time>
) 内有效,没有单一的时间戳。
first
关键字是可选的,适用于单个时间戳。这意味着,对于在某个时间范围内有效的数据源,关键字 first
仅考虑开始时间 (<start_time>
)。
例如,假设某个实体的时间范围为 (1m, 5m
),时间粒度为 1m
。如果结果按主机 (h1
,h2
) 分组,则返回的列将是 (h1
, 1m
) 和 (h2
, 1m
),其余时间范围将被忽略。
first
关键字可以同时添加到 by
和 over every
中,从而使两者具有相同的行为。使用 by first
等同于 over every first
。
以下示例展示了一个查询,该查询将 by
运算符与在某个时间范围内有效的实体上下文数据源搭配使用。在此查询中,由于省略了 first
关键字,因此系统会考虑整个时间范围。
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
在搜索中创建并保存可视化图表
本部分概述了 Google SecOps 统一数据模型 (UDM) 搜索中的数据可视化功能。借助此功能,安全运营中心 (SOC) 分析师可以根据搜索结果创建可视化图表并将其保存到信息中心,从而高效地检测、调查和应对威胁。
创建可视化图表并将其保存到信息中心
如需创建并保存可视化图表以添加到信息中心,请执行以下操作:
编写包含
match
和outcome
部分的 YARA-L 查询。选择日期范围,然后点击运行搜索以运行查询。 在统计信息和可视化标签页中查看结果。
在可视化标签页上,执行以下操作: a. 从图表类型列表中选择图表类型。 b. 调整数据设置下的设置以自定义图表。
在添加到信息中心界面上,执行以下操作: a. 输入图表名称、说明和时间范围。 b. 选择将图表添加到现有信息中心,或创建新信息中心。
点击添加到信息中心,将图表添加到信息中心。
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。