scythe-io/sigma-regression-testing
GitHub: scythe-io/sigma-regression-testing
这是一个集成了规则验证、Splunk 转换及 Atomic Red Team 测试的 Sigma 规则自动化检测工程流水线。
Stars: 1 | Forks: 0
# Sigma 回归测试
一个用于开发、验证、部署和**回归测试** Sigma 规则的检测工程管道。本项目包含针对 Windows、Linux 和 Microsoft 365 环境的精选检测规则集合,以及用于将规则转换为 Splunk 格式、通过 REST API 部署并使用 Atomic Red Team 测试验证检测的自动化工具。
## 快速开始
```
git clone https://github.com/scythe-io/sigma-regression-testing.git
cd sigma-regression-testing
pip install -r requirements.txt
```
## 概览
| 指标 | 数量 |
|--------|-------|
| **总规则数** | 71 |
| **Windows 规则** | 38 |
| **Linux 规则** | 17 |
| **M365/Cloud 规则** | 7 |
### 规则分类
| 类别 | 描述 | 数量 |
|----------|-------------|-------|
| `proc_creation` | 进程创建事件 | 43 |
| `file_event` | 文件系统活动 | 6 |
| `m365_*` | Microsoft 365 审计日志 | 5 |
| `registry_set` | 注册表修改 | 4 |
| `net_connection` | 网络连接 | 3 |
| `azure_network` | Azure 网络防火墙变更 | 2 |
| `web_sharepoint` | SharePoint Web 活动 | 2 |
| `azure_firewall` | Azure 防火墙修改 | 1 |
| `azure_application` | Azure 应用安全变更 | 1 |
| `file_creation` | 文件创建事件 | 1 |
| `dns_query` | DNS 查询异常 | 1 |
| `wmi_event` | WMI 事件订阅监控 | 1 |
| `reg_set` | 注册表修改 | 1 |
## 规则设计理念
这些规则基于以下原则设计:
1. **低误报率** - 针对包管理器、配置管理工具和合法管理员活动进行过滤
2. **关注行为** - 检测技术,而不仅仅是 IOC(无硬编码哈希或 IP)
3. **生产就绪** - 所有规则均通过 `sigma check` 验证
4. **映射 MITRE ATT&CK** - 标记相关技术 ID
## 快速入门
### 安装依赖
```
# 安装所有依赖
pip install -r requirements.txt
# 或手动安装
pip install sigma-cli pysigma pysigma-backend-splunk pysigma-pipeline-windows PyYAML requests pywinrm
# 可选:为 regression-test.py 启用 tab 补全
pip install argcomplete
. ./scripts/Enable-TabCompletion.ps1 # PowerShell
```
### 验证规则
```
# requirements.txt 中包含 sigma-cli
# 验证所有规则
sigma check sigma_rules/*.yml
```
### 转换为 SIEM 格式
```
# 转换为 Splunk
sigma convert -t splunk sigma_rules/*.yml
# 转换为 Elastic
sigma convert -t elasticsearch sigma_rules/*.yml
# 转换为 Microsoft Sentinel
sigma convert -t microsoft365defender sigma_rules/*.yml
```
## 仓库结构
```
.
├── sigma_rules/ # QA-validated detection rules (43 Windows + Linux + M365)
│ ├── proc_creation_*.yml # Process creation rules
│ ├── file_event_*.yml # File event rules
│ ├── reg_set_*.yml # Registry rules
│ ├── net_connection_*.yml # Network rules
│ ├── m365_*.yml # Microsoft 365 rules
│ └── unmapped_rules/ # Rules without ART test mappings (not yet QA-validated)
├── scripts/
│ ├── update-readme-stats.py # Auto-update README statistics
│ ├── convert-to-splunk.py # Convert rules to Splunk format
│ ├── deploy-to-splunk.ps1 # Deploy saved searches to Splunk
│ ├── regression-test.py # Atomic Red Team regression testing (CLI)
│ └── regression-test-gui.py # GUI wrapper for regression-test.py
├── tests/
│ └── art_mapping.yaml # Atomic Red Team test to rule mappings
├── splunk_output/ # Generated Splunk artifacts (auto-updated)
│ ├── savedsearches.conf # Splunk saved searches (auto-generated)
│ └── conversion_report.json # Conversion statistics
├── wip/ # Work in progress (not production ready)
│ ├── aurora/ # Aurora EDR integration (coming soon)
│ └── scythe/ # SCYTHE integration (coming soon)
└── .github/workflows/
├── sigma-validate.yml # CI validation workflow
├── splunk-pipeline.yml # Splunk detection pipeline
└── deploy-rules.yml # Deployment workflow (WIP)
```
## CI/CD 管道
此仓库包含用于自动化验证和部署的 GitHub Actions 工作流。
### 验证工作流 (`sigma-validate.yml`)
在每次代码变更时自动验证规则。**当 `main` 分支上的验证通过时,它会自动触发 Splunk 检测管道。**
**触发条件:**
- 推送到 `main` 分支(当 `sigma_rules/**` 发生变更时)
- 针对 `main` 分支的 Pull Request
- 手动触发
**管道:**
```
┌─────────────────────────────────────────────────────────────┐
│ VALIDATE JOB (runs on every PR and push) │
├─────────────────────────────────────────────────────────────┤
│ 1. Checkout code │
│ 2. Install Python 3.11 + sigma-cli │
│ 3. Run: sigma check sigma_rules/*.yml │
│ 4. If errors found → FAIL (blocks PR merge) │
│ 5. If clean → PASS and display rule count │
└─────────────────────────────────────────────────────────────┘
│ │
▼ (only on merge) ▼ (only on merge)
┌──────────────────┐ ┌──────────────────────────────────────┐
│ RELEASE JOB │ │ UPDATE README JOB │
├──────────────────┤ ├──────────────────────────────────────┤
│ Package .yml │ │ Run update-readme-stats.py │
│ rules as │ │ Auto-commit updated rule counts │
│ artifact │ │ to README.md │
└──────────────────┘ └──────────────────────────────────────┘
│
│ on completion with conclusion == 'success'
▼
┌─────────────────────────────────────────────────────────────┐
│ SPLUNK DETECTION PIPELINE (auto-triggered) │
│ see below ↓ │
└─────────────────────────────────────────────────────────────┘
```
### 部署工作流 (`deploy-rules.yml`) - WIP
用于将经验证的规则部署到端点的模板。支持 Azure Blob、AWS S3 和 SSH 部署选项。
## Splunk 检测管道
一个完整的检测工程管道,用于将 Sigma 规则部署到 Splunk 并使用 [Atomic Red Team](https://atomicredteam.io/) 测试进行验证。
**触发条件:** 在 `main` 分支上 `Sigma Rules Validation` 成功后自动运行。也可以通过可选的 deploy/regression 标志手动触发。
### 管道概览
```
┌──────────────────────────────────┐
│ Sigma Rules Validation (pass) │
└────────────────┬─────────────────┘
│ workflow_run trigger
▼
┌─────────────────────────────────────────────────────────────┐
│ CONVERT JOB │
├─────────────────────────────────────────────────────────────┤
│ 1. Convert Windows rules to Splunk savedsearches.conf │
│ 2. Generate conversion report │
│ 3. Commit savedsearches.conf back to repository │
│ 4. Upload artifacts │
└─────────────────────────────────────────────────────────────┘
│
▼ (on workflow_run or manual deploy)
┌─────────────────────────────────────────────────────────────┐
│ DEPLOY JOB (requires secrets configured) │
├─────────────────────────────────────────────────────────────┤
│ 1. Download converted artifacts │
│ 2. Deploy saved searches to Splunk via REST API │
│ 3. Configure alerts (optional) │
└─────────────────────────────────────────────────────────────┘
│
▼ (manual trigger only)
┌─────────────────────────────────────────────────────────────┐
│ REGRESSION TEST JOB │
├─────────────────────────────────────────────────────────────┤
│ 1. Execute Atomic Red Team tests on target endpoint │
│ 2. Query Splunk for triggered rules │
│ 3. Report coverage and failures │
└─────────────────────────────────────────────────────────────┘
```
### 本地使用
**将规则转换为 Splunk 格式:**
```
# 安装依赖
pip install sigma-cli pysigma pysigma-backend-splunk pysigma-pipeline-windows PyYAML
# 列出兼容规则
python scripts/convert-to-splunk.py --list-compatible
# 转换所有规则
python scripts/convert-to-splunk.py -i sigma_rules -o splunk_output
```
**部署到 Splunk:**
```
# 部署保存的搜索(交互式)
.\scripts\deploy-to-splunk.ps1 -SplunkHost splunk.company.com -Username admin
# 部署并启用警报
.\scripts\deploy-to-splunk.ps1 -SplunkHost splunk.company.com -Username admin -EnableAlerts -AlertEmail soc@company.com
# 试运行(验证而不部署)
.\scripts\deploy-to-splunk.ps1 -SplunkHost splunk.company.com -Username admin -DryRun
```
**使用 Atomic Red Team 运行回归测试:**
```
# 试运行(显示测试用例而不执行)
python scripts/regression-test.py --splunk-host splunk.company.com --dry-run --test-config tests/art_mapping.yaml
# 通过 WinRM 在远程目标上运行测试(顺序模式)
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--splunk-user admin \
--target 192.168.1.100 \
--winrm-user "DOMAIN\Administrator" \
--winrm-pass "password" \
--test-config tests/art_mapping.yaml \
--wait-time 60 \
--skip-atomic-check
# 批处理模式(更快 - 先运行所有测试,然后检查规则)
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--splunk-user admin \
--target 192.168.1.100 \
--winrm-user "DOMAIN\Administrator" \
--winrm-pass "password" \
--test-config tests/art_mapping.yaml \
--wait-time 600 \
--lookback-window 60 \
--skip-atomic-check \
--batch
# 并行模式(最快 - 并发运行 5 个测试,意味着 --batch)
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--splunk-user admin \
--target 192.168.1.100 \
--winrm-user "DOMAIN\Administrator" \
--winrm-pass "password" \
--test-config tests/art_mapping.yaml \
--wait-time 600 \
--lookback-window 60 \
--skip-atomic-check \
--parallel
```
**GUI 模式:**
还提供了一个图形界面,用于配置和运行测试,无需手动构建 CLI 命令:
```
python scripts/regression-test-gui.py
```
GUI 提供了四个选项卡(Splunk、目标、测试设置、过滤器)、一个实时的彩色编码输出面板、一个用于验证 Splunk 凭据的**测试连接**按钮,以及运行完成后打开 HTML 结果的提示。设置会自动保存到 `.gui_config.json`。
**测试输出:**
回归测试脚本会生成两个输出文件:
- `test_results.json` - 包含通过/失败状态、查询和计时的机器可读结果
- `test_results.html` - 带有过滤和可视摘要的交互式 HTML 报告
HTML 报告包括:
- 显示总测试数、通过数、失败数、通过率和未测试规则数的摘要卡片
- 用于快速查看通过/失败概览的可视化进度条
- 可按状态(全部/通过/失败)和搜索文本过滤的表格
- 每个测试的详细信息,包括预期规则、触发规则和缺失规则
- 每个预期规则的**可点击 Splunk 链接**,可直接在 Splunk 中打开保存的搜索(带最近 15 分钟的时间范围)
- **未测试规则部分**,显示哪些规则未被测试以及原因:
- 无测试映射(规则存在但未映射 Atomic 测试)
- 非 Windows/跳过(Linux、M365 或其他非 Windows 规则)
- 转换失败(Splunk 转换失败的规则)
- 测试错误(执行过程中遇到错误的测试)
**其他选项:**
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `--wait-time` | 60 | 测试后查询 Splunk 前等待的秒数 |
| `--lookback-window` | (自动) | 查询时在 Splunk 中回溯的分钟数;如果省略,则根据批次开始时间自动计算 |
| `--batch` | false | 先运行所有原子测试,然后检查规则(更快) |
| `--parallel` | false | 通过 WinRM 并发运行 5 个原子测试(隐含 --batch) |
| `--splunk-web-port` | 8000 | Splunk Web UI 端口(用于 HTML 报告链接) |
| `--splunk-app` | search | 保存搜索的 Splunk 应用上下文 |
| `--test-id` | (全部) | 按原子测试 GUID 过滤(可指定多个) |
| `--technique` | (全部) | 按 MITRE ATT&CK 技术 ID 过滤,例如 T1018(可指定多个) |
| `--expected-rule` | (全部) | 按预期规则名称过滤 - 部分匹配(可指定多个) |
| `--list` | false | 列出测试而不是运行它们(适用于过滤器) |
| `--fields` | name,technique,guid,rules | 与 --list 一起显示的字段(可指定多个) |
| `--format` | table | --list 的输出格式:table 或 csv |
| `--prompt-inputs` | false | 交互式提示输入参数 |
| `--inputs-file` | (无) | 从 YAML 文件加载输入参数 |
| `--use-defaults` | false | 忽略自定义输入,使用 ART 默认值 |
| `--conversion-report` | splunk_output/conversion_report.json | Sigma 转换报告的路径(用于跟踪未测试规则) |
| `--savedsearches` | splunk_output/savedsearches.conf | Splunk savedsearches.conf 的路径(用于跟踪未测试规则) |
| `--skip-untested-report` | false | 跳过生成未测试规则部分 |
**列出可用测试:**
```
# 列出配置中的所有测试
python scripts/regression-test.py --list --test-config tests/art_mapping.yaml
# 列出特定技术的测试
python scripts/regression-test.py --list --technique T1018 --test-config tests/art_mapping.yaml
# 列出具有特定字段的测试
python scripts/regression-test.py --list --fields name --fields technique --fields description --test-config tests/art_mapping.yaml
# 导出为 CSV
python scripts/regression-test.py --list --format csv --test-config tests/art_mapping.yaml > tests.csv
```
可用字段:`name`、`technique`、`guid`、`rules`、`description`、`cleanup`、`inputs`
**运行特定测试:**
```
# 通过 GUID 运行单个测试
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--test-id f1bf6c8f-9016-4edf-aff9-80b65f5d711f \
--dry-run
# 为特定规则运行测试(部分匹配)
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--expected-rule "Domain Discovery" \
--dry-run
# 为特定 MITRE 技术运行测试
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--technique T1018 \
--dry-run
# 运行多个特定测试
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--test-id f1bf6c8f-9016-4edf-aff9-80b65f5d711f \
--test-id 80887bec-5a9b-4efc-a81d-f83eb2eb32ab \
--skip-atomic-check
```
**自定义输入参数:**
```
# 交互式提示输入
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--test-id bc8be0ac-475c-4fbf-9b1d-9fffd77afbde \
--prompt-inputs \
--skip-atomic-check
# 从文件加载输入
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--inputs-file tests/inputs.yaml \
--skip-atomic-check
# 使用 ART 默认值(忽略测试配置中的自定义输入)
python scripts/regression-test.py \
--splunk-host splunk.company.com \
--test-config tests/art_mapping.yaml \
--use-defaults \
--skip-atomic-check
```
**输入文件格式 (`tests/inputs.yaml`):**
```
# 按 atomic GUID
bc8be0ac-475c-4fbf-9b1d-9fffd77afbde:
username: "CustomUser"
# 或按测试名称
"Create Local User Account (PowerShell)":
username: "AnotherUser"
```
### 安装 Atomic Red Team
在测试端点上,将 Atomic Red Team 安装到系统范围的位置(WinRM 访问所必需):
```
# 将 Invoke-AtomicRedTeam 模块安装到 C:\AtomicRedTeam
Set-ExecutionPolicy Bypass -Scope Process -Force
IEX (IWR 'https://raw.githubusercontent.com/redcanaryco/invoke-atomicredteam/master/install-atomicredteam.ps1' -UseBasicParsing)
Install-AtomicRedTeam -getAtomics -Force -InstallPath "C:\AtomicRedTeam"
# 验证安装
Import-Module "C:\AtomicRedTeam\invoke-atomicredteam\Invoke-AtomicRedTeam.psd1" -Force
Get-Command Invoke-AtomicTest
```
### GitHub Actions 设置
**转换是完全自动化的** — 将更改推送到 `sigma_rules/`,运行验证,如果通过,Splunk 管道会自动触发以重新生成并提交 `savedsearches.conf`。无需手动步骤。
若要启用自动**部署**到实时 Splunk 实例,请在仓库中配置这些密钥:
| 密钥 | 描述 |
|--------|-------------|
| `SPLUNK_HOST` | Splunk 服务器主机名 |
| `SPLUNK_PORT` | 管理端口(默认:8089) |
| `SPLUNK_USER` | Splunk 管理员用户名 |
| `SPLUNK_PASSWORD` | Splunk 管理员密码 |
| `SPLUNK_APP` | 目标应用(默认:search) |
### 测试映射配置
在 `tests/art_mapping.yaml` 中定义测试用例,以将 Atomic Red Team 测试映射到预期的 Sigma 规则:
```
tests:
- name: "Clear Security Event Log"
description: "Validates detection of log clearing via wevtutil"
technique_id: "T1070.001"
atomic_test_guid: "e6abb60e-26b8-41da-8aae-0c35174b0967"
expected_rules:
- "Windows Event Log Manipulation" # Must match Splunk saved search name exactly
cleanup: false
- name: "Create Local User Account"
description: "Creates a new local user"
technique_id: "T1136.001"
atomic_test_guid: "a524ce99-86de-4f6c-88f5-8c3439e21ed5"
expected_rules:
- "Local User Account Creation via New-LocalUser PowerShell Cmdlet"
input_arguments:
username: "TestUser"
password: "P@ssw0rd123!"
```
**重要:** `expected_rules` 值必须与 Splunk 保存的搜索名称完全匹配。这些是 YAML 文件中的 Sigma 规则标题。
在 [atomicredteam.io](https://atomicredteam.io/atomics/) 查找 Atomic Test GUID,或通过运行以下命令查找:
```
Import-Module "C:\AtomicRedTeam\invoke-atomicredteam\Invoke-AtomicRedTeam.psd1"
Invoke-AtomicTest T1070.001 -ShowDetailsBrief
```
## Aurora EDR 集成
这些规则与 Nextron Systems 的 [Aurora Agent](https://www.nextron-systems.com/aurora/) 兼容。
### 手动安装
将规则复制到 Aurora 的自定义签名文件夹:
```
Copy-Item .\sigma_rules\proc_creation_win_*.yml "C:\Program Files\Aurora-Agent\custom-signatures\"
Restart-Service "Aurora Agent"
```
自动同步和部署工具即将推出。
### 添加新规则
1. 在 `sigma_rules/` 中创建一个新的 `.yml` 文件
2. 遵循命名约定:`_.yml`
3. 确保规则通过验证:`sigma check your-rule.yml`
4. 提交 pull request
### 规则要求
- 必须通过 `sigma check` 验证
- 必须包含 MITRE ATT&CK 技术标签(例如 `attack.t1059.001`)
- 必须包含 `falsepositives` 部分
- 必须包含适当的 `level`(low/medium/high/critical)
- 应包含过滤器以减少误报
### 命名约定
```
__.yml
Examples:
proc_creation_win_susp_rundll32.yml
proc_creation_lnx_docker_priv.yml
file_event_win_archive_creation.yml
m365_mailbox_delegation.yml
```
## 参考资料
- [Sigma 规范](https://github.com/SigmaHQ/sigma-specification)
- [Sigma 规则仓库](https://github.com/SigmaHQ/sigma)
- [MITRE ATT&CK](https://attack.mitre.org/)
- [Atomic Red Team](https://atomicredteam.io/)
- [Aurora Agent 文档](https://aurora-agent-manual.nextron-systems.com/)
- [SCYTHE 平台](https://www.scythe.io/)
## 许可证
详情请参阅 [LICENSE](LICENSE)。
标签:AI合规, API部署, Atomic Red Team, Azure安全, CDN识别, Cloudflare, Conpot, DNS查询, M365, MITRE ATT&CK, SharePoint, Sigma规则, URL发现, Windows安全, WMI事件, 回归测试, 安全检测, 安全运营, 扫描框架, 数据泄露检测, 文件监控, 注册表监控, 目标导入, 网络连接, 自动化CI/CD, 规则转换, 误报控制, 进程创建, 逆向工具, 防火墙日志