在搜索和信息中心中应用联接
联接有助于关联来自多个来源的数据,从而为调查提供更多背景信息。通过关联相关事件、实体和其他数据,您可以调查复杂的攻击场景并直观呈现趋势。
本文档介绍了如何在 Google Security Operations 搜索和信息中心中使用联接操作。此外,本文还介绍了支持的联接类型、应用场景和最佳实践。
创建联接
仅支持基于统计信息的联接。您必须在查询的 match 部分中定义它们。
相关性时间窗口(匹配窗口)取决于您使用的是搜索还是信息中心:
- 搜索:最长 48 小时。
- 信息中心:最长 365 天(适用于大多数数据源)。
您可以通过直接连接字段(例如 $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
支持的联接类型
本部分介绍了您可以使用的不同类型的联接。本部分中的示例演示了搜索中使用的语法。如需了解信息中心内的联接,请参阅信息中心内的联接。
事件-事件联接
事件-事件联接用于连接两个不同的统一数据模型 (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 联接
Event-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
最佳做法
联接查询会合并许多结果,因此会消耗大量资源。宽泛的常规过滤条件可能会导致查询失败,有时会在长时间延迟后失败,例如:
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 天缩短到一周)。
如需了解详情,请参阅 YARA-L 最佳实践。
信息中心内的联接
与搜索相比,信息中心支持更广泛的数据源和更长的相关性窗口。
支持的数据源
在信息中心内,您可以使用以下来源各自的 YARA-L 前缀联接数据:
| 前缀 | 数据源 |
|---|---|
case |
支持请求和提醒 |
case_history |
整个支持服务请求生命周期内的活动趋势 |
detection |
规则检测和分析师反馈的历史记录 |
ingestion |
日志量和提取健康状况指标 |
ioc |
IoC(失陷指标)匹配 |
playbook |
自动化响应和 playbook 执行指标 |
ruleset/rules |
有关有效规则集的元数据 |
graph |
实体图数据 (ECG) |
events |
UDM 事件 |
区分大小写
与默认情况下不区分大小写的搜索不同,信息中心区分大小写。如需在信息中心内执行不区分大小写的联接或搜索,请使用 nocase 修饰符。
示例:联接 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))
限制
使用联接时,存在以下限制:
在搜索中,每个查询最多可以使用两个 UDM 事件。
在搜索中,每个查询最多只能使用一个心电图事件。
每个查询最多可以使用两个数据表。
您无法在单个查询中将数据表、UDM 和 ECG 事件联接在一起。
查询时间范围不得超过 90 天。
搜索的最长
match时间窗口为 48 小时,信息中心的最长match时间窗口为 365 天。界面和
EventService.UDMSearchAPI 支持联接,但SearchService.UDMSearchAPI 不支持。
常见使用场景
本部分列出了一些常见的联接使用方式。
检测凭据盗用和使用情况
目标:查找用户成功登录后快速删除关键系统文件的实例。这可能表明账户接管(攻击)或存在恶意内部人员活动。
联接类型:事件-事件联接
说明:此查询会关联两个单独来看并不可疑的截然不同的事件,但当这两个事件同时发生时,就会变得非常可疑。它会先查找 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 事件与此数据表联接。它会立即显示网络中主机尝试解析威胁情报列表中的网域的所有实例。
查询示例:
// 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
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。