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 ![Sigma](https://img.shields.io/badge/Sigma-Detection_as_Code-1f6feb?style=flat) ![KQL](https://img.shields.io/badge/KQL-Microsoft_Sentinel-0078D4?style=flat&logo=microsoftazure&logoColor=white) ![Splunk SPL](https://img.shields.io/badge/SPL-Splunk-000000?style=flat&logo=splunk&logoColor=white) ![MITRE ATT&CK](https://img.shields.io/badge/MITRE_ATT%26CK-Mapped-C7002E?style=flat) ![Detections](https://img.shields.io/badge/Detections-10-2ea44f?style=flat) ![License](https://img.shields.io/badge/License-MIT-lightgrey?style=flat) ## 为什么构建此项目 在我的日常工作中,我为不可公开的客户项目构建和迁移跨 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 ``` ![仓库结构](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/01_repo_structure.png) ## 操作演示 同一个六步 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 规则示例](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/03_sigma_rule_example.png) 使用的工具链是 [Sigma CLI](https://github.com/SigmaHQ/sigma-cli),它安装在 Python 虚拟环境中,并包含 KQL 和 Splunk 后端。 ![Sigma 工具已安装](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/02_sigma_tooling_installed.png) ### 步骤 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 ``` ![Sigma 转换输出](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/04_sigma_conversion_output.png) **从这一步得到的真实教训:** 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 转储尝试 (凭据访问) | | :---: | :---: | | ![PowerShell KQL 测试](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/05_test1.png) | ![LSASS KQL 测试](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/06_kql_lsass_hit.png) | | **注册表 Run Key (持久化)** | **Azure AD 风险登录 (初始访问)** | | ![注册表 KQL 测试](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/07_kql_registry_hit.png) | ![Azure AD KQL 测试](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/08_kql_azuread_hit.png) | 所有十个测试的预期结果计数记录在 [`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/) 中将这些技术呈现为覆盖率层。分数和评论将着色与特定的检测联系起来,因此该地图反映的是真实的覆盖率,而不是仅作为装饰。 ![ATT&CK Navigator 覆盖率](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/10_attack_navigator_coverage_full_matrix.png) 该库涵盖了**跨 6 种战术的 10 项技术** — 执行、凭据访问、持久化、防御规避、横向移动和初始访问: `T1059.001` · `T1105` · `T1003.001` · `T1547.001` · `T1053.005` · `T1562.001` · `T1218.011` · `T1047` · `T1021.002` · `T1078` 深入查看某项技术,会发现覆盖率是由检测支撑的,而不仅仅是填充了颜色: ![PowerShell 技术详情](https://raw.githubusercontent.com/mattcaballero11/detection-as-code-lab/main/screenshots/11_attack_navigator_powershell_detail.png) ### 步骤 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, 代码化检测, 逆向工具