Query-farm/vgi-sigma
GitHub: Query-farm/vgi-sigma
一个基于VGI的DuckDB worker,允许用户在SQL中直接评估Sigma检测规则以实现日志行的安全威胁检测。
Stars: 0 | Forks: 0
一个用于 DuckDB 的 Query.Farm VGI worker。
# vgi-sigma
**针对日志/事件行评估 [Sigma](https://sigmahq.io) 检测规则 —
detection-as-code,直接在 SQL 中实现。**
`vgi-sigma` 是一个 [VGI](https://github.com/Query-farm/vgi-python) worker:一个被 DuckDB 作为 catalog 挂载并像原生 SQL 函数一样调用的 Python 进程。
只需将 Sigma 规则编译**一次**,然后将其与日志表中的每一行进行测试:
```
INSTALL vgi FROM community; LOAD vgi;
ATTACH 'sigma' (TYPE vgi, LOCATION 'uv run sigma_worker.py');
-- The headline: which log rows match a rule?
SELECT *
FROM windows_security_log AS t
WHERE sigma.sigma_match(
to_json(t),
'title: Failed Network Logon
logsource: {product: windows, service: security}
detection:
selection:
EventID: 4625
LogonType: 3
condition: selection');
```
Sigma 是用于 SIEM 检测的开放、供应商中立的签名格式。该 worker 是一款**防御性安全工具**,它完善了 Query Farm 的网络防御矩阵,该矩阵还包括 `vgi-yara`、`vgi-ioc`、`vgi-cve`、`vgi-pe` 和 `vgi-x509`。
## 函数
### 标量函数(按行)
| 函数 | 签名 | 结果 |
|----------|-----------|--------|
| `sigma_match` | `(event_json VARCHAR, rule_yaml VARCHAR) → BOOLEAN` | JSON 事件是否匹配该规则?**核心功能。** |
| `sigma_check` | `(rule_yaml VARCHAR) → BOOLEAN` | 规则能否解析并编译(包含受支持的功能)? |
标量函数接受**位置**参数。
```
SELECT sigma.sigma_match('{"EventID": 4625, "LogonType": 3}',
'logsource: {service: security}
detection: {sel: {EventID: 4625, LogonType: 3}, condition: sel}'); -- true
SELECT sigma.sigma_check(
'logsource: {service: security}
detection: {sel: {EventID: 1}, condition: sel}'); -- true
SELECT sigma.sigma_check(': not valid yaml :'); -- false
```
### 表函数
| 函数 | 签名 | 行 |
|----------|-----------|------|
| `sigma_rule_info` | `(rule_yaml VARCHAR)` | 单行:`title, id, level, status, description, product, service, tags VARCHAR[]` |
| `sigma_match_fields` | `(rule_yaml VARCHAR)` | 规则引用的每个事件字段对应一行(`field VARCHAR`) |
```
SELECT title, level, status FROM sigma.sigma_rule_info('
');
SELECT UNNEST(tags) AS tag FROM sigma.sigma_rule_info('');
SELECT field FROM sigma.sigma_match_fields(''); -- index / coverage planning
```
## 事件即 JSON 契约
`sigma_match` 将事件作为 **JSON 对象字符串**接收,其键名是规则引用的字段名。实际上,你可以使用 DuckDB 的 `to_json(t)` 针对某一行生成它(或者自行构建):
```
SELECT sigma.sigma_match(to_json(t), :rule) FROM events AS t;
```
- **字段名必须与规则一致**(`EventID`、`LogonType`、`CommandLine` 等)。
- **嵌套字段**在规则中使用**点号**键进行寻址
(`process.name` → `event["process"]["name"]`);事件对象中字面意义上的点号键也会被支持。这与 pySigma 自身的点号约定一致。
- **缺失的**字段永远不会满足肯定比较。
- 如果 **任何**元素匹配,则作为 JSON **列表**的事件值匹配成功。
- 格式错误的事件 JSON 会被视为**不匹配**(`false`)——一条损坏的日志行永远不会中止整个列扫描。NULL 事件或 NULL 规则将返回 NULL。
## 支持的 Sigma 特性
评估器会遍历 pySigma 解析后的**条件树**,因此条件逻辑得到了全面处理,同时值匹配涵盖了常见的修饰符集合。
**条件**(全部受支持 — pySigma 会将选择器展开到树中):
- `and`、`or`、`not` 和括号
- `1 of selection*`、`all of selection*`、`1 of them`、`all of them`
- 关键字(无字段)搜索词 — 与事件中的每个值进行匹配
**字段修饰符**(受支持):
| 修饰符 | 含义 |
|----------|---------|
| *(无)* | 不区分大小写的相等比较;对 `*`/`?` 通配符执行 glob 匹配 |
| `contains` | 不区分大小写的子串匹配 |
| `startswith` | 不区分大小写的前缀匹配 |
| `endswith` | 不区分大小写的后缀匹配 |
| `re` | 正则表达式(Python `re.search`) |
| `all` | 列出的每个值都必须匹配(而不是默认的 OR) |
| *(列表值)* | OR — 列出的值中任意一个匹配即可 |
数字和布尔值按值进行比较(当事件将它们字符串化时会进行合理的字符串类型强制转换);`field: null` 可匹配缺失或为 null 的字段。
**不支持**(使用这些特性的规则在 `sigma_check` 中会被编译为 `false`,并在 `sigma_match` 或表函数中引发*明确的*错误——我们绝不会默默地产生错误的评估):
`base64` / `base64offset`、`cidr`、数值比较 `lt`/`lte`/`gt`/`gte`、`utf16`/`wide`、字段引用(`fieldref`)、`|expand` 占位符以及关联规则。这是一个已记录的有意范围界定:旨在支持常见的 detection-as-code 匹配,而不是完整的 pySigma 后端功能集。
## 性能表现
VGI 会在多次查询期间保持 worker 处于活动状态,而解析和编译规则是极其耗费资源的步骤。`sigma_match` 会将每个不同的规则仅编译**一次**(以规则文本为键的 `lru_cache`),然后对每一行评估开销较小的条件树——因此,将一个常量规则应用于包含一百万行的日志列时,只需支付一次解析开销。
## 开发
```
uv sync --extra dev
uv run pytest -q # unit + integration
make test-sql # end-to-end SQL (haybarn-unittest)
uv run ruff check . && uv run mypy vgi_sigma/
```
`make test-sql` 会将 `VGI_SIGMA_WORKER` 指向作为 uv stdio 子进程运行的 worker(这与 DuckDB 在执行 `ATTACH` 后驱动它的方式完全相同),并运行 `test/sql/` 下的 sqllogictest 文件。使用
`uv tool install haybarn-unittest` 安装一次运行器即可。
## 许可证
`vgi-sigma` 基于 **MIT License** 授权——详见 [LICENSE](LICENSE)。
它依赖于 **[pySigma](https://github.com/SigmaHQ/pySigma)**(官方
`sigma` Python 包),该包基于 **GNU Lesser General Public
License v2.1 (LGPL-2.1)** 授权。pySigma 作为普通的已安装依赖**未被修改**地使用(仅进行导入,从未被更改或静态链接到衍生作品中)。该 worker 自身的源代码保持 MIT 授权;将其与 pySigma 一起重新分发时,必须遵守 pySigma 对该组件的 LGPL-2.1 条款。
## 作者与许可证
由 [Query.Farm](https://query.farm) 编写。
版权所有 2026 Query Farm LLC - https://query.farm标签:DuckDB, Python, Sigma规则, URL发现, 代码示例, 多线程, 安全检测, 数据分析, 无后门, 目标导入, 逆向工具