ahkecha/wazuh-sigma

GitHub: ahkecha/wazuh-sigma

一个将 Sigma 检测规则故障安全地编译为 Wazuh XML 规则的检测即代码流水线,通过语义验证和原生解析确保转换后逻辑的保真度。

Stars: 1 | Forks: 1

# WAZUH SIGMA PIPELINE ### 一个将 Sigma 转换为 Wazuh 的故障安全检测编译器 **解析规则。保留逻辑。验证输出。拒绝其余。** [![CI](https://github.com/ahkecha/wazuh-sigma-pipeline/actions/workflows/ci.yml/badge.svg)](https://github.com/ahkecha/wazuh-sigma-pipeline/actions/workflows/ci.yml) [![Python](https://img.shields.io/badge/Python-3.10%20%E2%80%93%203.12-3776AB?logo=python&logoColor=white)](https://www.python.org/) [![Wazuh](https://img.shields.io/badge/Native%20validation-Wazuh%204.14.6-00A9E5)](evidence/native-validation-baseline.json) [![Strict coverage](https://img.shields.io/badge/Strict%20Windows%20coverage-80.11%25-6C3FC5)](evidence/corpus-baseline.json) [![Generated rules](https://img.shields.io/badge/Generated%20Wazuh%20rules-10%2C701-111827)](evidence/corpus-baseline.json) [![Status](https://img.shields.io/badge/Status-Beta-8A2BE2)](docs/SUPPORT_MATRIX.md) [![License](https://img.shields.io/badge/License-PolyForm%20Noncommercial-555555)](LICENSE.md) [存在原因](#why-this-exists) · [证据](#evidence-not-marketing) · [架构](#compiler-architecture) · [快速开始](#quick-start) · [语义](#semantic-lowering) · [验证](#validation-ladder) · [文档](#documentation)
## 是证据,而非营销 当前提交的 Windows 基准是在严格模式下基于 **2,403 条 SigmaHQ 规则** 测量的。 | 测量指标 | 当前基准 | |---|---:| | 评估的 Sigma 规则 | **2,403** | | 语义安全的编译 | **1,925** | | 明确拒绝的规则 | **478** | | 严格转换覆盖率 | **80.11%** | | 生成的 Wazuh XML 规则 | **10,701** | | 平衡的输出块 | **4** | | XML 验证失败 | **0** | | 块验证失败 | **0** | | 原生 `wazuh-analysisd -t` | **通过** | | 测试的 Wazuh 版本 | **4.14.6** | 该基准是可重现且已提交的: - [`evidence/corpus-baseline.json`](evidence/corpus-baseline.json) - [`evidence/semantic-baseline.json`](evidence/semantic-baseline.json) - [`evidence/native-validation-baseline.json`](evidence/native-validation-baseline.json) ## 为什么会有这个项目 Sigma 和 Wazuh 不共享相同的执行模型。 Sigma 具有 selections、modifiers、分组的 boolean 条件、wildcard selectors、negation 和 abstract fields。Wazuh 具有 XML 规则、特定于 decoder 的字段名称、父 SID 关系、PCRE2 约束和 target-version 行为。 一个简单的转换器可能会生成看起来合法的 XML,同时悄悄地改变: - 将 `AND` 变为 `OR`; - 将分组的逻辑变为扁平化的 predicates; - 将排除项变为被忽略的过滤器; - 将字段语义变为猜测的名称; - 将一个 Sigma 检测变为范围过广的 Wazuh 警报。 **Wazuh Sigma Pipeline 旨在防止此类故障。** ### 转换器与编译器 | 基本转换器 | 本项目 | |---|---| | 重写语法 | 保留语义模型 | | 扁平化条件 | 构建显式的 boolean IR | | 猜测目标字段 | 使用版本化且由 fixture 支持的 mappings | | 输出一个看似合理的规则 | 规划精确的父子规则结构 | | 将 regex 编译成功视为成功 | 验证 XML 和原生 Wazuh 解析器 | | 隐藏不支持的规则 | 使用确定性的诊断信息拒绝它们 | | 追求高百分比 | 追求经得起推敲的检测 | ## 编译器架构 ``` flowchart LR A[Sigma YAML] --> B[pySigma parser] B --> C[Normalized condition tree] C --> D[Explicit boolean IR] D --> E[Semantic normalization] E --> E1[De Morgan normalization] E --> E2[DNF planning] E --> E3[Explosion limits] M[Fixture-backed field registry] --> F[Target lowering] P[Parent SID catalogue] --> F E --> F F --> G[Rule plan] G --> G1[Single-rule lowering] G --> G2[Exact child-rule lowering] G --> G3[Stable rule IDs] G --> H[Wazuh XML emission] H --> I[Structural validation] I --> J[Balanced chunks + manifest] J --> K[Native Wazuh validation] K --> L[Reports / deployment] CACH[Content-addressed cache] -. unchanged fragments .-> G AI[Optional OpenAI advisor] -. non-authoritative review .-> L CAL[Optional Caldera validation] -. controlled behavioral evidence .-> L ``` ### 编译流水线 ``` Sigma source │ ├─ parse and normalize with pySigma ├─ build boolean IR ├─ preserve AND / OR / NOT / grouping / selectors ├─ normalize grouped NOT with exact De Morgan transformations ├─ lower representable branches to Wazuh predicates ├─ generate deterministic child rules when one rule is insufficient ├─ resolve fixture-backed Wazuh fields and parent SIDs ├─ emit deterministic XML, chunks and reports └─ validate against Wazuh itself ``` ## 信任契约 编译器遵循五条不可协商的规则: 1. **绝不扁平化 boolean 逻辑。** 一条语法有效但语义不同的规则即为编译失败。 2. **绝不捏造 Windows 字段。** 严格模式要求有经过验证的 mapping,否则拒绝该规则。 3. **绝不隐藏不支持的行为。** 每次拒绝都会被分类和报告。 4. **绝不将解析器的接受与检测的正确性混为一谈。** 原生加载和行为触发是两道独立的关卡。 5. **绝不让可选系统成为权威。** AI 和 Caldera 集成无法取代确定性编译和 Wazuh 证据。 ## 语义降级 后端消费 pySigma 解析的条件树,并通过显式的 IR 对其进行降级。 | Sigma 构造 | 严格降级策略 | |---|---| | 跨不同字段的 AND | 多个 Wazuh 字段 predicates | | 同一字段上的 AND | 在可证明安全的情况下,使用独立的 PCRE2 lookaheads | | 同一字段上的 OR | PCRE2 alternation | | 跨不同字段集的 OR | 确定性的子规则分支 | | 分组/嵌套条件 | 精确的归一化和分支规划 | | 单个和分组的 NOT | predicate negation 加上精确的德·摩根归一化 | | `1 of` / `all of` selectors | 在 IR 降级之前由 pySigma 解析 | | IPv4 CIDR | 有界的 dotted-quad PCRE2 | | 超大的同字段 OR | 保持语义的子规则拆分 | | 无法表示的表达式 | 显式的故障安全拒绝 | ### 示例:为什么子规则很重要 类似这样的条件: ``` (process_image AND suspicious_argument) OR (parent_image AND network_destination) ``` 无法在一条 Wazuh 规则中扁平化为四个字段。那将要求所有四个 predicates 同时满足,并将 `OR` 变为了 `AND`。 相反,编译器会规划独立的分支,并输出为保留原始表达式所需的 Wazuh 规则结构。 ### 爆炸控制 正确的 DNF 展开在操作上仍然可能具有危险性。编译器对以下各项强制执行确定性限制: - DNF alternatives; - 每个 alternative 中的 predicates; - 生成的子规则; - 递归深度; - PCRE2 模式大小; - 总规则计划大小。 超过限制将拒绝整条 Sigma 规则。编译器绝不会输出不完整的解释。 ## 覆盖率演进历程 该项目刻意选择退一步,然后再向前进。 | 里程碑 | 严格覆盖率 | 发生了什么变化 | |---|---:|---| | 宽松基准 | **88.10%** | 输出量大,但语义审计暴露了不安全的降级 | | Boolean IR 基准 | **41.91%** | 对所有未经证明的条件形状执行故障安全关闭 | | 精确的子规则降级 | **66.50%** | 恢复了不同字段的 OR,而无需扁平化逻辑 | | 分组的 NOT + IPv4 CIDR | **79.15%** | 增加了德·摩根归一化和有界的 CIDR 降级 | | Fixture mappings + 安全的 OR 拆分 | **80.11%** | 恢复了经过验证的 mappings 和超大的 alternations | 41.91% 的结果并不是倒退。它是报告的数字变得值得信赖的关键点。 ## 当前的严格拒绝面 剩下的 478 条 Windows 规则被故意拒绝。 | 拒绝类别 | 规则数 | |---|---:| | 没有 fixture 支持的 mapping 的不受支持的 Windows 字段 | **216** | | DNF alternatives 超过配置限制 | **103** | | 生成的子规则超过配置限制 | **58** | | 未证明的 Null/existence 检查 | **58** | | 未证明的 IPv6 CIDR canonicalization | **16** | | `base64offset` | **7** | | 无字段的值表达式 | **7** | | 每个 DNF alternative 中的 predicates 超过限制 | **6** | | 没有安全支持组合的 `all` | **5** | | `fieldref` | **1** | | `ignorecase` | **1** | 这是一项功能,而不是隐藏的技术债务:不支持的语义保持可见,而不是变成微弱的检测。 ## 快速开始 需要 **Python 3.10–3.12**。 ``` git clone https://github.com/ahkecha/wazuh-sigma-pipeline.git cd wazuh-sigma-pipeline python -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -e ".[test]" python -m pytest ``` ### 编译并验证示例语料库 ``` sigma-convert \ --directory examples/sigma \ --output build/sigmahq/sigma_rules.xml \ --report build/conversion-report.json sigma-validate \ --rules build/sigmahq/sigma_rules.xml \ --output text sigma-validate \ --rules build/sigmahq/chunks \ --output text ``` 转换器输出: ``` build/sigmahq/ ├── sigma_rules.xml └── chunks/ ├── sigma_rules_001.xml ├── sigma_rules_002.xml ├── ... └── manifest.json ``` 已安装的命令: ``` sigma-convert sigma-validate sigma-deploy-wazuh sigma-pipeline sigma-windows-analysis ``` 在 PowerShell 上: ``` .\.venv\Scripts\Activate.ps1 ``` ## 操作 pipeline 由配置驱动的 CLI 将生命周期公开为显式的关卡: ``` sigma-pipeline doctor --config pipeline.yml sigma-pipeline convert --config pipeline.yml sigma-pipeline validate --config pipeline.yml sigma-pipeline smoke --config pipeline.yml ``` | 命令 | 职责 | |---|---| | `doctor` | 验证配置、路径、凭据、mappings 和阻碍就绪的因素 | | `convert` | 解析、降级并输出受管的 Wazuh 产物 | | `validate` | 验证现有的 XML 或 chunk 目录 | | `smoke` | 作为一个本地发布关卡运行转换和验证 | | `deploy` | 验证、备份、上传、重启、验证并回滚 | | `advise` | 生成可选的非权威质量调查结果 | | `active-test` | 运行受控的 Caldera 激励并查询 Wazuh 证据 | 相对路径从配置文件目录解析。未知的配置键会导致验证失败,而不是被静默忽略。 ### 最小配置 ``` sigma_dir: examples/sigma output_file: build/sigmahq/sigma_rules.xml conversion_report: build/conversion-report.json validation_report: build/validation-report.json strict_validation: true wazuh: rule_id_start: 900000 rule_id_end: 949999 windows_field_mapping_mode: strict host: https://wazuh.example.com:55000 remote_file: sigma_rules.xml insecure: false ca_bundle: /etc/ssl/certs/internal-ca.pem incremental_cache: enabled: false directory: build/conversion-cache manifest: build/conversion-cache/manifest.json strict: false advisor: enabled: false mode: report-only ``` 凭据和 API 密钥应放在环境变量中——而不是 `pipeline.yml` 中。 ## 由 Fixture 支持的 Windows Mapping Windows EventChannel 字段名是 decoder 的输出,而不是猜测。 ``` Sigma field │ ├─ logsource product / service / category ├─ event provider and channel context ├─ decoded Wazuh fixture evidence └─ mapping registry version ▼ win.system.* or win.eventdata.* ``` 严格模式会拒绝未知字段,而不是将其转换为看似合理的全小写名称。 ``` wazuh: windows_field_mapping_mode: strict ``` 最新恢复仅添加了以下内容的受范围限制且由 fixture 支持的 mappings: ``` Action AppName ApplicationPath ExceptionCode ModifyingApplication NewValue Service Workstation ``` 在以下位置阅读证据模型: - [Windows EVTX 字段 Mapping](docs/windows-evtx-field-mapping.md) - [Wazuh 父 SID Mapping](docs/wazuh-parent-rule-mapping.md) ## 验证阶梯 生成的规则将穿过逐步增强的关卡: ``` 1. Sigma parsing 2. Semantic IR construction 3. Fail-closed lowering checks 4. PCRE2 construction and limits 5. XML structural validation 6. Rule ID and parent SID validation 7. Balanced chunk validation 8. Native wazuh-analysisd -t 9. Behavioral event-to-alert validation ``` 提交的基准已针对当前生成的语料库通过了第 1-8 层。第 9 层仍然是独立的操作证明要求。 ### 原生 Wazuh 验证 ``` python -m pip install -e ".[test]" docker compose up -d docker cp wazuh-rule-test:/var/ossec/ruleset/rules build/wazuh-builtin-rules python scripts/normalize_wazuh_rules.py build/sigmahq \ --target-rules-dir build/wazuh-builtin-rules docker compose up -d --force-recreate docker compose exec -T wazuh.manager \ /var/ossec/bin/wazuh-analysisd -t ``` 一次成功的原生解析器运行必须以状态码 `0` 退出,且没有解析器错误。 ## 安全部署 ``` sigma-pipeline deploy \ --config pipeline.yml \ --preflight-smoke \ --backup-remote \ --rollback-on-failure \ --restart ``` 部署保护措施包括: - 认证前的本地验证; - TLS 验证和可选的自定义 CA 捆绑包; - 受管远程文件名; - 远程备份; - 重启验证; - 规则可见性检查; - 失败时回滚; - 针对现有 Wazuh 规则 ID 的冲突检查。 `--insecure` 仅适用于隔离的开发环境。 ## 确定性的增量构建 大型语料库可以重用未更改的编译片段,同时保留稳定的 Wazuh ID。 ``` incremental_cache: enabled: true directory: build/conversion-cache manifest: build/conversion-cache/manifest.json strict: false ``` 缓存是一种优化,绝不是信任边界。在发布或部署之前,始终会重新组装并验证完整的规则集。 请参阅 [增量缓存设计](docs/INCREMENTAL_CACHE.md)。 ## 刻意置于信任核心之外的可选系统 ### OpenAI advisor advisor 可以审查严重程度和检测质量,但它无权绕过编译器或验证失败。 ``` python -m pip install -e ".[advisor]" export OPENAI_API_KEY="..." sigma-pipeline advise --config pipeline.yml ``` 控制措施包括结构化响应、消毒处理、有界重试、确定性接受策略、默认仅报告以及内容寻址缓存。 请参阅 [Advisor 文档](docs/ADVISOR.md)。 ### Caldera 主动验证 主动测试工作流可以在实验室中部署受控激励,并验证 Wazuh 证据。 ``` sigma-pipeline active-test \ --config pipeline.yml \ --preflight-smoke \ --deploy \ --restart ``` Caldera 在已注册的 agent 上执行命令。此工作流属于隔离的测试环境,被刻意排除在普通 CI 之外。 ## 仓库结构图 ``` src/wazuh_sigma/ ├── backend/ boolean IR, semantic lowering and XML emission ├── converter/ Sigma loading, normalization, reporting and CLI ├── fields/ fixture-backed field registry ├── validator/ structural and native validation helpers ├── incremental/ stable IDs and content-addressed fragment reuse ├── deploy/ Wazuh API deployment, backup and rollback ├── advisor/ optional OpenAI review layer ├── active_testing/ optional Caldera-backed behavioral validation ├── config.py strict pipeline configuration ├── naming.py canonical Sigma/Wazuh naming └── pipeline.py lifecycle orchestration evidence/ committed reproducibility baselines examples/sigma/ small runnable Sigma corpus tests/ maintained unit and integration tests docs/ design, operations and support documentation scripts/ normalization and operational utilities build/ generated artifacts; ignored by Git ``` ## 文档 | 文档 | 目的 | |---|---| | [架构](docs/ARCHITECTURE.md) | 组件、边界、信任模型和 runtime 流程 | | [Pipeline](docs/PIPELINE.md) | 阶段、报告、CI 合同和扩展点 | | [Runbook](docs/RUNBOOK.md) | 操作、恢复、回滚和故障排除 | | [项目结构](docs/PROJECT_STRUCTURE.md) | 模块所有权和仓库布局 | | [转换覆盖率](docs/CONVERSION_COVERAGE.md) | 语料库方法论、基准和发布关卡 | | [支持矩阵](docs/SUPPORT_MATRIX.md) | 支持的版本、语义和就绪边界 | | [Windows EVTX Mapping](docs/windows-evtx-field-mapping.md) | Mapping 证据和贡献者工作流 | | [父 SID Mapping](docs/wazuh-parent-rule-mapping.md) | 父规则锚定和 target-version 说明 | | [增量缓存](docs/INCREMENTAL_CACHE.md) | 指纹、稳定 ID、失效和恢复 | | [Advisor](docs/ADVISOR.md) | Provider、策略、消毒处理和操作模式 | ## 已知边界 本项目处于 **Beta** 阶段,不声称具有普遍的 Sigma 兼容性。 当前的边界包括: - 以 Windows 为先的由 fixture 支持 mapping 覆盖率; - 严格拒绝不受支持或未经验证的字段; - 在 decoder 文本 canonicalization 得到证明之前,拒绝 IPv6 CIDR; - 不支持的 null 检查、`base64offset` 和 `fieldref` 语义; - 故意的 DNF 和子规则爆炸限制; - 特定于 Wazuh 版本的父 SID 和已解码的字段行为; - 将行为级别的事件到警报的验证作为单独的发布关卡。 对于不支持的规则,正确的响应应是给出精确的诊断——而不是产生一个较弱的检测。 ## 贡献 高价值的贡献包括: - 经过消毒处理的 Wazuh 解码事件 fixtures; - 带有出处的已验证字段 mappings; - Sigma 语义边界情况和差分测试; - Wazuh 版本兼容性证据; - 减少子规则数量的安全规则计划优化; - 由真实 decoder fixtures 支持的 Linux 和 macOS 遥测配置文件; - 行为级别的 `wazuh-logtest` 或同等的事件到警报测试。 每一个语义更改都应包含正面、部分和负面的情况。每一个被描述为已验证的 mapping 都应包含证据。 ## 许可证 管理本仓库的许可证是 [PolyForm Noncommercial License 1.0.0](LICENSE.md)。
### 检测工程值得拥有编译器级别的严谨性。 **拒绝虚构。交付你能证明的规则。**
标签:PB级数据处理, Python, Wazuh, 安全运维, 无后门, 规则编译器, 逆向工具