ChrisHuber1/siem-automation

GitHub: ChrisHuber1/siem-automation

针对 Wazuh SIEM 的运维自动化系统,通过服务健康监控、AI 告警分类和 CVE 误报验证三个组件,解决 SIEM 自身宕机无感知、告警过载和漏洞误报泛滥的问题。

Stars: 0 | Forks: 0

# SIEM 自动化 针对 Wazuh SIEM 部署的自动化监控、分类和告警。在我的 Wazuh manager 崩溃且宕机 3 天都没人(包括我自己)发现后,我构建了这个系统。 该系统包含三个部分:一个用于检测并自动重启失败 SIEM 服务的 watchdog,一个用于分类告警并发送每日报告的 AI 驱动的分类 bot,以及一个用于检查标记的漏洞是否实际影响受影响主机的 CVE 验证 pipeline。 ## 为什么会有这个项目 我在一个包含多台 Linux 主机的家庭实验室中运行 Wazuh。2026 年 5 月,Wazuh manager 在重启后崩溃了;`/var/ossec/var/run/` 中过期的 PID 文件导致服务无法重启。因为生成告警的系统正是宕机的那个系统,所以没有生成任何告警。 3 天后我碰巧手动检查时才发现。这是不可接受的。 ## 组件 ### SIEM Watchdog 按 cron 计划运行,通过 SSH 登录到 SIEM 主机,并检查 Wazuh 服务的健康状况。 - 检测过期的 PID 文件并在重启前清除它们 - 自动重启崩溃的服务(每 24 小时最多尝试 2 次,以避免重启循环) - 成功重启 = HIGH 级别发现;重启失败 = CRITICAL 级别 + 电话通知 - 在 JSON 状态文件中跟踪重启尝试,避免无休止地重试 ### 2. AI 分类 Bot 通过 SSH 获取最近的 Wazuh 告警,使用 Claude 对其进行分类,并发送每日摘要。 - 预检健康检查:如果 Wazuh manager 宕机,会立即发送紧急告警,而不是尝试从死掉的服务中获取告警 - 零告警 + 健康 manager 会被标记为异常情况(而不是“平静的一天”) - 优雅处理 SSH 失败;不再因无法访问的主机而崩溃 - 通过 ntfy 推送通知发送报告 ### 3. CVE 验证 Wazuh 会激进地标记内核 CVE。其中大多数实际上并不适用于正在运行的内核版本。 - 从 Wazuh 告警中提取标记的 CVE - 通过 NVD API 检查每个 CVE 的受影响版本范围 - 与每台主机上实际运行的内核版本进行比较 - 生成报告:确认真实 vs. 误报,并附带推理过程 - 误报将获得 Wazuh 规则覆盖(level 0 抑制),从而停止生成告警 **示例发现:** Wazuh 在一台运行 6.8 版本内核的主机上标记了 CVE-2026-31461。NVD 的受影响范围从 6.13 开始。这是一个误报;该主机并未运行存在漏洞的版本。已添加抑制规则。 ### 4. 告警 - 所有 CRITICAL 发现均发送 ntfy 推送通知 - 基于文件的冷却时间(每个 agent 1 小时),防止 cron 运行产生告警垃圾信息 - 通过 Windows SAPI 发出“Master we need your input”的语音提示,用于人工介入决策 ## 决策与权衡 **选择 ntfy 而非 PagerDuty/Slack:** 这是家庭实验室,不是企业环境。ntfy 是免费且可自托管的,我可以在 30 秒内在手机上订阅。PagerDuty 有点大材小用。Slack 需要一个 workspace。而 ntfy 就能直接工作。 **基于文件的冷却而非速率限制:** 速率限制器会更优雅,但带有时间戳的文件是可调试的。我可以通过读取文件来查看上一次告警是何时触发的。如果冷却机制坏了,我可以通过删除一个文件来修复它。 **每 24 小时最多重启 2 次:** 无限重启循环比服务宕机更糟糕。如果服务在尝试 2 次后仍然无法保持运行,说明存在根本性的问题,需要人工介入查看。 **使用 Claude 进行分类,而非检测:** Wazuh 负责检测。Claude 负责对结果进行分类和优先级排序。使用 LLM 进行检测会漏掉 Wazuh 专门构建的基于规则的模式。 **自定义 Wazuh 规则而非修改默认设置:** 误报覆盖在 `local_rules.xml` 中使用自定义规则(100100+ 范围),从不修改默认规则集。这在 Wazuh 升级中得以保留,并且可以轻松查看到底调整了哪些内容。 ## 误报调整 | 规则 ID | 抑制内容 | 原因 | |---|---|---| | 100101 | 来自运维主机的 Root SSH | Cron 任务以 root 身份进行 SSH 健康检查;并非未经授权的访问 | | 100160 | CVE-2026-31461 | NVD 受影响范围从 6.13 开始;主机运行的是 6.8 | | 100170 | SIEM 主机上的 Sudo 告警 | Cloud-init 默认为服务账号提供 NOPASSWD ALL 权限 | ## 架构 ``` Cron (hourly) | v +-------------------+ +------------------+ | SIEM Watchdog |--SSH-->| SIEM Host | | (check health, | | (Wazuh manager) | | auto-restart) | +------------------+ +-------------------+ | v (findings) +-------------------+ +------------------+ | Triage Bot |--SSH-->| Wazuh API | | (Claude classify, | | (fetch alerts) | | daily report) | +------------------+ +-------------------+ | v (alerts) +-------------------+ | ntfy push |----> Phone notification | Windows SAPI |----> Audible alert +-------------------+ ``` ## 当前状态 正在我的家庭实验室的生产环境中运行。自部署以来,watchdog 已捕获并自动解决了两次 Wazuh manager 崩溃。CVE 验证消除了每个扫描周期中 10 个虚假的严重告警。分类 bot 每天都会将摘要发送到我的手机上。 ## 我会做出哪些改变 - 为 SIEM 健康状况添加 Prometheus 指标,而不是仅仅依赖基于 SSH 的检查。这将为我提供历史正常运行时间数据以及与 Grafana 的告警集成。 - CVE 验证可以缓存 NVD 响应,以避免在不同的扫描周期中对相同的 CVE 进行重复的 API 调用。
标签:Homebrew安装, Maven, Python, Wazuh, 内存分配, 告警分类, 大模型, 无后门, 漏洞验证, 自动化运维, 逆向工具