mattcaballero11/detection-as-code-lab
GitHub: mattcaballero11/detection-as-code-lab
一个基于「检测即代码」理念的安全检测工程实验室,将10条Sigma规则转换为多SIEM查询语言并通过合成数据验证。
Stars: 0 | Forks: 0
# Detection-as-Code 实验室
### 多 SIEM 检测工程 — Sigma → KQL & SPL,映射至 MITRE ATT&CK






## 为什么构建此项目
在我的日常工作中,我为不可公开的客户项目构建和迁移跨 Microsoft Sentinel、Splunk 和 CrowdStrike 的检测内容。这个仓库在我**自己的实验室中从零开始**复现了该能力,因此从编写规则到验证的完整工作流程都是透明且可验证的,不包含任何机密数据。
设计原则是 **detection-as-code**(检测即代码):将检测视为软件。一个与供应商无关的 Sigma 规则是唯一的单一事实来源,下游的所有内容(KQL、SPL、测试、ATT&CK 覆盖率)均由此派生,并且整个过程通过 Git 进行版本控制。这就是现代检测团队保持内容一致性、跨 SIEM 可移植以及可测试的方式。
## 本项目展示的内容
- **Detection-as-code 工作流** — 将 Sigma 作为受版本控制的单一事实来源
- **多 SIEM 转换** — 同一检测在 Sentinel **KQL** 和 Splunk **SPL** 中的实现
- **MITRE ATT&CK 映射** — 每个规则都标记有对应技术,并包含 Navigator 覆盖率层
- **合成数据验证** — 使用查询内数据测试检测,**无需真实日志**
- **Schema 标准化** — 跨 Sigma / KQL / Splunk 数据模型的精细字段映射
- **赋能分析师** — 为每个检测提供分类/响应 playbook
**主题:** `detection-engineering` · `sigma` · `kql` · `spl` · `mitre-attack` · `siem` · `threat-detection` · `detection-as-code`
## 检测覆盖率
| # | 检测规则 | ATT&CK | 战术 | Sigma | KQL | SPL | 状态 |
| :-: | :--- | :--- | :--- | :-: | :-: | :-: | :--- |
| 1 | 可疑的 PowerShell 编码命令 | T1059.001 | 执行 | ✅ | ✅ | ✅ | 实验性 |
| 2 | PowerShell 下载 Cradle | T1059.001, T1105 | 执行 / C2 | ✅ | ✅ | ✅ | 实验性 |
| 3 | LSASS 内存转储尝试 | T1003.001 | 凭据访问 | ✅ | ✅ | ✅ | 实验性 |
| 4 | 注册表 Run Key 持久化 | T1547.001 | 持久化 | ✅ | ✅ | ✅ | 实验性 |
| 5 | 可疑的计划任务创建 | T1053.005 | 执行 / 持久化 | ✅ | ✅ | ✅ | 实验性 |
| 6 | 通过 CLI 禁用 Windows Defender | T1562.001 | 防御规避 | ✅ | ✅ | ✅ | 实验性 |
| 7 | 可疑的 Rundll32 执行 | T1218.011 | 防御规避 | ✅ | ✅ | ✅ | 实验性 |
| 8 | WMI 进程执行 | T1047 | 执行 | ✅ | ✅ | ✅ | 实验性 |
| 9 | SMB 管理 Share 访问 | T1021.002 | 横向移动 | ✅ | ✅ | ✅ | 实验性 |
| 10 | Azure AD 风险登录 / 不可能旅行 | T1078 | 初始访问 / 有效账户 | ✅ | ✅ | ✅ | 实验性 |
## 组织结构
```
detection-as-code-lab/
├── rules/sigma/ # canonical vendor-neutral detections (source of truth)
├── translations/
│ ├── kql/ # hand-reviewed Microsoft Sentinel KQL
│ ├── spl/ # hand-reviewed Splunk SPL
│ └── kql_lab_tests/ # synthetic datatable() validation queries
├── navigator/ # MITRE ATT&CK Navigator coverage layer (JSON)
├── response-playbooks/ # analyst triage / response runbook per detection
├── docs/ # methodology, field mapping, rule standard, testing notes
├── screenshots/ # evidence
└── evidence/ # saved sigma-cli conversion output
```

## 操作演示
同一个六步 pipeline 生成了库中的每个检测。这里以 **PowerShell 编码命令**检测为例,进行端到端的演示。
### 步骤 1 — 用 Sigma 编写检测
每个检测最初都是一个 [Sigma](https://github.com/SigmaHQ/sigma) 规则:与供应商无关的 YAML 文件,独立于任何 SIEM 描述一次逻辑。首先用 Sigma 编写,可以强制在陷入特定查询语言的细节之前,明确检测的*意图*。每个规则都遵循[规则标准](docs/rule-standard.md) — 标题、稳定的 `id`、描述、ATT&CK `tags`、`logsource`、检测逻辑、记录在案的误报以及严重程度。
示例规则检测使用编码命令标志(`-enc`、`-encodedcommand`、`-e`、`/enc`)启动的 PowerShell,这是混淆恶意 payload 的常见方法 — 映射至 **T1059.001**。

使用的工具链是 [Sigma CLI](https://github.com/SigmaHQ/sigma-cli),它安装在 Python 虚拟环境中,并包含 KQL 和 Splunk 后端。

### 步骤 2 — 使用 Sigma CLI 转换为 KQL 和 SPL
安装好后端,一个 Sigma 规则即可转换为多种 SIEM 查询语言 — 这证明了该检测是**可移植的**:
```
# Microsoft Sentinel / XDR (KQL)
sigma convert -t kusto -p microsoft_xdr \
rules/sigma/windows/process_creation/proc_powershell_encoded_command.yml
# Splunk (SPL)
sigma convert -t splunk -p splunk_windows \
rules/sigma/windows/process_creation/proc_powershell_encoded_command.yml
```

**从这一步得到的真实教训:** Splunk 后端需要一个与目标 logsource 模型匹配的**处理 pipeline**。如果没有它,转换就会报错,并且 `-p sysmon` 会失败,因为这不是已安装 pipeline 的名称 — 实际可用的 pipeline 是 `splunk_windows`。这不是规则的失败;这是将检测逻辑与目标 schema 对齐的实际现实,这正是区分“运行了转换器”和“理解了 SIEM 数据模型”的关键所在。
### 步骤 3 — 人工复核翻译结果
自动转换证明了可移植性;**人工复核证明了工程判断力。** [`translations/`](translations/) 中优化后的查询改进了原始输出,包括针对每个平台数据模型的精细字段选择、预期的分析师分类字段(主机、用户、父进程、命令行),以及切合实际的数据源假设。跨 Sigma、KQL 和 Splunk 的完整字段映射参考位于 [`docs/field-mapping.md`](docs/field-mapping.md)。
### 步骤 4 — 使用合成遥测数据进行验证
检测在**无需任何真实日志**的情况下进行测试,使用的是在查询内部构建虚假但逼真事件的 KQL `datatable()` 代码块。每个测试都包含一个应匹配的**恶意**行和一个应被过滤掉的**良性控制**行,从而证明其逻辑具备*区分能力*,而不仅仅是返回行数。测试在 **Azure Log Analytics → Logs** 中运行;由于数据是在查询内生成的,工作区的时间范围无关紧要,且不需要任何连接器、agent 或数据摄取。
展示了在四种不同战术下验证的四个检测:
| PowerShell 编码命令 (执行) | LSASS 转储尝试 (凭据访问) |
| :---: | :---: |
|  |  |
| **注册表 Run Key (持久化)** | **Azure AD 风险登录 (初始访问)** |
|  |  |
所有十个测试的预期结果计数记录在 [`docs/testing-notes.md`](docs/testing-notes.md) 中。
### 步骤 5 — 在 ATT&CK Navigator 中映射并可视化覆盖率
每个规则都标记了其 ATT&CK 技术,并且 [`navigator/detection_coverage_layer.json`](navigator/detection_coverage_layer.json) 在 [ATT&CK Navigator](https://mitre-attack.github.io/attack-navigator/) 中将这些技术呈现为覆盖率层。分数和评论将着色与特定的检测联系起来,因此该地图反映的是真实的覆盖率,而不是仅作为装饰。

该库涵盖了**跨 6 种战术的 10 项技术** — 执行、凭据访问、持久化、防御规避、横向移动和初始访问:
`T1059.001` · `T1105` · `T1003.001` · `T1547.001` · `T1053.005` · `T1562.001` · `T1218.011` · `T1047` · `T1021.002` · `T1078`
深入查看某项技术,会发现覆盖率是由检测支撑的,而不仅仅是填充了颜色:

### 步骤 6 — 记录分析师响应
检测只是工作的一半 — 分析师必须对警报采取行动。每个规则在 [`response-playbooks/`](response-playbooks/) 中都有一个匹配的 runbook,涵盖检测意图、分类步骤、富化字段、误报、升级标准和封堵操作 — 这与支撑 SOAR playbook 的思路相同。例如,请参阅 [PowerShell 编码命令 playbook](response-playbooks/powershell_encoded_command.md)。
## 自行重现
这里的一切都可以使用免费工具和 Log Analytics 工作区重现。
**1. 设置 Sigma 工具链**
```
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
sigma plugin list -t backend # confirm kusto + splunk backends
```
**2. 将规则转换为 KQL 和 SPL**(参见上面的步骤 2)。请记住 Splunk pipeline:使用 `-p splunk_windows`。
**3. 在没有真实数据的情况下验证检测。** 在 **Azure Log Analytics → Logs** 中打开 [`translations/kql_lab_tests/`](translations/kql_lab_tests/) 中的任意文件并运行。`datatable()` 代码块会在查询内部生成事件,因此时间范围无关紧要。将返回的行与 [`docs/testing-notes.md`](docs/testing-notes.md) 中的预期计数进行比较。
**4. 探索覆盖率。** 将 [`navigator/detection_coverage_layer.json`](navigator/detection_coverage_layer.json) 导入到 [ATT&CK Navigator](https://mitre-attack.github.io/attack-navigator/) 中。
## 文档
| 文档 | 内容 |
| :--- | :--- |
| [`docs/methodology.md`](docs/methodology.md) | 完整的编写 → 转换 → 验证 → 覆盖率工作流及设计决策 |
| [`docs/field-mapping.md`](docs/field-mapping.md) | 跨 Sigma / KQL / Splunk 字段模型的 Schema 标准化 |
| [`docs/rule-standard.md`](docs/rule-standard.md) | 每个规则必须满足的元数据和质量标准 |
| [`docs/testing-notes.md`](docs/testing-notes.md) | 合成测试方法及每个规则的预期结果计数 |
## 路线图 — 第 2 部分
- 实时遥测:将 Windows + **Sysmon** 的日志发送至 **Microsoft Sentinel**
- 从这些检测部署 **Sentinel 分析规则**,针对 **Atomic Red Team** 测试触发
- 通过 **Logic Apps** 进行 **SOAR** 富化/响应
- **Splunk** 运行时验证(Splunk Free,本地,合成事件)
## 关于
由 **Matthew Caballero** 构建 — 专注于检测工程和攻击性安全的网络安全顾问(PNPT;正在准备 CPTS & BSCP)。
🔗 [LinkedIn](https://www.linkedin.com/in/matthewgcaballero) · [验证证书](https://www.credly.com/users/matthew-caballero.9d29c5b1)
标签:Microsoft Sentinel, 代码化检测, 逆向工具