filipperichta/soar-lab
GitHub: filipperichta/soar-lab
一个基于 Vagrant 和 Docker 的自动化 SOC 家庭实验室项目,一键部署 Wazuh、Splunk 和 Shuffle SOAR 的完整安全运营环境。
Stars: 0 | Forks: 0
# SOC 工程实验室
一个完全以代码形式构建的自动化安全运营中心。本实验室使用 Vagrant 和 Docker 跨三台虚拟机部署了一套完全集成的安全栈——包含 Wazuh、Splunk 和 Shuffle SOAR。只需一条 `vagrant up` 命令,即可从零开始配置整个环境,无需任何手动干预。
## 架构
```
graph TB
BROWSER["Host Browser"]
subgraph HOST["Windows 11 Host"]
subgraph WIN["Windows Endpoint 192.168.33.20"]
WAZUH_WIN["Wazuh Agent"]
end
subgraph LIN["Linux Endpoint 192.168.33.30"]
WAZUH_LIN["Wazuh Agent"]
end
subgraph SOC["SOC VM 192.168.33.10 - 16GB RAM"]
UF["Splunk Universal Forwarder"]
subgraph DOCKER["Docker Engine"]
SPLUNK["Splunk Enterprise\nWeb :8000 / Receiving :9997"]
WAZUH_MGR["Wazuh Manager\n:1514 :1515 :55000"]
WAZUH_IDX["Wazuh Indexer :9200"]
WAZUH_DSH["Wazuh Dashboard :443"]
SHUFFLE_FE["Shuffle Frontend :3001"]
SHUFFLE_BE["Shuffle Backend :5001"]
SHUFFLE_OS["Shuffle OpenSearch :9201"]
SHUFFLE_OR["Shuffle Orborus"]
end
end
end
WAZUH_WIN -->|TCP 1514/1515| WAZUH_MGR
WAZUH_LIN -->|TCP 1514/1515| WAZUH_MGR
WAZUH_MGR -->|alerts| WAZUH_IDX
WAZUH_IDX --- WAZUH_DSH
WAZUH_MGR -->|alerts.json volume| UF
UF -->|TCP 9997| SPLUNK
SPLUNK -->|webhook| SHUFFLE_BE
SHUFFLE_BE --- SHUFFLE_OS
SHUFFLE_BE --- SHUFFLE_OR
SHUFFLE_FE --- SHUFFLE_BE
BROWSER -->|:8000| SPLUNK
BROWSER -->|:8443| WAZUH_DSH
BROWSER -->|:3001| SHUFFLE_FE
```
## 技术栈
| 组件 | 角色 | 版本 |
|---|---|---|
| Wazuh Manager | 端点检测、告警关联、主动响应 | 4.14.4 |
| Wazuh Indexer | 基于 OpenSearch 的告警存储 | 4.14.4 |
| Wazuh Dashboard | 安全可视化 UI | 4.14.4 |
| Splunk Enterprise | SIEM — 关联、调查、分析 | 10.2.2 |
| Splunk Universal Forwarder | 日志管道 — 将 Wazuh 告警转发至 Splunk | 10.2.2 |
| Shuffle SOAR | 安全编排与自动化响应 | latest |
| Vagrant | 虚拟机配置及生命周期管理 | 2.4.9 |
| VirtualBox | Hypervisor | 7.2.x |
| Docker | SOC 服务的容器运行时 | latest |
## Vagrant Box
| Box | 用途 | 来源 |
|---|---|---|
| `filipovo/windows-11-enter-eval-25H2` | Windows 端点 | 发布于 Vagrant Cloud。使用 bento Packer 项目配合 VirtualBox provider,基于官方 Microsoft Windows 11 Enterprise Evaluation ISO (25H2, Build 26100) 构建。 |
| `bento/ubuntu-25.04` | SOC 虚拟机和 Linux 端点 | 由 bento 项目维护的社区 box。 |
## 基础设施
系统会自动配置三台虚拟机:
**SOC 虚拟机** (`192.168.33.10`,16GB RAM,100GB 磁盘,4 vCPUs) 在 Docker 内运行完整的安全栈——Wazuh 单节点部署、Splunk Enterprise、Shuffle SOAR,以及作为主机服务运行的 Splunk Universal Forwarder。使用 `bento/ubuntu-25.04`。
**Windows 端点** (`192.168.33.20`,4GB RAM,2 vCPUs) 运行 Windows 11 Enterprise Evaluation (25H2),并在配置期间自动安装和注册 Wazuh agent。使用来自 Vagrant Cloud 的 `filipovo/windows-11-enter-eval-25H2`。
**Linux 端点** (`192.168.33.30`,2GB RAM,2 vCPUs) 运行 Ubuntu 25.04,并在配置期间自动安装和注册 Wazuh agent。使用 `bento/ubuntu-25.04`。
## 前置条件
**主机:**
- 至少配备 32GB RAM 的 Windows 11(实验室在所有虚拟机上共分配约 22GB)
- [VirtualBox 7.2+](https://www.virtualbox.org/wiki/Downloads) 及 Extension Pack
- [Vagrant 2.4.9+](https://developer.hashicorp.com/vagrant/downloads)
- [Git](https://git-scm.com/)
**账号:**
- 用于下载 Universal Forwarder 的 Splunk 账号——可在 [splunk.com](https://www.splunk.com/en_us/download/universal-forwarder.html) 免费注册。下载 URL 已在 Vagrantfile 配置器中预配置好。
**首次执行 `vagrant up` 时会自动下载的 Vagrant box:**
- `filipovo/windows-11-enter-eval-25H2` (~8GB)
- `bento/ubuntu-25.04` (~1GB)
## 快速开始
```
# 克隆 repository
git clone https://github.com/filipperichta/soar-lab.git
cd soar-lab
# 从示例创建配置文件
cp secrets.rb.example secrets.rb
cp config.rb.example config.rb
# 编辑 secrets.rb 并设置你的 Splunk 密码
# 如果需要更改网络或端口设置,请编辑 config.rb
# 启动完整实验环境
vagrant up
```
首次运行时,由于需要下载 Docker 镜像,配置过程大约需要 30-45 分钟。在执行 `vagrant halt` 后的后续 `vagrant up` 操作将显著加快,因为镜像已缓存在虚拟机磁盘中。
## 配置
### secrets.rb
包含绝不应提交至 git 的敏感值:
```
SPLUNK_PASSWORD = "your-secure-password-here"
```
### config.rb
包含网络和端口配置。如果您的主机存在冲突,请在此修改:
```
# 网络
SOC_IP = "192.168.33.10"
WIN_ENDPOINT_IP = "192.168.33.20"
LINUX_ENDPOINT_IP = "192.168.33.30"
# Host 端口 — 如果存在冲突请更改这些设置
SPLUNK_WEB_PORT = 8000
SPLUNK_RECEIVING_PORT = 9997
WAZUH_DASHBOARD_PORT = 8443
WAZUH_API_PORT = 55000
WAZUH_INDEXER_PORT = 9200
WAZUH_AGENT_COMMS_PORT = 1514
WAZUH_AGENT_ENROLLMENT_PORT = 1515
SHUFFLE_HTTP_PORT = 3001
SHUFFLE_HTTPS_PORT = 3443
```
## 访问服务
一旦 `vagrant up` 完成,请等待 5 分钟让所有服务完全初始化后再进行访问。
| 服务 | URL | 默认凭据 |
|---|---|---|
| Splunk Web | http://localhost:8000 | admin / 你的 SPLUNK_PASSWORD |
| Wazuh Dashboard | https://localhost:8443 | admin / SecretPassword |
| Shuffle SOAR | http://localhost:3001 | 首次登录时设置 |
验证 Wazuh 告警是否正在流入 Splunk:
```
index="wazuh-alerts"
```
## 实验室演示
### 所有虚拟机均已运行

*`vagrant up` 完成后,三台虚拟机均已运行*
### 配置 — SOC 虚拟机

*SOC 虚拟机配置 — Wazuh 栈部署、Splunk 接收端口配置,以及 Universal Forwarder 下载*
### 配置 — Shuffle SOAR 和 Windows 端点

*Shuffle SOAR 容器启动,同时伴随 Windows 端点引导序列*
### 配置 — Linux 端点

*Linux 端点已自动安装并注册 Wazuh agent*
### 所有容器均在运行

*在 SOC 虚拟机上运行的七个容器 — Wazuh 栈、Splunk Enterprise 和 Shuffle SOAR*
### Universal Forwarder 活跃状态

*Splunk Universal Forwarder 正通过端口 9997 主动将 Wazuh 告警转发至 Splunk*
## Wazuh
### 两个 Agent 均处于活跃状态

*win-endpoint (Windows 11 Enterprise Evaluation) 和 linux-endpoint (Ubuntu 25.04) 均已活跃并连接到 Wazuh Manager*
### 安全概览

*Wazuh 概览仪表盘,显示活跃 agent、按严重程度划分的 24 小时告警分类,以及可用的安全模块 — MITRE ATT&CK、文件完整性监控、漏洞检测、CIS 合规性、PCI DSS、GDPR 和 HIPAA*
## Splunk
### Wazuh 告警已建立索引

*579 条 Wazuh 告警已在 Splunk 中建立索引,并带有完全解析的 JSON 字段 — agent 详情、规则信息、MITRE ATT&CK 映射、Windows 事件数据,以及所有可通过 SPL 搜索的 CIS 合规性发现*
### 搜索界面

*Splunk Search & Reporting — 用于关联、调查和检测规则开发的主要界面*
## Shuffle SOAR
### SOAR 平台

*Shuffle SOAR 运行中且可访问 — 已准备好在 Cases、SIEM、EDR、Email、Network 和 IAM 集成领域进行 playbook 开发*
### 社区工作流

*Shuffle 社区工作流,包括 Wazuh 工单处理器、告警富化和钓鱼检测 playbook,可作为起步参考*
## 架构决策
### 使用 Wazuh 配合 Splunk 而非仅使用 Splunk
Splunk 没有原生的端点 agent 能力。Wazuh 提供了 Splunk 无法提供的功能——基于 agent 的文件完整性监控、rootkit 检测、主动响应、漏洞扫描,以及直接在端点上运行的 CIS 基准合规性检查。Wazuh 并非将原始的 Windows Event Logs 发送到 Splunk(这将瞬间耗尽 500MB/天的免费额度),而是对端点遥测数据进行预处理和丰富,然后仅转发已关联并标记了 MITRE ATT&CK 的告警。这反映了真实的企业级部署场景,在这些场景中,Splunk 许可证成本(按摄取的 GB/天计费)使得智能预过滤成为一种运维必需。
### 选择 Splunk Universal Forwarder 而非 Logstash
Wazuh Manager 会自动将经过丰富的告警写入 `/var/ossec/logs/alerts/alerts.json`。Universal Forwarder 直接读取此文件并将其传送给 Splunk——无需额外服务、无需转换管道、无额外内存消耗。Logstash 会增加另一服务层、额外的内存开销以及需要维护的管道语言,但对此用例却无法提供实质性的益处。该 forwarder 方案也更符合企业级 SOC 部署的典型特征。
### 补丁修改官方 Shuffle docker-compose 而非维护一个 Fork
Shuffle 官方的 `docker-compose.yml` 直接从仓库克隆,并在配置时应用了两个针对性的 `sed` 补丁——一个用于解决与 Wazuh 的 OpenSearch 在 `9200` 端口上的冲突,另一个将 OpenSearch 堆栈大小从 `3072m` 减少到 `1024m` 以适应实验室的 RAM 限制。这种方法意味着可以自动继承官方 compose 文件的上游更改,从而将维护负担减少到仅需维护两行已记录的补丁,而不是一个会随着时间推移而产生差异的完整 Fork。
### 使用独立配置文件而非内联 heredocs
Splunk Universal Forwarder 配置(`inputs.conf`、`props.conf`、`outputs.conf`)作为独立文件维护在 `files/splunk-forwarder/` 中,并在配置期间复制到位。将这些配置作为 heredocs 嵌入 Vagrantfile shell 配置器中,会将依赖于缩进的空格引入配置文件,使其更难独立阅读、编辑和验证。独立文件受到版本控制,无需触碰 Vagrantfile 即可编辑,并遵循了应用于机密和网络配置的相同关注点分离原则。
### config.rb 中的端口变量
所有主机侧的端口映射都在 `config.rb` 中定义为命名常量,而不是硬编码在 Vagrantfile 中。任何克隆此实验室的人都可以通过编辑单个文件来解决其主机上的端口冲突。这些常量根据其功能(如 `WAZUH_DASHBOARD_PORT`)而非其值进行命名,使 Vagrantfile 具备自文档化能力。
### 机密与配置分离
敏感值(`SPLUNK_PASSWORD`)存放在 `secrets.rb` 中。非敏感配置(IP 地址、端口号)存放在 `config.rb` 中。两者都通过 `.gitignore` 排除在 git 之外,并提供相应的 `.example` 文件作为模板提交。这种区分至关重要——机密需要保护,而配置只是为了方便。将它们混淆在同一个文件中会掩盖哪些值真正需要安全保障。
### 自定义 Windows 11 Vagrant box
`filipovo/windows-11-enter-eval-25H2` box 是使用 bento Packer 项目从官方 Microsoft Windows 11 Enterprise Evaluation ISO 构建的,而不是使用来源不明的社区 box。这提供了有文档记录、可重现的构建过程和已知基准。该 box 已发布在 Vagrant Cloud 上,供任何克隆本实验室的人使用。如果您不想使用自定义 box,也可以使用 `gusztavvargadr/windows-11` 作为替代方案——只需在 Vagrantfile 中更改 `win.vm.box` 的值即可。
## 已知限制
**Splunk 免费许可证 — 500MB/天摄取量。** 配合 Wazuh 的预过滤,这足以满足实验室使用,但在生产环境中或持续的攻击模拟负载下,将需要付费许可证。
**Windows 11 Vagrant box 在 Packer 构建期间需要手动 EFI 步骤。** 使用包含的 Packer 模板从源码构建 `filipovo/windows-11-enter-eval-25H2` box 时,EFI shell 需要手动按 Enter 键才能继续引导序列——这是 bento 项目中关于 VirtualBox 和 Windows 11 的已知未决问题。发布在 Vagrant Cloud 上的 box 可正常工作;只有 Packer 构建过程需要此干预。
**通过 shell 配置器进行 LVM 扩展。** Vagrant 的 `config.vm.disk` 在 VirtualBox 级别调整了虚拟磁盘大小,但并未扩展客户端操作系统内的 Linux 分区表或 LVM 逻辑卷。shell 配置器使用 `growpart`、`pvresize`、`lvextend` 和 `resize2fs` 处理此问题。虽然这反映了云环境中的标准做法(AWS EBS 卷扩容在实例内部也需要相同的步骤),但这只是一种被公认的针对 Vagrant 限制的变通方法,而非原生解决方案。
**Shuffle OpenSearch 堆内存降至 1024。** 官方的 Shuffle docker-compose 为其 OpenSearch 实例分配了 3072MB。此处在 16GB 虚拟机上运行 Wazuh 完整栈和 Splunk Enterprise,已将其降至 1024MB 以作适应。此性能用于实验室是可以接受的。如果您有更多可用 RAM,请在打过补丁的 compose 文件中增加 `OPENSEARCH_JAVA_OPTS` 的值。
**永久禁用 Swap。** OpenSearch 组件(包括 Wazuh Indexer 和 Shuffle OpenSearch)要求禁用 swap 才能正常运行。配置器为当前会话禁用了 swap,并注释掉了 `/etc/fstab` 中的 swap 条目,以防止其在重启后重新启用。这会影响整个 SOC 虚拟机。
**Wazuh agent 的 MANAGER_IP 环境变量。** 在运行 Ubuntu 25.04 且使用 Wazuh 4.14.4 的情况下,在 `apt-get install` 期间传递的 `WAZUH_MANAGER` 环境变量并未被应用到 agent 配置文件中。配置器通过在安装完成后使用 `sed` 直接替换 `/var/ossec/etc/ossec.conf` 中的 `MANAGER_IP` 占位符来规避此问题。
## 开发说明
请使用 `vagrant halt` 而不是 `vagrant destroy`,以在两次会话之间保留已下载的 Docker 镜像。镜像只会在执行 `vagrant destroy` 时重新下载,该操作应仅保留用于测试从头开始的完整配置过程。
```
vagrant halt # Stop all VMs, preserve state and Docker images
vagrant up # Resume all VMs
vagrant halt soc # Stop only the SOC VM
vagrant destroy -f # Destroy all VMs — full rebuild on next vagrant up
vagrant destroy soc -f # Destroy only the SOC VM
vagrant reload --provision soc # Restart SOC VM and rerun provisioners
```
标签:AMSI绕过, Cutter, Docker, EC2, Home Lab, IaC, NIDS, OISF, Shuffle, SOAR, SOC工程, Vagrant, Wazuh, x64dbg, 威胁检测, 安全可视化, 安全架构, 安全演练, 安全运营中心, 安全防御评估, 家庭实验室, 容器化, 日志管理, 网络安全, 网络映射, 网络调试, 自动化, 虚拟化, 请求拦截, 配置修复, 隐私保护