DrPwner/Wazuh_Morpheus
GitHub: DrPwner/Wazuh_Morpheus
基于 Flask 构建的 Wazuh SIEM 增强管理平台,提供告警案例管理、规则例外构建、健康监控和细粒度权限控制,帮助安全团队高效处理告警并优化检测规则。
Stars: 2 | Forks: 0
# Wazuh Morpheus
一个基于 Web 的 Wazuh SIEM 管理平台。Wazuh Morpheus 提供了用于告警分类的案例管理、规则例外与抑制构建器、实时健康监控、Indexer 健康跟踪、可配置的电子邮件和 webhook 通知、具有细粒度权限的用户和角色管理、计划备份,以及平台上每个操作的完整审计跟踪。
使用 Flask、SQLite3、lxml 和原生 JavaScript 构建。旨在直接运行在 Wazuh manager 服务器上。
## 目录
- [功能](#features)
- [告警案例管理](#alert-case-management)
- [规则管理](#rules-management)
- [例外构建器](#exception-builder)
- [抑制管理](#suppression-management)
- [健康监控](#health-monitoring)
- [Indexer 监控](#indexer-monitoring)
- [通知](#notifications)
- [Webhook 集成](#webhook-integration)
- [用户管理与权限](#user-management-and-permissions)
- [审计日志](#audit-logging)
- [备份](#backups)
- [设置](#settings)
- [配置](#configuration)
- [安装](#installation)
- [技术栈](#technology-stack)
- [安全说明](#security-notes)
## 功能
- 实时从 Wazuh 的 alerts.json 摄取告警,并按规则 ID 自动进行案例分组
- 完整的案例生命周期:打开、调查、创建例外、抑制、忽略、重新打开
- 批量操作,可一次忽略或抑制多个案例
- 交互式例外构建器,具备公共字段检测、模式建议和可搜索的字段下拉菜单
- 自定义规则创建,支持实时 XML 预览
- 浏览和搜索自定义及默认的 Wazuh 规则
- 实时健康仪表板:Wazuh 服务状态、CPU、内存、磁盘和网络
- Indexer 集群健康监控(OpenSearch / Elasticsearch)
- Indexer 日志活动监控,具备数据停滞检测
- 每个挂载点的磁盘阈值告警
- Archives 日志间隔检测(无日志告警)
- 可配置的电子邮件通知(SMTP 或 Postfix 中继),支持自定义 HTML 模板
- Webhook 集成,可将事件转发到 SOAR 平台、Logic Apps 或任何 HTTP endpoint
- 基于角色的访问控制,具有 23+ 项细粒度权限
- 独立于角色的按用户权限覆盖
- 每一项操作的完整审计日志,支持导出为 CSV
- 定期备份规则文件,支持压缩和保留策略
- 在告警详情页面上可配置事件列
- 字段静默列表,用于在 UI 中隐藏嘈杂的字段
- 可从 Elasticsearch/OpenSearch mapping 输出更新 Wazuh 字段索引
- 静默时段,用于在维护窗口期间抑制非关键告警
- 支持暗黑和明亮主题
## 告警案例管理
平台使用后台追踪线程实时从 Wazuh 的 `alerts.json` 文件中摄取告警。告警按规则 ID 分组为案例。每个案例跟踪首次和最后一次出现的时间戳、总事件数以及唯一的 agent 数量。
### 案例列表
- 所有告警案例的分页列表(每页 50 条)
- 按状态过滤:打开、已忽略、已例外、已抑制或全部
- 按最低规则级别过滤
- 按规则 ID 或描述搜索
- 按级别、规则 ID、描述、事件计数、首次出现或最后出现排序
- 显示每种状态计数的状态摘要
- 将案例分配给用户
- 批量忽略或批量抑制选定的案例
- 无需刷新页面即可实时轮询新案例
### 案例详情
- 完整的案例元数据:规则 ID、描述、级别、首次/最后一次出现、事件计数
- 事件折叠面板,显示单个告警事件及可配置的列标题
- 从所有事件中提取扁平化字段,并在每行显示其值
- 公共字段检测:所有事件中具有相同值的字段将被高亮显示,便于轻松识别可靠的例外候选字段
- 相似字段检测:具有不同值但共享公共子字符串的字段,暗示了基于模式的否定
- 规则 XML 查看器,显示当前规则逻辑
- 对例外文件中的规则进行内联原始 XML 编辑
- 应用于该规则的所有例外和抑制的历史记录
- 用于创建例外、抑制规则或忽略案例的按钮
- 加载所有事件(在初始的 100 条记录之后进行分页获取)
- 可配置的事件列:通过“设置”选择在事件标题中显示哪些字段
### 告警导入
手动导入 endpoint 读取已配置的 alerts.json 文件并处理所有事件,适用于回填历史数据或在数据库重置后重新导入。
## 规则管理
### 浏览规则
- 双源规则浏览器:来自自定义规则文件的自定义规则和来自 ruleset 目录的默认 Wazuh 规则
- 按来源筛选(自定义、默认或全部)
- 按规则 ID 或描述搜索
- 按 ID、级别、来源或描述排序
- 分页显示(每页 100 条)
- 指示哪些规则具有活跃抑制或例外的徽章
- 查看完整的规则 XML 和解析结构
### 自定义规则创建
- 交互式规则构建器表单,带有实时 XML 预览
- 字段:规则 ID(必须 >= 100000)、级别、描述
- 条件字段:if_sid、if_group、match、regex 及类型选择器
- 字段构建器:通过可搜索的字段名称下拉菜单(从您的 Wazuh 索引 mapping 填充)、匹配类型选择器(pcre2、osmatch、osregex)和否定切换开关添加字段级条件
- 频率和时间范围设置
- MITRE ATT&CK ID 分配
- 自定义选项和分组
- 提交时,规则将写入自定义规则文件并发送通知
## 例外构建器
例外构建器可从告警案例详情页访问。它将否定的字段条件添加到规则中,从而将特定的告警模式排除在未来的触发之外。
- 对于自定义规则(ID >= 100000):否定的字段将直接添加到自定义规则文件中的规则中
- 对于默认规则(ID < 100000):规则将被复制到默认规则例外文件中并带有 `overwrite="yes"`,同时将否定的字段添加到其中
- 支持多种匹配类型:pcre2、osmatch、osregex
- 可搜索的字段下拉菜单,由从案例事件中提取的所有字段填充
- 公共字段显示为可点击的标签,可一键添加
- 相似字段模式建议显示为可点击的标签
- 可以在单个例外中否定多个字段
- 每个例外都会连同修改前/后的 XML 差异一起记录在数据库中
## 抑制管理
抑制将规则的级别设置为 0,并添加 `noalert="1"`,从而静默来自该规则的所有告警。
- 对于自定义规则:在自定义规则文件中直接将级别设置为 0
- 对于默认规则:将规则复制到抑制文件中并带有 `overwrite="yes"`,且级别设置为 0
- 抑制列表页面显示所有被抑制的规则
- 取消抑制可将规则恢复到其原始级别
- 重复的抑制尝试将被拒绝并给出明确的错误提示
## 健康监控
健康仪表板提供对 Wazuh 服务器及其依赖项的实时可见性。
### Wazuh 服务状态
- 检查 `systemctl is-active wazuh-manager.service`
- 显示正在运行、已停止或失败状态
- 重启按钮触发后台重启并进行实时状态轮询
- 包含 systemctl 输出和 journalctl 日志的重启历史日志
### 系统指标
- **磁盘**:所有挂载点及其使用百分比。可配置的每挂载点阈值,超过该阈值时发送电子邮件告警。
- **内存**:总计、已用、可用、交换分区和百分比(从 `free -m` 解析)。
- **CPU**:当前使用百分比以及 1/5/15 分钟的平均负载。维护一个 5 小时的历史图表,每个轮询间隔采样一次。
- **网络**:每个接口的 RX/TX 字节、数据包和错误(来自 `/proc/net/dev`)。
### 轮询间隔
健康仪表板刷新间隔是可配置的(默认 30 秒,最少 5 秒)。所有指标均通过单个 API 调用获取并在客户端渲染。
## Indexer 监控
监控您的 OpenSearch 或 Elasticsearch indexer 是否存在集群健康问题和数据停滞。每个 indexer 可以配置一个或两个监控类型。
### 集群健康监控
- 查询已配置的 indexer URL 上的 `GET /_cluster/health`
- 报告集群状态(绿色、黄色、红色)、节点数和未分配的分片
- 可配置的告警阈值:仅在红色、黄色和红色或任何非绿色状态时发出告警
- 在超过阈值时发送 `indexer_issue` 通知
### 日志活动监控
- 在已配置的索引模式(例如,`wazuh-alerts-*`)中按 `@timestamp` 查询最新文档
- 报告最新文档的保留时间
- 如果在配置的阈值内(例如,10 分钟)没有新数据到达,则发出告警
- 检测停滞数据,即最新时间戳在两次检查之间没有发生变化
### 配置
每个监控器都有自己的检查间隔(最少 30 秒)、凭据、SSL 验证开关和启用/禁用开关。保存前可使用测试连接按钮来验证连接性和凭据。
## 通知
### 电子邮件投递
支持两种后端。用于标准邮件服务器(支持 TLS/STARTTLS)的 SMTP,以及用于无需身份验证的本地邮件中继的 Postfix。两者都可以在设置页面使用测试收件人进行测试。
### 通知事件
平台针对 11 种事件类型发送通知:
| 事件 | 描述 |
|---|---|
| 创建例外 | 用户为规则创建了例外 |
| 创建抑制 | 规则被抑制 |
| 创建自定义规则 | 添加了新的自定义规则 |
| Wazuh 重启成功 | Wazuh manager 服务重启成功 |
| Wazuh 重启失败 | 重启尝试失败 |
| 超出磁盘阈值 | 某挂载点的磁盘使用率超出了配置的阈值 |
| 告警案例已忽略 | 告警案例被标记为已忽略 |
| Archives 日志间隔 | 在配置的阈值内,archives.json 中没有出现新条目 |
| Indexer 健康问题 | indexer 无法访问、运行状况不佳或存在数据停滞 |
| 批量忽略 | 多个告警案例被批量忽略 |
| 批量抑制 | 多个规则被批量抑制 |
每种事件类型都可以单独启用或禁用。按事件的收件人覆盖允许将特定事件路由到不同的团队或电子邮件地址。
### 电子邮件模板
每种通知事件都有一个默认的 HTML 电子邮件模板。可以从设置页面创建、编辑和预览自定义模板。模板使用 `{{ variable }}` 或 `{{ variable:fallback }}` 语法处理动态值。每种事件类型都有其自己的一组可用模板变量(例如,rule_id、created_by、timestamp、mount、percent)。
### 静默时段
可配置的静默窗口(例如,00:00 到 06:00)可在计划的维护或低活动期间抑制非关键通知,例如 indexer 数据停滞和 archives 日志间隔告警。
### Archives 日志间隔检测
后台线程监控配置的 `archives.json` 文件。如果在配置的阈值(默认 300 秒)内没有出现新条目,则会发送 `archives_no_log` 通知。这可以检测到日志转发已停止的情况。
## Webhook 集成
将案例操作转发到外部系统,例如 Microsoft Logic Apps、SOAR 平台或任何接受 JSON payload 的 HTTP endpoint。
### 支持的事件
- 案例已忽略
- 创建例外
- 创建抑制
- 批量忽略
- 批量抑制
每个事件都可以单独开启或关闭。
### 认证
- Bearer token(作为 `Authorization: Bearer ` 发送)
- 自定义请求头(可配置的请求头名称和值)
### 功能
- 可配置的超时时间(1 到 60 秒)和重试次数(0 到 5 次)
- 解决工作流:当集成启用时,用户在关闭案例时必须选择解决类别(例如,误报、真阳性、良性真阳性、信息性)。解决选项完全可配置。
- 所有 webhook 投递都会连同请求 payload、响应状态、响应体和任何错误一起记录
- 测试 webhook 按钮用于在保存前验证连接性
- 投递日志可从集成设置页面查看
### Payload 示例
```
{
"action": "case_ignored",
"rule_id": "61138",
"rule_description": "Windows Defender event",
"notes": "Benign activity on app server",
"resolution": "False Positive",
"username": "analyst1",
"timestamp": "2026-04-30T15:30:45",
"case_id": 42
}
```
## 用户管理与权限
### 用户
- 创建编辑、激活和停用用户帐户
- 字段:用户名、密码(至少 6 个字符)、电子邮件、全名
- Root 用户绕过所有权限检查
- 跟踪上次登录时间和 IP 地址
### 角色
- 创建带有描述的命名角色
- 为角色分配任意组合的权限
- 为每个用户分配一个或多个角色
- 当不再需要时删除角色
### 权限
按类别组织的 23+ 项细粒度权限:
| 类别 | 权限 |
|---|---|
| 仪表板 | 查看仪表板统计数据 |
| 告警 | 查看案例、查看案例详情、关闭/忽略案例、批量操作 |
| 规则 | 查看规则、创建/编辑/删除自定义规则、编辑原始 XML |
| 例外 | 查看例外、创建自定义例外、创建默认例外、删除例外 |
| 抑制 | 查看抑制、创建自定义抑制、创建默认抑制、删除抑制 |
| 健康 | 查看健康仪表板、重启 Wazuh |
| 设置 | 查看设置、管理设置、管理用户、管理角色、查看审计日志、管理备份、管理集成 |
### 权限解析
1. Root 用户自动拥有所有权限
2. 显式的用户级权限覆盖(授予或撤销)优先于角色
3. 当不存在用户级覆盖时,应用角色级权限
## 审计日志
平台上的每一个操作都会被记录到审计跟踪中,包含:
- 时间戳
- 用户名和用户 ID
- 操作名称(例如,LOGIN、CREATE_EXCEPTION、CLOSE_CASE、UPDATE_WAZUH_PATHS)
- 类别(Auth、Alerts、Rules、Health、Settings、UserManagement)
- 以 JSON 对象形式存储的详细信息,包含特定于操作的数据
- 用户的 IP 地址
审计日志页面支持按搜索文本、类别、用户名和日期范围进行过滤。条目按每页 100 条分页,并可导出为 CSV(最多 10,000 行)。
## 备份
使用 APScheduler 定期备份关键规则文件。
### 计划类型
- **每天**:在每天的特定时间运行
- **每周**:在每周选定日子的特定时间运行
- **每 N 小时**:以固定间隔运行
- **每 N 天**:每 N 天的特定时间运行
### 功能
- 可配置的备份文件列表(自定义规则、抑制、例外)
- 备份目录路径(必须为绝对路径)
- 可选的 gzip 压缩
- 保留策略:保留最近 N 个备份,较旧的将自动删除
- 手动触发按钮可立即运行备份
- 显示状态、文件大小和任何错误的备份历史日志
## 设置
所有配置均通过设置页面管理,无需更改代码或重启应用程序。
### Wazuh 文件路径
配置 alerts.json、默认规则目录、自定义规则文件、抑制文件、默认规则例外文件和 archives.json 的路径。同时支持 Linux 和 Windows 路径。
### 字段静默列表
此列表中的字段将从告警事件显示、例外构建器下拉菜单和公共字段检测中隐藏。适用于抑制嘈杂的元数据字段,如 `rule.firedtimes`、`cluster.node`、`rule.pci_dss` 等。
### 告警事件列
配置在告警详情页上的事件折叠面板标题中显示的列。使用从您的 Wazuh 字段索引 (WazuhFields.json) 填充的可搜索下拉菜单。字段使用指向解析后的告警 JSON 的点分表示法路径(例如,`data.win.system.eventID`、`agent.name`)。特殊字段 `timestamp`、`agent.name`、`agent.ip` 和 `agent.id` 从数据库列中解析。
### Wazuh 字段索引
粘贴来自您的 OpenSearch/Elasticsearch 实例的 `GET /*/_mapping` 输出,以更新已知告警字段的列表。这将填充整个平台中在例外构建器、规则创建表单和事件列配置中使用的可搜索字段下拉菜单。
## 配置
所有设置都存储在项目根目录的 `config.json` 中。如果在首次运行时该文件不存在,将自动使用标准的 Wazuh 路径创建默认配置。
### 关键部分
| 部分 | 目的 |
|---|---|
| `app` | Secret key、调试模式、主机、端口 |
| `database` | SQLite 数据库文件路径 |
| `wazuh` | 文件路径、静默字段、归档监控配置 |
| `email` | SMTP 服务器配置 |
| `postfix` | 本地邮件中继配置 |
| `notifications` | 按事件的开关、收件人、静默时段、磁盘阈值 |
| `email_templates` | 按事件类型的自定义/默认开关 |
| `indexers` | Indexer 监控定义 |
| `alerts` | 事件列配置 |
| `health` | 仪表板轮询间隔 |
| `integration` | Webhook URL、认证、事件开关、解决选项 |
| `backup` | 计划类型、文件、压缩、保留策略 |
## 安装
### 要求
- Python 3.8+
- 正在运行的 Wazuh manager 服务器(带有 systemd 的 Linux)
- pip
### 设置
```
cd wazuh_platform
pip install -r requirements.txt
python run.py
```
应用程序默认在 `http://0.0.0.0:5000` 上启动。首次运行时,将自动创建默认的 `config.json` 和 SQLite 数据库。默认管理员用户创建信息如下:
- 用户名: `admin`
- 密码: `admin`
首次登录后请立即更改密码和 secret key。
### 生产部署
对于生产环境,请使用 WSGI entry point:
```
python wsgi.py
```
或者使用 Gunicorn:
```
gunicorn -w 4 -b 0.0.0.0:5000 "wsgi:app"
```
### 作为 systemd 服务运行
创建 `/etc/systemd/system/wazuh-morpheus.service`:
```
[Unit]
Description=Wazuh Morpheus Platform
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/path/to/wazuh_platform
ExecStart=/path/to/wazuh_platform/venv/bin/python wsgi.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
然后启用并启动:
```
systemctl daemon-reload
systemctl enable wazuh-morpheus
systemctl start wazuh-morpheus
```
### 文件路径
在“设置”中更新 Wazuh 文件路径以匹配您的服务器。默认路径假定采用标准的 Wazuh 安装:
| 设置 | 默认路径 |
|---|---|
| Alerts JSON | `/var/ossec/logs/alerts/alerts.json` |
| 默认规则 | `/var/ossec/ruleset/rules/` |
| 自定义规则 | `/var/ossec/etc/rules/customrulesfile.xml` |
| 抑制 | `/var/ossec/etc/rules/suppressions.xml` |
| 例外 | `/var/ossec/etc/rules/default-rule-exceptions.xml` |
| Archives JSON | `/var/ossec/logs/archives/archives.json` |
## 技术栈
| 组件 | 技术 |
|---|---|
| 后端 | Flask (Python) |
| 数据库 | SQLite3(WAL 模式,启用外键) |
| XML 解析 | 带恢复模式的 lxml |
| 调度 | APScheduler |
| 电子邮件 | smtplib (SMTP) / sendmail (Postfix) |
| HTTP 客户端 | requests |
| 前端 | 原生 JavaScript,Jinja2 模板 |
| 样式 | 每页自定义 CSS(无框架) |
## 安全说明
- 在部署到生产环境之前,请更改 `config.json` 中的默认 `secret_key`
- 首次登录后立即更改默认管理员密码
- 平台需要对 Wazuh 规则文件具有读/写访问权限 —— 请以具有适当权限的用户身份运行
- 电子邮件密码和 indexer 凭据以明文形式存储在 `config.json` 中 —— 请相应地限制文件权限(`chmod 600 config.json`)
- 在生产部署中请使用带有 TLS 的反向代理(nginx、Apache)
- SQLite 数据库包含审计日志和告警数据 —— 请将其纳入您的备份策略中
标签:CMS安全, Elasticsearch, Flask, IT运维, JavaScript, PB级数据处理, Python, Socks5代理, SQLite3, Wazuh, Webhook集成, Web管理平台, XML, 分布式计算, 告警分诊, 告警抑制, 告警降噪, 安全事件响应, 安全信息与事件管理, 安全运维, 安全运营, 定时备份, 审计追踪, 异常处理, 扫描框架, 搜索引擎爬取, 数据可视化, 无后门, 用户权限管理, 系统健康监控, 索引器监控, 网络安全监控, 自定义脚本, 规则管理, 逆向工具, 邮件通知, 驱动开发