Rayan-Faiz/Mini-SOC-Wazuh-Rules
GitHub: Rayan-Faiz/Mini-SOC-Wazuh-Rules
基于 Wazuh 构建的迷你 SOC 方案,实现 SSH 暴力破解检测、GeoIP 富化、Slack/Teams 告警通知与攻击者 IP 自动封锁的完整安全运营流程。
Stars: 0 | Forks: 0
# Mini SOC - 威胁事件场景
此仓库包含了一个用于**威胁事件场景**的完整、可用于生产环境的实现。
目标:**检测 SSH 暴力破解尝试(多次失败登录)以及随后来自同一攻击者 IP 的成功登录**,然后通过 GeoIP 数据丰富告警,将其转发到协作渠道(Slack/Teams),并使用 SOAR 风格的 playbook 和 Wazuh 工具在防火墙自动封锁攻击者的 IP。
## 仓库布局
```
mini-soc-part2/
├── README.md
├── rules/
│ ├── local_decoder.xml # Normalizes sshd log events
│ └── local_rules.xml # Detection and correlation rules
├── integrations/
│ ├── slack.json # Slack integration template
│ └── block-ip.sh # SOAR playbook script to block attacker IP
```
## 检测逻辑
此检测使用 **Wazuh decoders + rules**:
1. **Decoder (`local_decoder.xml`)** – 确保 SSH 失败和成功的消息始终填充 `srcip` 和 `user` 字段。
2. **Rules (`local_rules.xml`)**:
- **100000** → 检测单次登录失败尝试。
- **100010** → 聚合 60 秒内来自**同一 IP** 的 3 次或更多次失败登录。
- **100020** → 检测在暴力破解尝试后 120 秒内来自**同一 IP** 的成功登录。
- 此最终规则代表该**事件**。
3. **Enrichment**:
- GeoIP 查询在 manager 配置中已启用。告警现在包含 `geoip.country_name`、`geoip.city_name` 等。
- Payload 包含元数据:攻击者 IP、用户名、上下文。
## 已实现的功能
### a) GeoIP 丰富
在 `/var/ossec/etc/ossec.conf` 中启用:
```
yes
/var/ossec/etc/geoip/
```
- 将 MaxMind **GeoLite2** 数据库文件放置在配置的路径中。
- 重启 Wazuh manager。
- 所有告警现在都包含攻击者 IP 的 GeoIP 上下文。
### b) Slack/Teams 集成
在 `/var/ossec/etc/ossec.conf` 中配置:
```
slack
https://hooks.slack.com/services/XXX/YYY/ZZZ
json
100020
```
**Template (`integrations/slack.json`)** 控制格式化。
每当 **rule 100020** 触发时,告警就会发送到 Slack(如果配置了自定义脚本,则发送到 Teams)。
### c) SOAR Playbook(自动封锁 IP)
我们利用 Wazuh 的 **active response** 框架来自动封锁攻击者的 IP。
**脚本 (`integrations/block-ip.sh`)**
**在 `/var/ossec/etc/ossec.conf` 中的配置片段:**
```
block-ip
block-ip.sh
srcip
yes
block-ip
all
100020
```
这意味着:当 rule **100020** 触发时,Wazuh 会使用攻击者的 IP 运行 `block-ip.sh`,在防火墙(本例中为 UFW)处将其封锁。
## 测试场景
1. 将自定义 decoder 和 rules 部署到 `/var/ossec/etc/`。
2. 重启 Wazuh manager:
systemctl restart wazuh-manager
3. 从 agent 模拟事件:
logger -p authpriv.notice 'sshd[1830]: Failed password for invalid user test1 from 203.0.113.5 port 50234 ssh2'
logger -p authpriv.notice 'sshd[1830]: Failed password for invalid user test1 from 203.0.113.5 port 50234 ssh2'
logger -p authpriv.notice 'sshd[1830]: Failed password for invalid user test1 from 203.0.113.5 port 50234 ssh2'
logger -p authpriv.notice 'sshd[1830]: Accepted password for backupuser from 203.0.113.5 port 50234 ssh2'
4. 验证:
- 在 **Wazuh Dashboard** 中,对 `rule.id:100020` 进行过滤以确认事件。
- 检查 **Raw JSON** 中的 GeoIP 字段。
- 检查 **Slack/Teams** 频道是否有告警。
- 在 manager 上运行 `ufw status` 以确认攻击者 IP 已被封锁。
## 结论
此仓库演示了一个**完整的检测-丰富-响应 pipeline**:
- **检测:** 暴力破解多阶段尝试及随后的成功登录(关联逻辑)。
- **丰富:** 进行 GeoIP 查询以获取攻击者上下文。
- **通知:** 将告警发送至 Slack/Teams。
- **响应:** 通过 SOAR 风格的 playbook 自动封锁防火墙。
它提供了一个实用的、真实的 SOC 工作流,可通过 CI/CD 完全自动化,符合现代安全运营的最佳实践。
标签:AMSI绕过, FOFA, FTP漏洞扫描, Wazuh, 威胁检测, 安全编排, 安全运营, 应用安全, 扫描框架, 自动化响应