了解搜索语法

支持的平台:

本指南适用于希望在 SIEM 搜索页面的查询编辑器中配置搜索表达式(数据值、转义符、运算符等)的安全分析师。

在 Google Security Operations 查询编辑器中编写 YARA-L 2.0 或 SQL 搜索表达式时,您必须根据目标 UDM 字段的确切数据类型来设置数据值、运算符和字符串转义序列的格式。搜索条件由 UDM 字段名称、比较运算符(=、!=、>、<、<=、>=)和格式化数据值组成。

按数据类型设置数据值格式

本部分介绍了以下内容:

枚举值(枚举)

枚举必须以大写文本字符串的形式编写,并且与有效的 UDM 字典定义完全一致,并用英文双引号 (") 括起来,如以下示例所示:

metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"

布尔值

布尔值字段接受 true 或 false(不区分大小写,无需添加引号),如以下示例所示:

network.dns.response = true target.user.is_admin = false

整数和数值

整数和端口号以不带双引号的字面数字形式写入,如以下示例所示:

target.port = 443 network.sent_bytes > 10485760

浮点值和十进制值

对于 float 或 double 类型的 UDM 字段,请输入不带双引号的小数或整数,如以下示例所示:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

文本字符串

标准文本值必须用英文双引号 (") 括起来,如以下示例所示:

metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"

不区分大小写的匹配 (nocase)

默认情况下,YARA-L 2.0 中的字符串比较区分大小写。如需匹配任意大小写字符组合,请直接在条件末尾添加 nocase 运算符,如以下示例所示:

principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase

字符串转义(\ 和 ")

如果字符串字面量包含反斜杠或英文双引号,您必须使用前导反斜杠 (\\) 对这些字符进行转义,如以下示例所示:

  • 使用 \\ 可匹配字面意义的反斜杠 (\\)。
  • 使用 \" 可匹配字面双引号 (")。

  • 搜索带有转义反斜线的 Windows 文件路径:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • 搜索包含嵌入式双引号的命令行:

    target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
    

正则表达式 (RE2 语法)

如需使用正则表达式进行搜索,请使用正斜杠 (/ /) 而不是英文双引号将正则表达式模式括起来。Google SecOps 使用标准 RE2 正则表达式引擎:

  • 匹配 10.x.x.x 范围内的任何主账号 IP,如下所示:

    principal.ip = /10\..*/
    
  • 搜索执行 PsExec 的情况,可选择使用 .exe 扩展名,不区分大小写,如以下示例所示:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • 匹配遵循编号模式的动态 DNS 主机名,如以下示例所示:

    principal.hostname = /dns-server-[0-9]+/ nocase
    

布尔值逻辑和运算符优先级

使用 AND、OR 和 NOT 运算符组合多个搜索条件。您可以使用圆括号 () 明确对表达式进行分组并控制评估优先级,如以下示例所示:

  • 搜索敏感主机上的特定用户登录事件,如以下示例所示:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • 使用圆括号将 OR 条件与 AND 链隔离开来,如以下示例所示:

    metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
    

在 additional 和 labels 字段中搜索键值对

additional 和 labels 字段可作为灵活的容器,用于存储未映射到标准 UDM 字段的自定义事件数据和第三方供应商属性。每个条目都存储一个键值对:

  • additional 字段:每个事件可包含多个键值对 (additional.fields["key"] = "value")。

  • labels fields:每个事件只能包含一个键值对 (labels["key"] = "value")。

完全键值对匹配(field["key"] = "value")

使用方括号语法可直接查询特定键及其对应的字符串值,如以下示例所示:

additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

additional 字段中的高级正则表达式和非字符串值匹配

如果您需要查询 additional 字段中的数值/布尔值,或使用正则表达式匹配键和值,请使用完全限定的 protobuf 字段路径:

  • 通过正则表达式匹配附加容器内的任何值字符串:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • 匹配自定义字段中的布尔值或数值:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • 搜索与正则表达式前缀匹配的多个动态键:

    additional.fields.key = /^myKeyNumber_.*/
    
  • 检查某个键是否存在(无论值是什么):

    additional.fields["pod_name"] != ""
    
  • 直接使用正则表达式和 nocase 以及方括号语法:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • 使用 AND 合并多个 additional.fields 键值对:

    additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
    

搜索分组字段

分组字段是相关 UDM 字段组的别名。您可以使用它们同时查询多个 UDM 字段,而无需单独输入每个字段。

以下示例展示了如何输入查询,以匹配可能包含指定 IP 地址的常见 UDM 字段:

ip = "1.2.3.4"

您可以使用正则表达式和 nocase 运算符来匹配分组字段。还支持参考列表。分组字段还可以与常规 UDM 字段结合使用,如以下示例所示:

ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"

分组 UDM 字段的类型

您可以搜索以下所有分组的 UDM 字段:

分组字段名称 关联的 UDM 字段
domain about.administrative_domain
about.asset.network_domain
network.dns.questions.name
network.dns_domain
principal.administrative_domain
principal.asset.network_domain
target.administrative_domain
target.asset.hostname
target.asset.network_domain
target.hostname
email intermediary.user.email_addresses
network.email.from
network.email.to
principal.user.email_addresses
security_result.about.user.email_addresses
target.user.email_addresses
file_path principal.file.full_path
principal.process.file.full_path
principal.process.parent_process.file.full_path
target.file.full_path
target.process.file.full_path
target.process.parent_process.file.full_path
hash about.file.md5
about.file.sha1
about.file.sha256
principal.process.file.md5
principal.process.file.sha1
principal.process.file.sha256
security_result.about.file.sha256
target.file.md5
target.file.sha1
target.file.sha256
target.process.file.md5
target.process.file.sha1
target.process.file.sha256
hostname intermediary.hostname
observer.hostname
principal.asset.hostname
principal.hostname
src.asset.hostname
src.hostname
target.asset.hostname
target.hostname
ip intermediary.ip
observer.ip
principal.artifact.ip
principal.asset.ip
principal.ip
src.artifact.ip
src.asset.ip
src.ip
target.artifact.ip
target.asset.ip
target.ip
namespace principal.namespace
src.namespace
target.namespace
process_id principal.process.parent_process.pid
principal.process.parent_process.product_specific_process_id
principal.process.pid
principal.process.product_specific_process_id
target.process.parent_process.pid
target.process.parent_process.product_specific_process_id
target.process.pid
target.process.product_specific_process_id
user about.user.userid
observer.user.userid
principal.user.user_display_name
principal.user.userid
principal.user.windows_sid
src.user.userid
target.user.user_display_name
target.user.userid
target.user.windows_sid

在查询中添加注释

您可以在搜索编辑器中添加注释,以记录复杂的搜索逻辑或在测试期间暂时停用条件:

  • 单行注释:在注释文本前添加两个正斜杠 (//)。系统会忽略该行中斜杠后面的所有内容。
  • 多行块注释:将注释文本放在 /* 和 */ 之间。块注释可以跨多行。

示例:

metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
   movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000

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