在搜索中使用联接

支持的平台:

联接有助于关联来自多个来源的数据,从而为调查提供更多背景信息。通过关联相关事件、实体和其他数据,您可以调查复杂的攻击场景。

本文档介绍了如何在 Google Security Operations 中使用 join 操作。此外,本文还介绍了支持的联接类型、用例和最佳实践。

创建联接

仅支持基于统计信息的联接。您必须在查询的匹配部分中定义这些序列,相关时间窗口最长为 48 小时。 您可以通过直接连接字段(例如 $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 联接

事件-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 != null

  • metadata.event_type = "NETWORK_CONNECTION"(如果此事件类型在您的环境中非常常见)

我们建议您将常规过滤条件与更具体的过滤条件相结合,以减少查询需要处理的事件总数。target.ip != null 等宽泛的过滤条件应与更具体的过滤条件搭配使用,以提高查询性能,例如:

$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 最佳实践

限制

使用联接时,存在以下限制:

  • 每个查询最多可以使用两个 UDM 事件。

  • 每个查询最多只能使用一个 ECG 事件。

  • 每个查询最多可以使用两个数据表。

  • 您无法在单个查询中将数据表、UDM 和 ECG 事件联接在一起。

  • 查询时间范围不得超过 90 天。

  • match 时间范围的上限为 48 小时。

  • 界面和 EventService.UDMSearch API 支持联接,但 SearchService.UDMSearch API 不支持。

常见使用场景

本部分列出了一些使用联接的常见方式。

检测凭据盗用和使用情况

目标:查找用户成功登录后快速删除关键系统文件的实例。这可能表明账号遭到盗用或存在恶意内部人员活动。

联接类型:事件-事件联接

说明:此查询会关联两个单独来看并不可疑的截然不同的事件,但当这两个事件同时发生时,就会变得非常可疑。它会先查找 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 = $ip = %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 专业人士那里获得解答。