了解搜索语法
本指南适用于希望在 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")。labelsfields:每个事件只能包含一个键值对 (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_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.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