在搜索和信息中心内应用联接
联接有助于关联来自多个来源的数据,从而为调查提供更多背景信息。通过关联相关事件、实体和其他数据,您可以调查复杂的攻击场景并直观呈现趋势。
本文档介绍了如何在 Google SecOps Search 字段和信息中心面板中使用 join 操作。本文介绍了支持的联接类型、使用情形和最佳实践。
联接的核心概念
您可以使用共享的占位变量或显式等式语句(例如 $e1.hostname = $e2.hostname)连接数据源来创建联接。在基于统计信息的查询的 match 部分中定义联接时,您必须使用占位变量。
以下示例演示了如何使用两个包含等号 (=) 和共享占位变量的字段来关联数据源。
示例 1:使用占位变量的隐式联接
events: // Assign a value from the first event to the placeholder variable $user $user = $e1.principal.user.userid // The second assignment creates an implicit join, linking $e2 to $e1 // where the user ID is the same. $user = $e2.principal.user.userid match: $user over 1h condition: $e1 and $e2示例 2:使用等值和占位符的显式联接
$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e1.principal.hostname = $host $e2.target.ip = $ip $e2.principal.hostname = "altostrat" $e2.target.hostname = $host match: $ip, $host over 5m
加入搜索
本部分中的示例演示了 Search 中使用的语法。
搜索中的查询默认不区分大小写。
活动-活动联接
事件-事件联接用于连接两个不同的通用数据模型 (UDM) 事件。以下示例查询将
USER_LOGIN事件与其他事件相关联,以根据共同的 IP 地址查找用户互动过的主机名 (altostrat):$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e2.target.ip = $ip $e2.principal.hostname = "altostrat" match: $ip over 5m
事件-ECG 联接
事件-ECG 联接会将 UDM 事件与实体情境图 (ECG) 中的实体相关联。以下示例查询会在实体图中查找在 1 小时的时间范围内共享相同主机名的
NETWORK_CONNECTION事件和ASSET:events: $e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $x = $g1.graph.entity.asset.hostname match: $x over 1h condition: $e1 and $g1
数据表-事件联接
数据表-事件联接会将 UDM 事件与自定义数据表中的条目相关联。 这对于根据用户定义的列表(例如已知的恶意 IP 地址或威胁行为者)检查实时事件数据非常有用。以下示例查询将
NETWORK_CONNECTION事件与数据表联接,以查找涉及该列表中特定 IP 地址的连接:$ip = %DATATABLE_NAME.COLUMN_NAME $ip = $e1.principal.ip $e1.metadata.event_type = "NETWORK_CONNECTION" match: $ip over 1h
将 IN 子句与数据表搭配使用
您还可以使用 in 子句来检查某个字段值是否存在于数据表列中。所有数据源(例如 ioc.type in %abc.type)均支持此语法,并且此语法提供了一种便捷的方式来根据参考列表过滤事件,而无需为联接定义显式占位变量。
常见使用场景
本部分列出了一些常见的联接使用方式。
检测凭据盗窃和使用情况
目标:查找用户成功登录后快速删除关键系统文件的实例。这可能表明存在账号入侵或恶意内部人员活动。
联接类型:事件-事件联接
说明:此查询会关联两个单独来看并不可疑的截然不同的事件,但当这两个事件同时发生时,就会变得非常可疑。它首先查找 USER_LOGIN 事件,然后查找 FILE_DELETION 事件。这些事件通过短时间窗口内的常见 user.userid 进行联接。
凭据盗窃检测查询
// Event 1: A user successfully logs in $e1.metadata.event_type = "USER_LOGIN" $e1.security_result.action = "ALLOW" $e1.principal.user.userid = $user // Event 2: The same user deletes a critical file $e2.metadata.event_type = "FILE_DELETION" $e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/ $e2.principal.user.userid = $user match: $user over 10m condition: $e1 and $e2
识别关键资产的风险连接
目标:利用资产信息丰富实时网络数据,以查找不应与外部低频网域(例如生产数据库服务器)通信的服务器的出站连接。
联接类型:事件-ECG 联接
说明:与罕见网域的单次网络连接可能不是高优先级。不过,此查询通过将该事件与实体上下文图 (ECG) 联接,提高了该事件的重要性。它专门查找实体图中标记为“关键数据库服务器”的资产所产生的 NETWORK_CONNECTION 事件。
有风险的连接查询
events: $e.metadata.event_type = "NETWORK_CONNECTION" $e.target.domain.prevalence.day_count <= 5 $asset.graph.metadata.entity_type = "ASSET" $asset.graph.entity.asset.labels.value = "Critical Database Server" $e.principal.asset.hostname = $asset.graph.entity.asset.hostname $host = $e.principal.asset.hostname match: $host over 1h condition: $e and $asset
搜寻威胁行为者 IOC
目标:通过将所有实时 DNS 查询与已知被特定威胁者使用的网域列表进行比较,主动搜索失陷指标 (IoC)。
联接类型:数据表-事件联接
说明:您的威胁情报团队维护了一个名为 ThreatActor_Domains 的数据表,其中列出了恶意网域。此查询会将所有实时 NETWORK_DNS_QUERY 事件与此数据表联接。它会立即显示网络中的主机尝试解析威胁情报列表中的网域的所有实例。
威胁行为者 IOC 狩猎查询
// Datatable: Get the list of malicious domains $domain = %DATATABLE_NAME.COLUMN_NAME // Event: A DNS query is made $e.metadata.event_type = "NETWORK_DNS" $e.network.dns.questions.name = $domain match: $domain over 5m condition: $e
信息中心内的联接
与搜索相比,信息中心支持更广泛的数据源和更长的相关性窗口。与标准 SQL 查询不同,YARA-L 2.0 不使用显式 JOIN 语句;相反,它通过关联共享占位变量或使用多阶段查询来连接数据源。
区分大小写
信息中心查询区分大小写。如需在信息中心内执行不区分大小写的联接或搜索,请使用 nocase 修饰符。
支持的数据源
在信息中心内,您可以联接数据源中支持的联接组合中的数据。(并非所有数据源组合都可以在单个查询中联接在一起。)
多来源信息中心查询中的每个数据引用都必须包含其 YARA-L 前缀限定符(例如 $u1),而不仅仅是联接的字段。这样,系统便可以正确识别重叠数据源之间的字段所有权。
支持的联接组合
通过联接,您可以在内置信息中心内关联 UDM 事件、实体情境和数据表。为保持系统性能,请在构建查询之前查看本部分中支持的组合和技术限制。
- UDM 事件到 UDM 事件(多事件)
- UDM 事件到实体情境
- 从 UDM 事件到数据表
病例到病例历史记录:此组合严格限制为只能包含一个
case来源和一个case_history来源。您无法在此联接中包含任何其他数据源。
如需了解限制和安全措施,请参阅技术限制和约束。
示例:联接 case 和 case_history
您可以通过联接唯一的支持请求 ID,将支持请求元数据与其历史活动相关联。
以下示例联接了
case和case_history数据源,以统计每个高优先级支持请求的历史操作总数。// 1. Establish the Join using a shared placeholder variable ($case_id) $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Apply Filters $c.case.priority = "PRIORITY_HIGH" // 3. Group the correlated data by the Case ID match: $case_id // 4. Calculate the selected metrics to display on the dashboard outcome: $case_name = array_distinct($c.case.display_name) $total_historical_actions = count($h.case_history.case_activity)
高级用例:计算 MTTR
对于平均解决时间 (MTTR) 或平均结案时间 (MTTC) 等更复杂的指标,您可以使用多阶段查询。这样一来,您就可以计算第一阶段中每个个别情况的持续时间,然后在最终结果块中全局平均这些持续时间。
以下查询可计算“默认环境”中所有支持请求的平均关闭时间(以分钟为单位)。
stage stage1 { // 1. Establish the Join $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Filter by specific environment $c.case.environment = "Default Environment" // 3. Group by Case ID to process per case match: $case_id // 4. Calculate the Time to Close (TTC) for each case individually outcome: $case_close_time = max(if($h.case_history.case_activity = "CLOSE_CASE", $h.case_history.event_time.seconds, 0)) $status = array_distinct($h.case_history.case_activity) // Subtract the very first event time (creation) from the close time $TTC = $case_close_time - min($h.case_history.event_time.seconds) // 5. Filter to ensure the case has a complete lifecycle condition: arrays.contains($status, "CREATE_CASE") and arrays.contains($status, "CLOSE_CASE") } // 6. Global Aggregation: Calculate the Mean (Average) across all processed cases outcome: $case_count = count($stage1.case_id) $MTTC = (math.round(avg($stage1.TTC) / 60))
最佳做法
为了优化联接查询的性能并确保它们能够高效处理数据,请遵循以下有关过滤事件和管理搜索范围的最佳实践。
使用特定过滤条件来减少事件数量
联接查询会合并许多结果,因此会消耗大量资源。
宽泛的常规过滤条件可能会导致查询失败,有时会在长时间延迟后失败,例如:
target.ip != ""metadata.event_type = "NETWORK_CONNECTION"(如果此事件类型在您的环境中非常常见)
我们建议您将一般过滤条件与更具体的过滤条件相结合,以减少查询需要处理的事件总数。
target.ip != ""等宽泛的过滤条件应与更具体的过滤条件搭配使用,以提高查询性能,例如:$e1.metadata.log_type = $log $e1.metadata.event_type = "USER_LOGIN" $e1.target.ip != "" $e2.metadata.log_type = $log $e2.principal.ip = "10.0.0.76" $e2.target.hostname != "altostrat" match: $log over 5m
如果查询速度仍然很慢,您还可以缩短查询的总体时间范围(例如,从 30 天缩短到 1 周)。
如需了解详情,请参阅 YARA-L 最佳实践。
技术限制和约束
在搜索和信息中心内使用联接时,存在以下限制和限额。
匹配窗口和查询限制
匹配窗口用于定义相关联事件的具体时间范围。这不同于您在界面中选择的搜索时间范围。
搜索限制
搜索功能经过优化,可在较短的时间范围内进行实时或快速调查。
| 查询限制 | 用法 |
|---|---|
| 最长 48 小时(某些查询可能支持更长的时间范围)。 | 在快速调查中关联事件。 |
信息中心的限制
信息中心支持更长期的历史分析。
| 联接类型 | 查询限制 | 用法 |
|---|---|---|
| UDM 到 UDM 和 UDM 到实体 | 31 天 | 大量遥测查询。 |
| Case-to-CaseHistory | 90 天 | 生命周期跟踪查询。 |
| 其他支持的配置 | 最长 365 天 | 非 UDM 或基于指标的来源(例如提取指标)的后备。 |
数据源和表格限制
您可以在单个查询中联接的数据源和表格数量上限取决于您使用的是搜索还是信息中心。
搜索限制
- 每个查询最多可以使用两个 UDM 事件。
- 每次查询最多只能使用 1 个心电图事件。
- 每个查询最多可以使用 2 个数据表。
- 您无法将数据表直接联接到实体情境表;您必须使用 UDM 事件作为中间桥梁(例如,将
$event.target.hostname同时与$datatable.hostname和$asset.graph.entity.asset.hostname相关联)。
信息中心限制
| 联接类型 | 事件表(UDM 或数据表)的最大数量 | 实体表数量上限 |
|---|---|---|
| 多事件(从 UDM 到 UDM) | 2 | 不适用 |
| UDM 到实体的映射 | 2 | 1 |
| 从 UDM 到数据表 | 2 | 不适用 |
| 多阶段查询 | 2 | 1 |
性能和保护措施
系统会监控复杂的联接查询,以防其消耗过多资源。为保护整体环境性能,系统可能会自动暂停或隔离超出资源安全阈值的查询。
如果查询失败或返回的错误表明查询超出了资源限制,请尝试以下优化措施:
- 缩小查询时间范围。
- 在联接发生之前,添加更具体的过滤条件以减小数据集大小。
- 简化您的聚合。
API 和查询类型限制
- 界面和
EventService.UDMSearchAPI 支持联接,但SearchService.UDMSearchAPI 不支持。