搜索最佳做法

支持的平台:

本文档介绍了 Google 针对在 Google Security Operations 中使用搜索功能而推荐的最佳实践。如果搜索查询未经过精心构建,则可能需要大量计算资源。 性能还取决于 Google SecOps 实例中数据的大小和复杂程度。

在查询中使用特定过滤条件,以最大限度地提高速度和效果

提高搜索性能最有效的方法是使用特定的优化统一数据模型 (UDM) 字段来构建查询。这些字段经过优化,可实现快速检索,确保您的搜索能够快速运行并使用更少的计算资源。

以下部分列出了可作为查询中过滤条件的高性能 UDM 字段。

元数据字段

  • metadata.event_timestamp.seconds
  • metadata.event_type
  • metadata.log_type
  • metadata.product_event_type
  • metadata.product_name
  • metadata.vendor_name

正文字段

  • principal.application
  • principal.asset_id
  • principal.file.md5
  • principal.file.sha1
  • principal.file.sha256
  • principal.hostname
  • principal.ip
  • principal.mac
  • principal.process.file.md5
  • principal.process.file.sha1
  • principal.process.file.sha256
  • principal.process.pid
  • principal.user.email_addresses
  • principal.user.userid

来源字段

  • src.asset_id
  • src.hostname
  • src.ip
  • src.mac
  • src.user.userid

目标字段

  • target.application
  • target.asset_id
  • target.file.md5
  • target.file.sha1
  • target.file.sha256
  • target.hostname
  • target.ip
  • target.mac
  • target.process.file.md5
  • target.process.file.sha1
  • target.process.file.sha256
  • target.user.email_addresses
  • target.user.employee_id
  • target.user.userid
  • target.user.windows_sid

网络字段

  • network.dhcp.chaddr
  • network.dhcp.ciaddr
  • network.dhcp.client_hostname
  • network.dhcp.yiaddr
  • network.dns.answers.class
  • network.dns.answers.name
  • network.dns.answers.type
  • network.dns.questions.class
  • network.dns.questions.name
  • network.dns.questions.type
  • network.email.from
  • network.email.to
  • network.http.method

安全结果字段

  • security_result.action
  • security_result.category
  • security_result.rule_name

如何查询实体和情境数据

如果您使用 metadata.log_type = "<LOG_TYPE>" 搜索实体或上下文日志类型(例如 AZURE_AD_CONTEXTWORKSPACE_USERS),即使在“原始日志搜索”中可以看到原始日志,搜索也不会返回任何结果。这是因为 UDM 搜索仅查询 UDM 事件记录。

如需搜索实体和情境数据,请使用 graph 语法:

  • 如需搜索实体或情境日志类型,请查询 graph 元数据字段。例如:

    graph.metadata.event_metadata.log_type = "<LOG_TYPE>"

  • 如需搜索实体字段,请使用前缀 graph.entity.noun.field。例如:

    graph.entity.user.email_addresses = "foo_email"

如需了解详情,请参阅搜索实体情境数据

构建效果良好的搜索查询以提升效果

编写优化的查询对于最大限度地提高速度并最大限度地减少安全数据的资源消耗至关重要。所有查询条件都必须严格遵循以下基本结构:

udm-field operator value

例如:principal.hostname = "win-server"

由于 Google SecOps 在搜索期间可以注入大量数据,因此尽量缩短时间范围并缩小查询范围有助于提高搜索性能。

在搜索查询中使用正则表达式

在构建 UDM 搜索查询时,您可以使用标准逻辑运算符和比较运算符来构建复杂的表达式:

  • 逻辑运算符:使用 ANDORNOT 组合条件。如果您省略了两个条件之间的运算符,系统会假定为 AND
  • 运算符优先级:使用英文括号 () 可替换默认的优先级顺序。您可以在括号内使用的逻辑运算符(ORANDNOT)数量上限为 169 个。
  • 比较运算符:根据 UDM 字段类型(字符串、整数、时间戳),字段运算符可以包括:=!=>=><<=

Google SecOps 使用 RE2 正则表达式引擎。

或者,为了高效搜索大量值,您可以使用参考列表

使用 nocase 作为搜索修饰符

您可以将 nocase 修饰符附加到字符串比较条件,使搜索不区分大小写,即忽略大小写。

例如,以下搜索会忽略大小写,并匹配包含 tim.smith 的所有组合,无论大小写如何:

target.user.userid = "TIM.SMITH" nocase

避免在枚举字段中使用正则表达式

搜索枚举字段(具有一系列预定义值的字段)时,您无法使用正则表达式,例如 metadata.event_typenetwork.ip_protocol

以下示例是一项无效的搜索: metadata.event_type = /NETWORK_*/

而以下示例是有效的搜索: (metadata.event_type = "NETWORK_CONNECTION"metadata.event_type = "NETWORK_DHCP")

在“事件”字段中使用 any 和 all 运算符

Search 中,某些 UDM 字段(例如 principal.iptarget.file.md5)被标记为重复,因为它们可以在单个事件中包含值列表或消息类型。默认情况下,重复字段始终使用 any 运算符处理(没有用于指定 all 的选项)。

使用 any 运算符时,如果重复字段中的任何值满足条件,则谓词的评估结果为 true。例如,如果您搜索 principal.ip != "1.2.3.4",而搜索结果中的活动同时包含 principal.ip = "1.2.3.4"principal.ip = "5.6.7.8",系统就会生成匹配项。这样一来,搜索范围会扩大,包含与任何运算符匹配的结果,而不是仅包含与所有运算符都匹配的结果。

重复字段中的每个元素都是单独处理的。如果在搜索中的事件中找到重复字段,系统会针对该字段中的每个元素评估事件。这可能会导致意外行为,尤其是在使用 != 运算符进行搜索时。

使用 any 运算符时,如果重复字段中的任何值满足条件,则谓词的评估结果为 true

使用 Unix 纪元时间作为时间戳,或使用 YARA-L 函数进行日期转换

时间戳字段使用 Unix 纪元时间(自 1970 年 1 月 1 日星期四 00:00:00 UTC 以来经过的总秒数)进行匹配,您也可以使用 YARA-L 函数进行日期转换。

搜索特定时间戳时,以下(以纪元时间表示)是有效的时间戳:

metadata.ingested_timestamp.seconds = 1660784400

以下时间戳无效:

metadata.ingested_timestamp = "2022-08-18T01:00:00Z"

搜索特定时间戳时,以下内容(使用 YARA-L 函数进行日期转换)是有效的:

metadata.event_type = "NETWORK_CONNECTION"
timestamp.get_date(metadata.ingested_timestamp.seconds) = "2026-03-15"

以下 YARA-L 示例使用 timestamp 函数检查提取时间范围:

metadata.event_type = "NETWORK_CONNECTION"
$date = timestamp.get_date(metadata.ingested_timestamp.seconds)
$date > "2026-03-15" AND $date < "2026-03-17"

如何查询具有较旧时间戳的新近提取的数据

您无法搜索时间戳较旧的新近提取的事件,除非您指定要查询的事件时间范围。这是因为时间范围是根据已解析事件的时间戳(而非原始日志事件的提取时间戳)确定的。

如需搜索具有较旧事件时间戳的已提取日志的 UDM 事件,您可以使用所有时间选项来搜索和查询超过 metadata.ingested_timestamp 的时间范围。

从过滤条件中排除的字段

以下字段有意从搜索过滤条件中排除:

  • metadata.id
  • metadata.product_log_id
  • *.timestamp

虽然这些字段包含重要的元数据,但其唯一值会增加统计信息中的基数和方差,从而对搜索性能产生负面影响。

问题排查

如果您收到一般性错误消息,例如“错误:搜索遇到错误,无法加载数据”,请按以下步骤操作来解决问题。如果此错误仍然存在,请与客户支持团队联系。

  • 通过其他网络连接到 Google SecOps。例如,使用云虚拟机来帮助识别任何网络问题。
  • 确保您组织的防火墙或代理配置或政策允许 Chronicle API 调用。
  • 验证是否未为 Search API 调用配置数据量限制,因为搜索可能会返回大型数据集。
  • 搜索查询可以异步运行,可能需要更多时间才能返回数据。您可以在搜索历史记录中查看之前运行的搜索,并选择相应搜索以供日后查看结果。

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