本地 云
下载PDF
此功能适用于 EventLog Analyzer 和 Log360

# 查询语法

最后更新于：2025年9月12日

本页内容

- 概述
- 基本条件
- 数据类型
- 数值关系运算符
- 字符串关系运算符
- 逻辑运算符
- 示例
- 查询语法
- 高级运算符
- isMalicious 函数
- isVulnerable 函数
- misConfiguredFor 函数
- 查询组件
- 聚合函数
- 排序运算符
- 时间窗口运算符
- 分组运算符
- 唯一值运算符
- Having 运算符
- 首尾操作符
- 与运算符
- 语句顺序
- 查找条件
- 相关性条件
- 算术运算符
- 相关多操作
- 链接语句
- 序列语句
- 定义和过滤语句
- 选择语句
- 用例特定示例
- 检测规则限制

## 概述

查询语法是构建查询语法时可使用的语言，该语法能被机器学习（ML）模型理解，并协助您在创建高级规则时构建规则条件和规则参数。

本页面包含完整的查询语法参考，涵盖基本条件、支持的数据类型、关系运算符与逻辑运算符、高级函数、聚合构造、相关性语句及实用检测示例。

## 基本条件

1. 数据类型
2. 数值关系运算符
3. 字符串关系运算符
4. 逻辑运算符
5. 示例

### 1. 数据类型

类型名称 | 描述 | 示例
--- | --- | ---
字符串 | 字符串值 | "姓氏" "198.51.100.255" "字节数"
整数 | 整数值 | 23 -32 4000000244553
浮点 | 浮点数。 | 3.14 -1.2e5
时间跨度 | 由一个或两个数字后跟's'表示秒，'m'表示分钟，'h'表示小时，'d'表示天，'w'表示周，'M'表示月，'q'表示季度，'y'表示年。 | 2秒，45分钟，4小时，2天，3周，2个月，4季度，1年
内存 | 数据单位：'B'代表字节，'KB'代表千字节，'MB'代表兆字节， 'GB'代表千兆字节，'TB'代表太字节，'PB'代表拍字节。 | 2B, 3KB, 3 MB, 34GB, 9TB, 9PB
日期时间 | 日期时间格式采用"YYYY-MM-DD"、"YYYY-MM-DD HH-MM-SS"表示 | "2000-08-30" "2000-08-30 15:45:06"
IP | IP地址值 | "10.13.29.70" "127.0.0.1/16"

### 2. 数值关系运算符

运算符 | 描述 | 支持的数据类型 | 示例
--- | --- | --- | ---
> | 大于 | 整数、浮点数、内存、IP地址 | source_IP > 10.53.12.0
>= | 大于或等于 | 整数, 浮点数, 内存, IP | 源IP < 10.53.12.0
< | 小于 | 整数, 浮点数, 内存, IP | 源IP < 10.53.12.0
≤ | 小于或等于 | 整数, 浮点数, 内存, IP | 源IP <= 10.53.12.0
= | 等于 | 字符串, 整数, 浮点数, 内存, IP | 事件ID=4624
!= | 不等于 | 字符串、整数、浮点数、内存、IP | 事件ID!=4624
in/IN | 等于以下任一元素 | 字符串、整数、浮点数、IP | 事件ID在 (4624,4625)
notin/NOTIN | 不等于任何元素 | 字符串、整数、浮点数、IP | 事件ID notin (4624,4625)
isExist | 字段不是空字符串，且不为空。 | 对于所有字段 | 对于所有字段
isNotExist | 字段为空字符串，且为空值。 | 对于所有字段 | isNotExist(source_ip)

### 3. 字符串关系运算符

运算符 | 描述 | 示例
--- | --- | ---
= | 等于 | username = "name"
!= | 不等于 | 用户名 != "名称"
包含/CONTAINS | 若字段包含数据则返回真 | eventname contains "success"
不包含/NOTCONTAINS | 字段未包含数据集时返回 true | eventname notcontains "success"
startswith/STARTSWITH | 字段值以数据开头时返回 true | 用户名以"Ja"开头
endswith/ENDSWITH | 字段值以数据结尾时返回 true | username endswith "kumar"
notstartswith/NOTSTARTSWITH | 字段值不以数据开头时返回 true | username notstartswith "Ja"
notendswith/NOTENDSWITH | 字段值不以数据结尾时返回 true | username notendswith "kumar"
匹配/MATCHES | 字段值匹配正则表达式时返回 true | username matches "pree*"
notmatches/NOTMATCHES | 字段值不匹配正则表达式时返回 true | username notmatches "pree*"
= | 等于 | username = "name"

### 4. 逻辑运算符

运算符 | 描述 | 示例
--- | --- | ---
AND/and | 仅当两个条件都为真时返回真 | username = "preethi" and eventid=4624
OR/或 | 返回值为 true，当任一条件为真时，无论另一条件如何。 | eventid = "4688" 或 eventid = "592"

### 示例

- 重复失败的SUDO命令基本判定条件： logtype="unix" and iename = "sudo command execution failed"
- 密码变更失败过多的基本条件：common_report_name = "用户账户密码变更" 且 severity = "failure" 或 iename = "密码更新失败"
- Ryuk 远程唤醒命令基本条件：日志类型在 ("Windows", "Fortinet", "Sonic wall") 且 (事件ID = "4688" 或 事件ID = "592") 且 ( 命令行包含 "8 lan" 或 命令行包含 "9 rep")
- Windows登录失败基本条件：日志类型 = "Windows" 且 操作名称 = "登录失败"
- 成功登录的基本条件：actionname = "Success logon"

注：

- 日志类型将包含以下值：*（包含所有日志类型）、 Windows、 Unix、Cisco等。
- 通过`actionname`运算符，可在查询中调用预定义操作。

## 查询语法

该查询语言支持多种运算符和子句。以下是完整的语法 参考。

#### 1. 基础语法：

操作名称:

日志类型 = (* | windows | syslog | ...) [ 逻辑运算符 基本条件 ... ] 通过 [ 聚合函数(字段名), ... ]

示例：eventid = 4624

#### 2. 排序：

| 排序字段名 (升序 | 降序)

#### 3. 直方图：

| histo 字段名 范围(起始值, 起始值至结束值) 排序 [ 聚合字段 | 计数 ] (升序 | 降序)

#### 4. 时间窗口：

| 时间窗口 值 单位 排序 [ 聚合字段 | 计数 ] (升序 | 降序) 限制 值 具有 计数 运算符 值

#### 5. 分组：

| 分组字段名 带 [ 聚合函数(字段名), ... ] 排序 [ 聚合表达式 | 计数 ] (升序 | 降序) 限制 数量 具有 [ 聚合表达式 | 计数 ] 比较运算符 数量

注意：

- 括号内的运算符（groupby、histo等）可任意排序。
- timeslice运算符仅能出现一次。
- groupby和histo运算符最多可出现 三次，顺序不限。

#### 6. 唯一值：

| 唯一字段名 排序 (升序 | 降序) 限制 [1-200] 具有 计数 运算符 值

#### 7. 后处理：

| 具有聚合表达式 运算符 值 [ 逻辑运算符 (聚合表达式 运算符 值) ]
| 异常检测(字段, 模型, 字段)

#### 8. 首尾条件：

| 首个 [1-10] 字段名 [, 字段名 ...]
| 最后 [1-10] 字段名 [, 字段名 ...]

#### 9. 查找：

| 在<查找表.查找字段>中查找<事件字段>，将<事件目标字段> 设为<查找表.查找目标字段>

#### 10. 定义：

def: 变量名 = <表达式>

支持类型：整数、字符串、浮点数、时间、布尔值

#### 11. 过滤：

filter: <条件>

这将移除不符合条件的搜索结果。

#### 12. 事件序列：

跟随：动作名称1 紧接 | 未紧接 动作名称2 在 [1-60] (毫秒 | 秒 | 分钟 | 小时 | 天)

示例：基于关联性检测某事件发生后10分钟内 紧接另一事件。

#### 13. 选择：

select 操作名称.字段, 操作名称.字段集, 定义名称

## 高级运算符

1. isMalicious函数
2. isVulnerable 函数
3. misConfiguredFor 函数

### 1. 是否恶意

- 'isMalicious' 条件仅适用于 IP 地址字段。该条件检查 检测到的 IP 地址是否存在于内部数据库中 预先定义的恶意 IP 地址列表中。
- 该函数返回 true 或 false。

语法：isMalicious(字段名)

示例：外部远程服务

来自公共IP的登录失败：

logtype = "*" and eventid = 4625 and isExists(remoteip) and isMalicious(remoteip)

### 2. 存在漏洞

- 仅在集成 Endpoint Central 后可用，可用于设备字段。检查设备是否在 Endpoint Central 中被标记为存在漏洞，并识别易受特定攻击（如 CVE-2023-38831）影响的设备。
- 该函数返回 true 或 false。

注意：此运算符仅适用于EventLog Analyzer的 持续执行模式。

语法：

isVulnerable(字段名)

isVulnerable(字段名 , 匹配值)

示例：

A. Microsoft Outlook 漏洞利用

Outlook连接webDAV或SMB共享时：

logtype = "windows" and eventid = 4656 and objectname contains "\REGISTRY\MACHINE\SYSTEM" or objectname contains "Services" or objectname contains "WebClient\NetworkProvider,LanmanWorkstation\NetworkProvider" 且访问列表包含 "读取数据 (或列出目录)" 且存在漏洞(设备名称, "CVE-2023-23397")

| 按进程名分组

通过Rundll.exe执行可疑webDAV客户端：

logtype = "sysmon" 且 iename = "Sysmon Process Creation" 且 parentprocessname 包含 "svchost.exe" 且 parentprocesscommandline 包含 "-s WebClient" 且 processname 包含 "rundll.exe" 且 processname = Outlook 连接 webDAV 或 SMB 共享.processname

B. AWS登录失败

错误事件：

日志类型 = "aws cloudtrail" 且 isVulnerable(errorcode)

### 3. 配置错误事件

仅在与 Endpoint Central 集成后可用，可与设备字段配合使用。 检测由 Endpoint Central 识别出的配置错误设备（例如 Windows 凭据防护功能被禁用）。

注意：此运算符仅适用于 EventLog Analyzer 的 持续执行模式。

语法：

misConfiguredFor(字段名 , 匹配值)

示例：

A. 内置访客账户权限提升

网络访客登录成功：

logtype = "windows" and eventid = 4624 and username contains "Guest" and logontype = 3 and MisconfiguredFor(设备名称, "内置来宾账户未禁用或未正确限制")

| 按登录ID分组

B. 特权操作尝试：

logtype = "windows" and eventid = 4672 and logonid = 成功网络访客登录.logonid and MisconfiguredFor(设备名称, "内置访客账户未禁用或未受限")

C. 用户账户本地组成员资格变更尝试：

logtype = "windows" and eventid = 4732 and groupname contains "Administrators" and logonid = Successful Network Guest Logon.logonid and MisconfiguredFor(设备名称, "内置来宾账户未禁用或未受限")

## 查询组件

- 聚合函数
- 排序运算符
- 时间窗口运算符
- 分组运算符
- 唯一操作符
- 拥有操作员
- 首/末操作符
- 带运算符
- 语句顺序

### 1. 聚合函数

函数 | 描述 | 语法 | 示例 | 输出
--- | --- | --- | --- | ---
SUM | 返回字段中选定值的总和。 返回单个数值。 | sum(field) 或 SUM(field) | sum(bytes_in) | 3.27MB (3,432,605)
平均值 | 返回字段中值的平均值。 返回单个数值。 | avg(field) 或 AVG(field) | avg(_zl_timestamp) | 1.36KB (1,393.156)
MAX | 返回字段中的最大值。 返回单个数值。 | max(field) 或 MAX(field) | max(接收字节数_i) | 107.61kb (110,196)
MIN | 返回字段中的最小值。 返回单个数值。 | min(字段) 或 MIN(字段) | min(接收字节数_i) | 107.61kb (110,196)
STDEV | 返回给定字段的标准差。 返回单个数值。 | stdev(field) 或 STDEV(field) | stdev(_zl_timestamp) | 2.46kb (2,521.297)
COUNT | 返回匹配查询的日志消息数量。 使用“with”运算符 → 返回数字。 使用“having”运算符 → 返回布尔值（true/false）。 | 计数 | 计数 > 100 | true/false
DCOUNT | 返回唯一值的计数。使用“with”操作符时→返回数字。使用“having”操作符时→返回布尔值（true/false）。 | dcount(字段) 或 DCOUNT(字段) | having dcount(_zl_host) > 2 | true/false

### 2. 排序运算符

- 按指定字段排序所有结果。
- 默认按计数降序排序。
- 在"sort"之后，仅允许使用非聚合字段。
- 语法：sort 字段名1 (asc/desc) [, 字段名2 (asc/desc) ...]
- 示例：
  - logtype="windows" and eventid = 4625 | sort username asc, hosttype desc

### 3. 时间窗口运算符

- 将日志分组到指定的时间段。
- 在"sort"之后，仅允许使用聚合字段。
- 按关键词分组的最大限制值为1000。
- 可用时间窗口单位：y（年）、M（月）、w（周）、d（日）、h （小时）、m（分钟）、s（秒）。
- 语法：timewindow 值 单位 排序 [聚合字段, 计数] (升序/降序) 限制 值 筛选 计数 运算符 值
- 示例：
  - logtype="windows" | timewindow 5m
  - logtype="windows" | timewindow 5m sort count desc
  - logtype="windows" | timewindow 1h sort sum(bytes_in) as totalBytes asc
  - logtype="windows" | timewindow 1h sort timewindow desc
  - logtype="windows" | timewindow 5m limit 5
  - logtype="unix" and eventid = 4625 | timewindow 10m limit 10 having count > 100
  - logtype="windows" | timewindow 10m | groupby username

### 4. 分组运算符

- 用于获取字段的唯一值。
- 当指定多个分组字段时，第一个为主要分组，第二个为次要分组。
- 在"排序"之后，仅允许聚合字段。
- 分组上限为1000。
- 语法：groupby 字段名1 with 聚合字段 排序 [聚合字段, 计数] [升序/降序] 限制 [1-1000] having 聚合表达式 运算符 值
- 示例：
  - logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc
  - logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc limit 10 | groupby hostname
  - logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc limit 10 | groupby hostname with sum(sent_bytes_i) as total
  - logtype="windows" and eventid = 4625 | groupby username having count > 100
  - logtype="windows" and eventid = 4625 | 按用户名分组 having avg(发送字节数) 作为 平均值 > 10 MB
  - logtype="windows" | 按用户名分组 限制20条 | 按主机类型分组 且 avg(sent_bytes_i) 作为平均值 > 10MB | 按主机名分组 且 sum(received_bytes_i) 作为总计 < 500 MB

### 5. 唯一值操作符

- 获取仅包含唯一值的表。
- 仅允许一个唯一字段。
- 唯一字段仅可按计数排序。
- 唯一值上限为 200。
- 语法：distinct 字段名 sort (asc | desc) limit [1-200] having count operator value
- 示例：
  - logtype="windows" | 唯一 zuid
  - logtype="windows" | 唯一 zuid 升序排序
  - logtype="windows" | 唯一 zuid 限制 150
  - logtype="windows" | 唯一位置 且 计数 > 5

### 6. 筛选运算符

- 后置结果运算符。用于外部聚合条件。
- 语法：having 聚合表达式 运算符 值 [ 逻辑运算符 (聚合表达式 运算符 值) ]
- 示例：
  - logtype="unix" and eventname contains "logon" | having count > 120
  - logtype="windows" and eventid = 4625 | having avg(sent_bytes) as average > 10 MB

### 7. 首尾操作符

- 第一个运算符返回最早的日志，最后一个运算符返回最新的日志。
- 可单独使用 first 或 last 操作符。
- 可与 first/last 配合使用 limit 参数。
- 最大限制值为10。
- 语法：first/last [1-10] 字段名1 (, 字段名2, ...)
- 示例：
  - logtype="windows" | groupby status | first 2 request_uri,remote_ip
  - logtype="windows" | groupby status | last 2 request_uri,remote_ip

### 8. WITH 运算符

- 聚合表达式可在基本条件和分组运算符中使用。
- 语法：with 聚合表达式 (, 聚合表达式 ...)
- 示例：
  - logtype="windows" and with sum(sent_bytes) as bytesSum, avg(received_bytes) as average | groupby srcip
  - logtype="windows" and | groupby srcip with sum(sent_bytes) as bytesSum, avg(received_bytes) as average

### 9. 语句顺序

| 基本条件 with 字段.聚合函数 [, 字段.聚合函数, ...]

| 排序字段 (升序/降序)

[ | histo 字段名 范围(起始值, 起始值至结束值) 排序 [聚合字段, 计数] [升序/降序]

| 时间窗口 值 限制值

| 分组字段 排序聚合(字段) (升序/降序) 限制数量 ]

| 唯一字段

| 首尾[1-10]字段名

| 具有 (分组字段.字段 / 时间窗口.计数 运算符 / 分组字段.唯一字段.聚合/聚合函数.字段) 运算符 值

注：

- 括号内的操作符可任意排序。
- timewindow只能出现一次。
- 分组和计数可最多出现三次， 顺序不限。

## 查找条件

#### 查找查询

查找运算符可从查找表中获取额外信息。

它将事件字段名称和值与查找表字段名称进行匹配。

- 若未使用"set" → 则按查找包含方式工作（检查键是否存在）。返回 True/False。
- 若使用"set" → 从查找表中获取值并存储在您选择的字段中。

#### 语法：

lookup 事件字段 in 查找表.查找字段 [ 及/或更多条件 ] (set 查找表.目标字段 as 新字段)

#### 示例：

- logtype = windows and eventid = 4625 → 在user_details.user中查找username
- logtype = windows 且 eventid = 4625 → 在 user_details.user 中查找用户名 将 user_details.ip_address 设为 ip，将 user_details.port 设为 port
- logtype = windows 且 eventid = 4625 → 在 user_details.user 中查找用户名，在 user_details.hostname 中查找设备 将 user_details.ip_address 设为 ip，将 user_details.port 设为 port

## 关联条件

1. 算术运算符
2. 关联多操作
3. 链接语句
4. 序列语句
5. 定义和过滤语句
6. 选择语句

### 1. 算术运算符

运算符 | 描述 | 示例
--- | --- | ---
+ | 添加 | 时间戳 + 3600000毫秒 > 4800000
- | 减 | 时间戳 - 3600000毫秒 > 2400000
* | 乘法 | 比率 = (故障事件计数 / 访问计数)
/ | 除法 | 比率 = (失败事件计数 / 访问计数) * 100

### 2. 关联（多操作）

- 您可以定义多个带条件的操作（e1、e2 等）。
- 每个动作必须包含基本条件。聚合函数和查找条件为可选项。
- 语法：操作名称 : 基本条件 | 聚合条件 | 查找条件 | 关联条件
- 示例：
  - e1: 日志类型 = cisco 且 常见报表名称 属于 (unix用户添加, 防火墙用户 添加, 用户账户创建, 计算机账户创建)
  - e2: 日志类型 = cisco 且通用报表名称 in (计算机账户删除, 用户 account deleted, unix user deleted, firewall user deleted) and hosttype = e1.hosttype and targetuser = e1.targetuser and _zl_timestamp between e1._zl_timestamp and (e1._zl_timestamp + 3600000ms)

### 3. 链接语句

- 链接语句用于比较某操作字段是否与另一操作字段匹配。
- 可通过AND/OR/NOT与其他条件组合使用。
- 语法：字段名 (运算符) 操作名.字段名 [ 及/或更多 比较条件 ]
- 示例：
  - 暴力破解登录
    - e1:logtype = windows and event_name = failed windows login | groupby username | groupby devicename
    - e2:logtype = windows 且 event_name = successful windows login 且 username = e1.username 且 devicename = e1.devicename
    - 序列：e1 紧接 e2，间隔不超过 10 分钟
    - Select e1.username, e2.devicename
  - 异常用户账户变更
    - e1:日志类型 = Windows 且通用报表名称在 (unix 用户 添加, 防火墙用户添加, 用户账户创建, 计算机账户 创建)
    - e2:日志类型 = windows 且 common_report_name 属于 (计算机账户删除, 用户账户删除, unix 用户删除, 防火墙用户删除) 且 主机类型 = e1.hosttype 且 目标用户 = e1.targetuser 且 时间 >= e1.time
    - Select e1.主机类型, e1.目标用户

### 4. 序列语句

- 定义特定时间内某操作是否紧随另一操作发生。
- 必须始终指定时间范围。
- 语法：序列 : 操作1 (跟随/不跟随) 操作2 在 时间范围内 [ 且操作2 跟随/不跟随 操作3 ... ]
- 示例：
  - 未经授权的文件访问
    - e1:logtype = windows and eventid = 4663 (对象访问尝试)
    - e2:logtype = windows and eventid = 4656 (句柄请求)
    - 序列：e1 未由 e2 跟随 且 时间间隔小于 5 分钟
    - 选择 e1.username, e1.devicename
  - 暴力破解登录
    - e1:日志类型 = windows 且 事件名称 = 失败的 windows 登录 | 按用户名分组 | 按设备名称分组
    - e2:日志类型 = windows 且事件名称 = 成功的 windows 登录 且用户名 = e1.username 且设备名称 = e1.devicename
    - 序列：e1 紧接 e2 且时间间隔小于10分钟
    - Select e1.username, e2.devicename
  - Ragnar Locker勒索软件检测
    - e1:日志类型 = Windows 且 进程ID = 4688 且 进程名称 = msiexec.exe
    - e2:日志类型 = windows 且 事件ID = 4654 且 对象名称 包含 Program Files(X86) 且 以 VirtualAppliances\va.exe 结尾 且 设备名称 = e1.devicename
    - e3: 日志类型 = Windows 且 进程ID = 4688 且 进程名称 = e2.对象名称 且 设备名称 = e1.设备名称
    - 序列：e1 发生后 30 分钟内出现 e2，随后 2 分钟内出现 e3
  - 可疑SQL备份活动
    - e1：日志类型 = Windows 且事件ID = 4625 | 唯一 设备名称
    - e2：日志类型 = Windows 且事件ID = 4624 且设备名称 = e1.设备名称 且用户名 = e1.用户名
    - e3:日志类型 = mssql 且操作ID = lgis
    - e4:日志类型 = * 且操作 = ba
    - 序列：e1后10分钟内发生e2，且e3后 5分钟内发生e4

### 5. 定义与过滤语句

#### Def语句

- def语句用于计算表达式并将结果值放入搜索结果字段。
- 用于在搜索结果中创建新字段，该字段值即表达式计算结果。
- 在 def 语句中，仅可获取总计数、平均值或总和，例如 action_count 或基于动作的字段聚合如 'e1.count' 或 'e1.sent_bytes.sum'。
- 语法：def: 变量名 = 操作名.(计数 / 字段.聚合函数) 运算符 操作名.(计数 | 字段.聚合函数 / 值)

#### 过滤语句

- 过滤运算符仅保留符合过滤条件的记录。
- def语句中的字段约束将应用于过滤语句。
- 语法：filter: (def_variable_name / actionname. (count / field.aggregate_function)) operator value

#### 示例：两个事件的比率：

- 访问条件：logtype="windows" and
- failure_event:logtype="windows" and and
- def:ratio = count(failure_event) / count(access)
- def:百分比 = 比率 * 100
- 过滤器：百分比 > 50
- Select 比率, 失败事件计数, 访问计数

### 6. Select语句

- Select用于显示结果中需要呈现的字段或聚合值。
- 语法：select 字段, 聚合函数
- 示例：
  - 过多的登录失败
    - e1:logtype = windows 且 common_report_name 属于 (router logon failed, unix logon failed, firewall logon failed, logon failed, vpn logout, firewall logoff, failed cloud logon) | 按 username 分组
    - Select e1._zl_timestamp, e1.hostname
  - 异常用户账户变更
    - e1:日志类型 = windows 且 common_report_name 属于 (unix 用户 添加, 防火墙用户添加, 用户账户创建, 计算机账户 创建)
    - e2:日志类型 = * 且通用报表名称在 (计算机 账户 删除, 用户账户删除, Unix 用户删除, 防火墙用户删除) 且 主机类型 = e1.hosttype 且目标用户 = e1.targetuser 且 _zl_timestamp 介于 e1._zl_timestamp 与 (e1._zl_timestamp + 3600000ms) 之间
    - Select e1._zl_timestamp, e1.log_uuid, e2._zl_timestamp, e2.log_uuid
  - VPN登录失败过多
    - failed_logon: logtype = * and eventtype = vpn_logon_failure | distinct username having count > 5
    - Select failed_logon.username, count(failed_logon)
  - 可疑文件访问
    - file_access:logtype = windows and eventid = 4663 | groupby username | groupby objectname having count > 3
    - file_modified: logtype = windows and eventid = 4663 and type = modify and username = file_access.username and objectname = file_access.objectname
    - 序列：file_access 紧接 file_modified 且 时间间隔<5分钟
    - Select file_access.username, file_modified.objectname, count(file_access.objectname)

## 用例特定示例

以下是查询语法如何应用于检测常见安全场景的实际示例。 每个示例展示查询逻辑、支持的运算符及输出字段。

#### 1. 成功登录

描述：检测Windows系统中的成功登录事件。

查询语句：

logtype = "Windows"
且事件ID = 4624
且消息包含"成功登录"

#### 2. 过多登录失败尝试

描述：标记登录失败次数过多的用户名或设备。

查询：

日志类型为 ("windows", "unix")
且事件ID = 4625
| 按用户名分组
| 按设备名称分组且计数 > 10

#### 3. 暴力破解登录检测

描述：检测暴力破解尝试，即同一用户在同一设备上短时间内多次登录失败后 紧接着 成功登录的情况。

查询语句：

步骤1 – 失败登录记录 (e1):

e1:
logtype = "windows"
且 event_name = "Failed Windows Login"
| 按用户名分组
| 按设备名称分组

步骤 2 – 成功登录 (e2)：

e2:
日志类型 = "windows"
且事件名称 = "Windows登录成功"
用户名 = e1.username
且设备名称 = e1.设备名称

序列逻辑：

e1 发生后 10 分钟内触发 e2

最终输出：

select e1.username, e2.devicename

#### 4. 端口扫描攻击

描述：识别在短时间内扫描多个端口的设备或IP地址。

查询语句：

e1:
日志类型在 ("unix", "windows", "sysmon")
且事件名称 = "允许连接"
| 按远程IP分组
| 按主机分组
| 按端口分组，且计数 > 100

select e1.主机, count(e1.主机)

#### 5. 数据外泄检测

描述：检测异常高出站数据传输量。

查询：

netlog:
logtype = "unix"
且 event_name = "允许连接"
| 按 srcip 分组
| 按目标IP分组，且发送字节数>100MB

select netlog.源IP, netlog.目标IP, sum(netlog.发送字节数)

#### 6. 失败事件与成功事件的比例

描述：计算失败访问事件占总访问事件的百分比。

查询：

步骤1 – 总访问事件：

access:
logtype = "*"
且 type = "access"

步骤 2 – 访问失败事件：

failure_event:
日志类型 = "*"
且类型 = "访问"
且状态 = "失败"

定义比率：

def: ratio = (failure_event.count / access.count) * 100

过滤高失败率：

筛选条件：比率 > 50

最终输出：

select 比率, 访问次数, 故障事件次数

## 检测规则限制

检测规则限制规定了ELA和L3C关联模式下的功能约束及运算符支持范围。 下表详细说明了计划检测规则与持续检测规则在支持运算符、阈值、聚合及查询结构方面的差异。

下表详细说明了定时检测规则与持续检测规则在支持运算符、阈值、聚合及 查询构造方面的差异。

功能 | 描述 | EventLog Analyzer 计划关联 | EventLog Analyzer 持续关联 | Log360 Cloud 计划关联 | Log360 Cloud 持续关联
--- | --- | --- | --- | --- | ---
数值关系运算符 | 基本比较运算符（>、<、=、!=、>=、<=、in、not in、exists、not exists、between、not between） | IP范围不支持 | 支持所有运算符 | 不支持IP范围 | 支持所有运算符
字符串关系运算符 | 基于文本的比较（包含、不包含、以...开头、以...结尾、 匹配、不匹配） | 匹配与不匹配不支持 | 支持所有运算符 | 匹配与不匹配不支持 | 支持所有运算符
逻辑运算符 | 逻辑条件（与、或） | 全部支持 | 全部支持 | 全部支持 | 全部支持
高级运算符 | 安全检查（isMalicious、isVulnerable、misconfiguredFor） | 仅支持 isMalicious | 全部支持 | 不支持任何操作符 | 仅支持 isMalicious
声明链接 | 在条件构建器中链接操作 | 支持多重+嵌套条件 | 支持多重条件；不支持嵌套条件 | 支持多重+嵌套条件 | 最多支持3个条件；不支持嵌套
阈值限制 | 阈值计数限制 | 无限制 | 最大限制为999 | 无限制 | 默认限制为10（可增加）
IN运算符值限制 | IN 操作符内部的最大项数 | 25 | 25 | 25 | 25
聚合函数 | 聚合函数（求和、求均值、求最大值、求最小值、求标准差、求百分位数、求计数、求唯一值） | 全部支持 | 仅支持计数和唯一项统计 | 全部支持 | 仅支持计数和唯一项
WITH 运算符 | 基本条件中使用聚合函数 | 最多支持10个条件项 | 不支持 | 最多 10 个术语 | 不支持
排序运算符 | 按字段排序结果 | 支持（最多5个字段） | 不支持 | 支持（最多5个字段） | 不支持
时间窗口运算符 | 设置基于时间的阈值 | 最多7天；上限200 | 无限制（不支持时间窗口） | 最多1天；上限200 | 默认1小时（可延长）；不支持时间窗口
直方图运算符 | 直方图功能 | 不支持 | 不支持 | 不支持 | 不支持
分组运算符 | 按条件分组字段 | 最多 3 个字段 | 无限制 | 最多 3 个字段（受限制） | 最多 3 个字段
唯一运算符 | 阈值/查询中的唯一计数 | 仅限1个唯一字段（无排序/限制） | 仅限1个唯一字段（无排序/限制） | 仅1个唯一字段（无排序/限制） | 仅1个唯一字段（无排序/限制）
最大分组计数 + 唯一值计数 | 组合使用限制 | 最多3个groupby + 1个distinct | 多个分组 + 1个唯一值 | 或（最多2个分组+1个唯一）或（最多3个分组+0个唯一） | 最多 3 次分组 + 1 次去重
首尾操作符字段 | 返回首条或末条记录 | 最多10个字段 | 不支持 | 最多 10 个字段 | 不支持
isAnomalous 运算符 | UEBA异常检测 | – | – | – | –
算术运算符 | 查询中的算术运算 | 支持 | 不支持 | 支持 | 不支持
最大操作限制 | 允许操作次数 | 最多10次 | 最多 10 | 最多3次 | 最多3
序列语句 | 有序事件检查（后跟/不后跟） | 最多7天 | 最多30天 | 最多1天 | 最多1小时
Def语句 | 创建新计算字段 | 最多10 | 不支持 | 最多 10 | 不支持
筛选条件 | 保留符合条件的记录 | 最多 10 | 不支持 | 最多 10 | 不支持
SELECT语句 | 选择字段（仅限计划规则中的别名） | 最多 20 | 最多 20 | 最多 20 | 最多 20
查询长度 | 每次查询的最大字符数 | 10000 | 10000 | 10000 | 10000
高级规则中的异常操作 | 异常检测不可与阈值/分组/去重/关联条件组合使用 | – | – | – | –

另请参阅

本文档阐述了查询语法如何支持高级规则创建，涵盖通过运算符与函数定义 条件、应用关联逻辑及构建实用检测用例的全过程。

- 规则管理概述
- 规则理解
- 创建自定义规则
- 规则管理
- 计划检测报表