查询语法
最后更新于:
本页内容
概述
查询语法是构建查询语法时可使用的语言,该语法能被机器学习(ML)模型理解,并协助您在创建高级规则时构建规则条件和规则参数。
本页面包含完整的查询语法参考,涵盖基本条件、支持的数据类型、关系运算符与逻辑运算符、高级函数、聚合构造、相关性语句及实用检测示例。
基本条件
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 操作名称.字段, 操作名称.字段集, 定义名称
高级运算符
- isMalicious函数
- isVulnerable 函数
- 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。
语法:
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 凭据防护功能被禁用)。
语法:
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 |
|
计数 | 计数 > 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. 算术运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| + | 添加 | 时间戳 + 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 |
| 高级规则中的异常操作 | 异常检测不可与阈值/分组/去重/关联条件组合使用 | – | – | – | – |
另请参阅
本文档阐述了查询语法如何支持高级规则创建,涵盖通过运算符与函数定义 条件、应用关联逻辑及构建实用检测用例的全过程。