aakashsingh-sec/unified-security-alert-aggregator

GitHub: aakashsingh-sec/unified-security-alert-aggregator

面向安全运营中心的轻量级告警聚合层,通过对多工具告警进行规范化、去重和关联,减少重复处理并缓解告警疲劳。

Stars: 0 | Forks: 0

# 统一安全告警聚合器 ## 1. 项目简介 SOC(安全运营中心)经常会发现,同一个底层事件会被技术栈中的每个工具独立上报:一次暴力破解登录会在几分钟内分别出现在 SIEM、EDR 和 NIDS 传感器中。分析师最终会对同一个事件进行三到四次重复分类处理,并且必须记得在每个控制台中分别将其关闭。这是导致安全运营中告警疲劳和跟进遗漏的最常见原因之一。 本项目是一个轻量级的告警聚合层,构建于多种检测工具(2 个实时连接器 - Wazuh 和 Suricata - 加上 4 个模拟集成 - LogRhythm、CrowdStrike、Tenable 和 Darktrace)之上,将每个告警规范化为统一的 schema,通过 SHA-256 指纹技术对完全重复的告警进行去重,并将相关告警(相同资产 + 相同告警类型 + 在 2 小时时间窗口内)关联为单个事件。分析师只需解决一次该事件,所有工具中关联的每个告警就会同时变为已解决状态。 ## 截图 ### 事件仪表板 ![事件仪表板](https://static.pigsec.cn/wp-content/uploads/repos/cas/19/1953693b190d50bb3019140d2fc946e9a8852843bb7f2fc3e0c0f3791550761b.png) *监控 6 个工具,将 9 条原始告警关联为 6 个可执行的事件* ### 跨工具事件时间线 ![事件时间线](https://raw.githubusercontent.com/aakashsingh-sec/unified-security-alert-aggregator/main/screenshots/02_incident_timeline.png) *Wazuh(严重性 10)、CrowdStrike(高)、LogRhythm(78)均检测到了相同的暴力破解攻击 — 并被关联为一个事件* ### 修复一次,处处解决 ![已解决的事件](https://raw.githubusercontent.com/aakashsingh-sec/unified-security-alert-aggregator/main/screenshots/04_resolved_incident.png) *将一个事件标记为已解决,会级联影响到所有源工具中所有关联的告警,并同步更新* ### 单资产风险排行榜 ![单资产视图](https://raw.githubusercontent.com/aakashsingh-sec/unified-security-alert-aggregator/main/screenshots/05_per_asset_leaderboard.png) *WIN-DBSERVER01 同时被 Tenable(漏洞)、Darktrace(数据外泄)和 Wazuh(横向移动)标记* ### 单工具统计 ![单工具统计](https://raw.githubusercontent.com/aakashsingh-sec/unified-security-alert-aggregator/main/screenshots/06_per_tool_stats.png) ### 摄入审计日志 ![摄入日志](https://raw.githubusercontent.com/aakashsingh-sec/unified-security-alert-aggregator/main/screenshots/07_ingest_log.png) ## 2. 架构 ``` Wazuh API Suricata eve.json LogRhythm (mock) CrowdStrike (mock) | | | | v v v v +------------------------------------------------------------------------+ | ingestor.py (per-tool parsers) | | field mapping -> normalizer.py (severity, MITRE, fingerprint) | +------------------------------------------------------------------------+ | v +-------------------+ | correlator.py | | dedup -> suppress | | -> correlate | +-------------------+ | v +-------------------+ | SQLite (db.py) | | alerts/incidents | | assets/ingest_log | | suppressions | +-------------------+ | v +-------------------+ | app.py | | Streamlit UI | | 4 dashboard views | +-------------------+ ``` Tenable 和 Darktrace 的数据接入方式与 LogRhythm 和 CrowdStrike 相同 - 通过 `mock_generator.py` 的 payload 以及 `ingestor.py` 中的专用解析器。 ## 3. 设置 ``` cd C:\Users\aakas\Desktop\project2_alert_aggregator py -3.11 -m pip install -r requirements.txt # 可选:配置真实的 Wazuh / Suricata 连接 copy .streamlit\secrets.toml.example .streamlit\secrets.toml # 然后使用真实的 credentials/paths 编辑 .streamlit\secrets.toml # Seed attack-chain 演示场景(清除现有数据并重新 seed) py -3.11 generate_demo.py # 启动 dashboard py -3.11 -m streamlit run app.py ``` 如果没有 `secrets.toml`,应用程序依然可以完全在模拟/演示数据下运行 - 侧边栏会显示一条警告,提示 Wazuh/Suricata 未配置,并且“加载演示数据”按钮在任何情况下都可以正常工作。 ## 4. 安全说明 - **仅限 Localhost。** `.streamlit/config.toml` 将服务器绑定到 `localhost:8501`;默认情况下它绝不会暴露在网络中。 - **无硬编码凭证。** Wazuh 凭证和 Suricata 日志路径仅从 `st.secrets` 中读取。仅提交了一个占位用的 `secrets.toml.example`;真正的 `secrets.toml` 已被 git-ignore。 - **全面使用参数化 SQL。** `db.py`、`correlator.py` 和 `app.py` 中的每个查询都使用 `?` 占位符。此代码库中完全没有使用 f-string 拼接的 SQL 语句。 - **实时摄入路径中没有 DELETE 语句。** 由真实摄入产生的告警和事件均为只追加模式;解决状态和误报标记通过 `status` 列进行更新,从而确保数据集为事后审查保留取证完整性。唯一的例外是 `generate_demo.py --reset`,这是一个演示数据工具,专门用于清除并重新填充合成数据,以确保重复的演示运行保持可重现性 - 它不属于生产环境的摄入/关联 pipeline。 - **SQLite 加固 PRAGMA**(`journal_mode=WAL`、`synchronous=FULL`、`foreign_keys=ON`、`secure_delete=ON`、`temp_store=MEMORY`)会在 `db.py` 中每次打开连接时应用。 - **防御性解析。** `ingestor.py` 中的每个特定工具解析器都将字段提取包装在 `try/except` 中 - 单个格式错误的记录会被记录并跳过,而不会导致整个摄入批次崩溃。 - 在任何渲染摄入数据的地方都**没有使用 `unsafe_allow_html=True`**。 - 定期针对 `requirements.txt` 运行 `pip-audit`(或 `py -3.11 -m pip install pip-audit && pip-audit`),以检查依赖项中是否存在已知的 CVE。 ## 5. 相比现有工具的优势与存在意义 商业的 SOAR/SIEM 关联引擎解决了这个问题,但它们价格昂贵、体积庞大,并且通常需要完整的供应商技术栈才能发挥真正的价值。大多数中小型安全团队要么没有 SOAR,要么拥有的 SOAR 只能从其部分工具中摄入数据。本项目以透明、可审计的约 1,500 行 Python 代码演示了核心机制 - 基于指纹的去重加上基于时间/资产窗口的关联 - 任何分析师都可以从头到尾阅读这些代码,在不到一小时内扩展出一个新的 connector,并完全在一台笔记本电脑上运行,无需任何付费许可。 ## 6. 技术栈 - Python 3.11 - SQLite(标准库 `sqlite3`,WAL 模式) - Streamlit(仪表板 UI) - pandas(表格数据处理) - requests(Wazuh REST API) - Wazuh REST API(实时)和 Suricata `eve.json`(实时,通过偏移量追踪进行 NDJSON tail);LogRhythm/CrowdStrike/Tenable/Darktrace 通过 schema 精准的 mock payload 生成器进行模拟 ## 7. 关联引擎的工作原理 每个传入的告警都会被规范化为通用的 schema,并根据源工具 + 资产 IP + 告警类型 + 事件小时数分配一个 SHA-256 指纹。完全重复的告警(相同指纹)将被丢弃。然后针对未解决的事件检查新告警:如果针对同一资产和告警类型存在一个未解决的事件,且其 last_seen 时间戳在 2 小时内,则该告警将关联到该事件。否则,将创建一个新事件。风险评分按事件计算(critical=10,high=5,medium=2,low=1),并按资产进行汇总,从而为分析师提供一个根据实际暴露程度(而非告警数量)排序的实时风险排行榜。 ## 8. 简历要点 构建了统一安全告警聚合器(Python 3.11 + Streamlit + SQLite),可摄入来自 6 个安全工具(Wazuh、Suricata、LogRhythm、CrowdStrike、Tenable、Darktrace)的告警,通过自动化的 MITRE ATT&CK 映射将其规范化为通用 schema,利用 SHA-256 指纹进行去重,并使用基于时间窗口和资产的引擎将相关告警关联为事件 — 通过“修复一次,处处解决”的解决工作流,将 9 条原始告警精简为 6 个可执行的事件。 ## 验证清单 1. `py -3.11 generate_demo.py` - 打印一张事件汇总表(9 条告警,6 个事件),无错误。 2. `py -3.11 -m streamlit run app.py` - 在 `http://localhost:8501` 加载。 3. 浏览所有 4 个视图 - 演示场景中的数据在每个视图中均可见。 4. 从“事件仪表板”解决一个事件 - 确认其时间线中每个关联的告警都变为 `resolved`。 5. 打开“摄入日志”视图 - 确认演示批次出现,并具有正确的 fetched/new/duplicate 计数。
标签:Kubernetes, Suricata, Wazuh, 告警聚合, 安全信息与事件管理, 安全运营, 扫描框架, 搜索引擎爬取, 现代安全运营, 逆向工具