12vethamithran/NOCTRA-AI-Autonomous-SOC-Platform

GitHub: 12vethamithran/NOCTRA-AI-Autonomous-SOC-Platform

一款基于浏览器的零存储自主 SOC 平台,结合规则引擎、机器学习与 AI 分类技术,实现原始日志的安全威胁检测、自动关联取证与事件报告生成。

Stars: 1 | Forks: 0

# NOCTRA AI — 自主 SOC 平台 **NOCTRA AI** 是一个开源的、基于浏览器的安全运营中心(SOC),由 Google Gemini AI 驱动。它接收原始日志文件(CSV、JSON、syslog、EVTX、Windows Event、Apache、logfmt),运行涵盖完整 MITRE ATT&CK 杀伤链的 **43 条检测规则**,外加 **XGBoost ML 检测器**和行为异常引擎(UEBA),使用可解释的 AI 概率对每个警报进行评分,**在重复警报到达分析员手中之前将其折叠合并**,将威胁映射到 MITRE 技术,并生成取证 PDF 报告 —— 所有这些都不会在磁盘上存储任何字节。一个 **5 阶段的 ML 自我升级 pipeline** 不断从真实语料数据中重新训练阈值和字段别名。专为需要企业级威胁检测但不希望花费企业级部署时间的 SOC 分析员、蓝队和网络安全学习者而构建。 **无存储 · 跨越 MITRE ATT&CK 的 43 条规则 · XGBoost ML 检测器 · 自我升级引擎 · 可解释 AI · 附带证据的警报 · 自动去重 · L1/L2 双模式 · Docker 化** [![实时演示](https://img.shields.io/badge/Live-Production-brightgreen)](https://noctra-ai-autonomous-soc-platform.vercel.app) [![前端](https://img.shields.io/badge/Frontend-Vercel-black)](https://noctra-ai-autonomous-soc-platform.vercel.app) [![后端](https://img.shields.io/badge/Backend-Render-blue)](https://noctra-ai-autonomous-soc-platform.onrender.com/health) [![Docker](https://img.shields.io/badge/Docker-Containerized-2496ED?logo=docker&logoColor=white)](https://www.docker.com) [![许可证](https://img.shields.io/badge/License-MIT-red)](LICENSE) ## 实时演示 **[noctra-ai-autonomous-soc-platform.vercel.app](https://noctra-ai-autonomous-soc-platform.vercel.app)** 无需注册。放入一个日志文件或点击 **“运行演示场景”** 即可查看一个合成的多阶段攻击。 ## 目录 1. [什么是 SOC?](#1-what-is-a-soc-for-non-cyber-readers) 2. [NOCTRA 的功能](#2-what-noctra-does-in-one-paragraph) 3. [为什么选择 NOCTRA 而不是普通 SOC 工具](#3-why-noctra-vs-a-normal-soc-tool) 4. [检测 pipeline](#4-the-detection-pipeline) 5. [检测规则内部解析(实战示例)](#5-inside-a-detection-rule-worked-example) 6. [警报解剖](#6-anatomy-of-an-alert) 7. [43 条规则目录一览](#7-the-43-rule-catalogue-at-a-glance) 8. [AI 的集成位置](#8-where-ai-is-integrated-7-places) - [8b. XGBoost ML 模型深度解析](#8b-xgboost-ml-detection-model--deep-dive) - [8c. 自我升级 pipeline 端到端解析](#8c-ml-self-upgrade-pipeline--how-it-works-end-to-end) 9. [AI 攻击评分的计算方式](#9-how-the-ai-attack-score-is-calculated) 10. [降噪:NOCTRA 如何阻止警报洪流](#10-noise-reduction-how-noctra-stops-alert-floods) 11. [操作演示:日志文件 → PDF 报告](#11-walkthrough-log-file--pdf-report) 12. [架构](#12-architecture) 13. [部署](#13-deployment) 14. [本地开发](#14-local-development) 15. [术语表](#15-glossary-for-newcomers) 16. [常见问题](#16-faq) ## 1. 什么是 SOC?(面向非网安从业者) **SOC**(安全运营中心)是企业内部负责监控网络上所有活动的团队和软件 —— 包括登录尝试、文件传输、DNS 查询、应用错误等 —— 并试图找出看起来像**攻击者**而非正常用户的活动。 | 级别 | 角色 | 典型问题 | |------|------|------------------| | **L1 — 分诊分析员** | 第一响应人。决定警报是真实的(TP)还是无效的(FP)。 | *"这事值得叫醒别人吗?"* | | **L2 — 威胁分析员** | 深度调查员。重建攻击者的行动路线。 | *"他们触碰了什么,又是怎么进来的?"* | ## 2. NOCTRA 的功能,用一段话概括 NOCTRA AI 是一个基于浏览器的 SOC,它接收原始日志文件(CSV / JSON / syslog / Web 访问日志 / EVTX / Windows Event / Apache / logfmt),运行 **涵盖暴力破解 → 横向移动 → 数据泄露 → 云身份滥用 → EDR 文件投放的 43 条检测规则 + XGBoost ML 检测器 + 行为异常引擎(UEBA) + AI 分类器**,**折叠重复项,使得一个逻辑事件 = 一个警报**,并为分析员提供一个**带有结构化证据和 AI 推理依据的已排序警报队列**。在后台,一个 **5 阶段的自我升级 pipeline**(语料分析 → 规则合成 → 解析器提取 → 模型重训)根据标记的语料数据不断改进阈值、字段别名和 ML 模型 —— 可在夜间自动触发或通过 `POST /admin/retrain` 按需触发。分析员点击浏览,AI 给出裁定建议并解释其推理过程,平台自动将相关警报关联成 **映射到 MITRE 的攻击链**,最后只需一键即可生成 **PDF 事件报告**。没有任何数据被存储在磁盘上 —— 所有数据都保留在 RAM 中,并在会话结束时被擦除。 ## 3. 为什么选择 NOCTRA 而不是普通 SOC 工具 | | 传统 SOC 技术栈 | **NOCTRA AI** | |---|---|---| | **部署** | 需数天至数周 —— 需配置集群、许可证、接入 pipeline | **浏览器标签页即开即用。免安装。** | | **单次调查成本** | 按接入的 GB 数收费 ($$) | **每次会话免费** | | **AI 评分** | 通常是黑盒式的“风险评分” | **0–100 的 TP 概率,并附带产生该分数的实际信号** | | **为什么是这个分数?** | 极少展示 | **点击任意分数 → 显示加权信号列表** | | **MITRE ATT&CK 映射** | 附加组件 / 付费模块 | **内置。** 每条规则都映射到具体的技术 + 战术 | | **攻击链关联** | 需自定义 SPL / KQL 查询 | **自动化。** 将相关警报拼接成杀伤链叙事 | | **L1 与 L2 的区分** | 所有人使用相同的 UI | **两种专为不同层级构建的视角** | | **行为分析 (UEBA)** | 通常作为单独产品出售 | **内置。** 具备基于每用户和每 IP 基线的 σ 偏差检测 | | **存储 / 合规性** | 磁盘上需 PB 级存储 | **零字节存储。** 会话数据存活于 RAM 中,结束时即清除 | **权衡:** NOCTRA 是专为*单次会话处理单个日志文件*而设计的 —— 它不是完整的企业级 SIEM。最适合用于:事件响应、学习 SOC 分析员角色、演示、蓝队演练、入侵后分诊。 ## 4. 检测 pipeline ### 4a. 单次会话的 10 阶段 pipeline ``` flowchart LR A[01
Ingest] --> B[02
Normalize] B --> C[03
Detect] C --> D[04
ML Scan] D --> E[05
Score] E --> F[06
Enrich] F --> G[07
Chain] G --> X[08
Dedup] X --> H[09
Triage] H --> I[10
Report] classDef stage fill:#1c1c20,stroke:#e11d48,color:#fff class A,B,C,D,E,F,G,X,H,I stage ``` | # | 阶段 | 处理内容 | |---|-------|-------------| | 01 | **接入** | 自动检测格式(CSV/TSV、JSON/JSONL、Apache、syslog、Windows Event、logfmt)—— 同时参考来自 `parser_hints.json`(通过语料学习得到)的格式检测信号。任何未知的日志都会回退到通用行解析器,因此接入过程永远不会失败。 | | 02 | **标准化** | 将列标准化为统一的 schema:`timestamp, source_ip, dest_ip, dest_host, user, event_type, status, port, bytes`。**95+ 个字段别名**(40 个内置 + 55 个从 `parser_hints.json` 学习得到)涵盖了 camelCase 的云环境变体。嵌套的 JSON 会被展平,因此规则可以读取 Suricata payload 中的 `alert_signature_id` 等字段。 | | 03 | **检测** | 运行 **43 条确定性规则**(R001–R043)+ UEBA IsolationForest + 跨事件关联。规则按攻击者上下文(IP、用户、设备)对事件进行分组 —— 一次逻辑攻击 = 一个警报,而不是每个数据包产生一个。阈值支持从 `rule_config.json` 热重载(无需重启)。 | | 04 | **ML 扫描** | **XGBoost ML 检测器** (`ml_detector.py`) 使用 519 维特征向量(500 个 TF-IDF + 12 个手工设计 + 7 个格式 one-hots)对每一行进行评分。未被确定性规则捕获且置信度 ≥ 70% 的行将发出额外的 `ML-*` 警报。 | | 05 | **评分** | AI 为每个警报分配 0–1 的 TP 概率,并附带结构化的推理依据 + SHAP 特征归因。如果 Gemini 不可用,则运行启发式兜底策略。 | | 06 | **富化** | IP 信誉(AbuseIPDB / VirusTotal)、地理位置、ASN、哈希 → MITRE 技术。采用懒加载 —— 仅在分析员打开警报时调用。 | | 07 | **串并** | 将相关警报分组为攻击链。例如:登录失败激增 → 登录成功 → 权限提升 → 数据泄露 = 一个完整的杀伤链叙事。 | | 08 | **去重** | **安全网。** 使用 `(rule_id, source_ip, user, dest_ip)` 键合并跨规则和重复上传的相同警报。累加 `event_count`,并记录最早的的时间戳、最高严重程度以及在 `extra` 中展示的 `rolled_up_count`。 | | 09 | **分诊** | 带有侧边栏、playbook、AI 建议、键盘导航的 L1 队列。 | | 10 | **报告** | 生成 L1 交接班报告或 L2 取证档案 PDF。 | ### 4b. 后台 ML 自我升级周期 独立的 5 阶段 pipeline 在每天夜间(UTC 03:00)运行,或通过 `POST /admin/retrain` 按需运行: ``` flowchart LR P1[Phase 1
corpus_analyser] --> P2[Phase 2
rule_synthesiser] P2 --> P3[Phase 3
parser_pattern_extractor] P3 --> P4[Phase 4
train_model] P4 -->|hot-reload| E[(Engine)] classDef ph fill:#1c1c20,stroke:#3b82f6,color:#fff class P1,P2,P3,P4 ph ``` | 阶段 | 脚本 | 输出 | |-------|--------|--------| | 1 | `corpus_analyser.py` | `rule_insights.json` — 每条规则经 F1 优化的阈值 + 具有区分度的二元语法 | | 2 | `rule_synthesiser.py` | 修补 `rule_config.json` — 仅应用能使 F1 提升 ≥ 0.02 的更改 | | 3 | `parser_pattern_extractor.py` | `parser_hints.json` — 从语料中学习到的字段别名 + 格式检测信号 | | 4 | `train_model.py` | `models/ml_detector.pkl` — 重新训练的 XGBoost 打包文件(包含 `tfidf` + `clf` 键) | 轮询进度:`GET /admin/retrain`。所有管理端点都需要 `Authorization: Bearer `。 ## 5. 检测规则内部解析(实战示例) 每一条 NOCTRA 规则都遵循相同的三步结构:**过滤 → 聚合 → 发出**。以下是 R001 — “凭据暴力破解”: ``` filter events where status == FAILED and source_ip is set group by source_ip + 60-second sliding window threshold ≥ 5 failed logins in the same window emit ONE alert per (source_ip, window) severity = HIGH mitre_technique = T1110 evidence = list of the log indices that triggered it ``` 为什么这种结构很重要: - **逐行触发警报的循环**(反模式:为每次失败的登录发出一个警报)是 SOC 工具产生警报洪流的原因。NOCTRA 绝不会写 `for row in failed_logins:` 这样的迭代 —— 它总是先进行分组。 - **滑动时间窗口**排除了巧合。6 个月内 5 次登录失败不是暴力破解;60 秒内 5 次才是。 - **证据索引**让 UI 能够直接跳转到触发警报的原始日志行 —— 告别“相信我”式的黑盒。 想要编写自己的规则?可以使用应用内的 **Rule Builder**,或者将 YAML 规则放入 DSL 中 —— 采用相同的过滤/分组/阈值模型,无需编写 Python。 ## 6. 警报解剖 `POST /ingest` 返回的每个警报都是一个具有以下结构的 JSON 对象: ``` { "alert_id": "a-7f3c12", "rule_id": "R001", "rule_name": "Credential Brute Force", "severity": "HIGH", "tp_probability": 0.92, "description": "8 failed logins from 203.0.113.66 in a 60-second window — credential compromise: SUCCEEDED", "timestamp": "2026-05-25T02:31:14Z", "source_ip": "203.0.113.66", "user": "jdoe", "event_count": 8, "mitre_technique": "T1110", "mitre_tactic": "Credential Access", "related_log_indices": [12, 13, 15, 17, 19, 21, 22, 24], "extra": { "window_seconds": 60, "succeeded_after": true, "rolled_up_count": 1 }, "ai_rationale": "Burst of failed logins followed by success from same IP is a classic brute-force pattern.", "shap_features": [ {"feature": "failed_login_count", "contribution": 0.41}, {"feature": "success_after_failures", "contribution": 0.28}, {"feature": "source_ip_reputation", "contribution": 0.13} ] } ``` | 字段 | 告知分析员的内容 | |-------|---------------------------| | `tp_probability` | “这有多大可能是真实的?” —— 0–1,由启发式算法和 Gemini 综合得出。 | | `event_count` | 有多少原始日志事件被折叠进了这一个警报中。 | | `related_log_indices` | 触发此规则的源日志的具体行 —— 在 UI 中点击即可跳转。 | | `mitre_technique` / `mitre_tactic` | 使用业界标准的 ATT&CK 词汇描述的攻击者行为。 | | `extra.rolled_up_count` | 如果 > 1,说明此警报是 N 个几乎完全相同的警报合并而来(去重阶段)。 | | `shap_features` | AI 用于对此警报进行评分的主要信号。消除“黑盒疑虑。 | | `ai_rationale` | 针对此特定警报量身定制的一句话英文解释。 | ## 7. 43 条规则目录一览 | 家族 | 规则 ID | 示例 | MITRE 战术 | |--------|----------|----------|--------------| | **凭据与身份** | R001, R006, R007, R010, R013, R015, R016, R020, R033 | 暴力破解、非工作时间登录、新增管理员账户、多服务攻击、LSASS 转储、明文凭据、账户锁定风暴、RDP 暴力破解、Kerberoasting | Credential Access | | **权限提升** | R003 | 时间窗口内 普通用户 → 管理员 | Privilege Escalation | | **横向移动与侦察** | R002, R004, R008, R022 | 端口扫描、多主机认证、Web fuzzing 404 爆发、不可能的移动 | Discovery, Lateral Movement | | **数据泄露与 C2** | R005, R014, R021, R026, R027 | 大量出站传输、DNS 隧道、C2 信标、端口碰撞、内部扫描 | Exfiltration, Command & Control | | **Web 与应用攻击** | R024, R025, R043 | SQL 注入、Web shell / 侦察 UA、IDOR 枚举(顺序 ID 访问) | Initial Access, Discovery | | **端点与 EDR** | R011, R012, R017, R018, R019, R023, R031, R032 | 可疑的 PowerShell、进程注入、可疑的持久化、事件日志被清除、安全工具篡改、勒索软件文件写入、伪装、脚本释放 EXE | Execution, Defense Evasion, Impact | | **邮件与网络钓鱼** | R028, R029 | 可疑的邮件认证失败、带有危险附件的网络钓鱼 | Initial Access | | **云身份(AWS / Entra / M365)** | R030, R034, R035, R036, R037, R038, R039, R040, R042 | 授予云管理员权限、控制台 root 登录、CloudTrail 篡改、OAuth 同意授权、无 MFA 的 AWS API 调用、S3 异常体量、SharePoint 大量下载、云环境侦察 | Persistence, Defense Evasion, Collection | | **地理与行为异常** | R041 | 来自意外国家的登录(可通过 `rule_config.json` 配置基线) | Initial Access | | **行为分析 (UEBA)** | `UEBA-*` | IsolationForest 针对每用户/ IP 偏离基线的 σ 偏差 | 多种 | | **ML 检测器** | `ML-*` | XGBoost 模型捕获 regex 规则遗漏的攻击 —— 519 维特征向量,≥ 70% 置信度阈值 | 多种 | ## 8. AI 的集成位置(7 个地方) | # | 位置 | AI 的作用 | 不可用时的兜底方案 | |---|-------|------------------|------------------------| | 1 | **检测** | IsolationForest UEBA 模型对每个用户/IP 偏离基线的程度进行评分 | 确定性阈值规则 | | 2 | **ML 扫描** | XGBoost 分类器(基于 68k 标记记录训练)捕获规则 regex 遗漏的攻击模式 —— 519 个特征,≥ 70% 阈值 | 规则引擎覆盖大部分检测 | | 3 | **评分** | Gemini 分类器返回每个警报的 0–1 TP 概率 + 推理依据 | 10 信号启发式评分器 | | 4 | **分诊** | AI 生成针对特定警报的 TP/FP 原因 + 量身定制的响应 playbook | 静态原因库 | | 5 | **调查** | 自主 agent 产出裁定建议、关键发现、推理步骤 | 人工调查选项卡 | | 6 | **串并** | LLM 撰写通俗易懂的杀伤链叙事报告 | 结构化串并摘要 | | 7 | **自我升级** | 5 阶段 pipeline(语料分析 → 规则合成 → 解析器提取 → 重新训练)每晚自动调整阈值并重新训练 XGBoost | 引擎基于最后已知的好配置运行 | ## 8b. XGBoost ML 检测模型 — 深度解析 ML 检测器(`backend/engine/ml_detector.py`)是第二个独立的检测阶段,在所有 43 条确定性规则运行**之后**执行。它用于捕获 regex 无法表达的攻击模式。 ### 训练数据 | 属性 | 数值 | |-----------|-------| | 标记记录总数 | **68,655** | | 覆盖日志格式 | syslog, JSON, WAF, CSV, Zeek, EVTX, 通用格式 | | 标签分布 | 攻击 / 良性样本均衡分布 | | 训练脚本 | `noctra_training_data/train_model.py` | | 模型输出 | `backend/models/ml_detector.pkl`(包含 `tfidf` + `clf` 键) | ### 特征工程(519 个特征) | 分组 | 数量 | 描述 | |-------|------:|-------------| | TF-IDF 文本特征 | 500 | 来自原始日志行(前 1000 个字符)的前 500 个 n-grams | | 手工设计的特征 | 12 | 行长度、数字占比、特殊字符占比、IP 计数、`has_error`、`has_privesc`、`has_exfil`、`has_injection`、`has_user`、`has_timestamp`、大写字母比例、空格比例 | | 格式 one-hots | 7 | `syslog`, `json`, `waf`, `csv`, `zeek`, `evtx`, `generic` | ### 评分与严重程度映射 | 置信度 | 严重程度 | 含义 | |------------|----------|---------| | ≥ 92% | `CRITICAL` | 高度确定的攻击模式 | | ≥ 80% | `HIGH` | 强烈的攻击信号 | | ≥ 70% | `MEDIUM` | 可能是攻击 —— 值得审查 | | < 70% | *(不触发)* | 低于阈值 —— 被抑制 | ML 警报携带格式为 `ML-Rxxx` 的规则 ID(例如 `ML-R001`),并在 `alert.extra` 中包含 `ml_confidence` 和 `raw_snippet`。它们**仅**针对未被确定性规则覆盖的行发出 —— 因此 ML 层增加了信号而不会产生重复。 ### MITRE 推断 ML 检测器使用按优先级排序的 regex 信号从原始行中推断战术/技术(凭据失败 → 注入 → 权限提升 → 阻止/拒绝操作 → 云事件 → 数据泄露 → PowerShell → 侦察)。默认兜底:`Command and Control / T1071`。 ## 8c. ML 自我升级 pipeline — 端到端工作原理 ``` POST /admin/retrain │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ retrain_orchestrator.py │ │ │ │ Phase 1 → corpus_analyser.py │ │ • Reads 68k records from normalized/training_corpus.ndjson │ │ • Grid-searches threshold params (min_failures, min_ports…) │ │ to maximise per-rule F1 │ │ • Mines discriminative bigrams per rule (lift ≥ 30.0) │ │ • Outputs: rule_insights.json │ │ │ │ Phase 2 → rule_synthesiser.py │ │ • Reads rule_insights.json │ │ • Only applies threshold changes where ΔF1 ≥ 0.02 │ │ • Guards against generic words as IoC patterns │ │ • Patches rule_config.json + writes synthesis_report.json │ │ │ │ Phase 3 → parser_pattern_extractor.py │ │ • Mines field aliases per format (logfmt, json, csv…) │ │ • Generates format-detection signals (≥ 85% format purity) │ │ • Outputs: backend/engine/parser_hints.json │ │ │ │ Phase 4 → train_model.py │ │ • Rebuilds TF-IDF + XGBoost pipeline on full corpus │ │ • Saves backend/models/ml_detector.pkl │ │ │ │ Hot-reload → engine picks up new config + model on next call │ └─────────────────────────────────────────────────────────────────┘ ``` **安全保障:** - 最低 F1 提升门槛(`MIN_F1_IMPROVEMENT = 0.02`) —— 防止由于嘈杂的语料导致性能倒退 - 通用词黑名单可防止将常见 token("failed"、"password"、"scan"、"type")作为 IoC 模式注入 - 最小提升阈值(`MIN_LIFT_PATTERN = 30.0`) —— 仅添加在攻击中比在良性样本中可能性高出 30 倍的模式 - 拒绝并发重新训练 —— 可通过 `GET /admin/retrain` 轮询状态 - 每个脚本都有 600 秒的超时限制,以防止 pipeline 挂起 **监控:** ``` # 触发重新训练 curl -X POST https://your-backend/admin/retrain \ -H "Authorization: Bearer $ADMIN_SECRET" # 轮询进度 curl https://your-backend/admin/retrain \ -H "Authorization: Bearer $ADMIN_SECRET" # → {"running": true, "phase": "corpus_analyser", "progress_pct": 25, ...} ``` ## 9. AI 攻击评分的计算方式 每个警报都会获得一个 **0–100 的 TP 概率**。 | 信号 | 权重 | |--------|-------:| | 严重程度 = `CRITICAL` | +25 | | 严重程度 = `HIGH` | +15 | | 匹配确定性规则 | +10 | | UEBA 基线偏差 (>2σ) | +18 | | 命中跨事件关联 | +12 | | 链接了 ≥ 2 个 MITRE 技术 | +15 | | 映射了单个 MITRE 技术 | +5 | | IsolationForest 异常得分 > 0.6 | +10 | | 同一警报上关联了 ≥ 5 个事件 | +8 | 这些分数会被累加,截取至 0–100 的范围内,然后与 Gemini 分类器进行混合加权(在可用时,权重为 70% AI / 30% 启发式)。 | 得分 | 级别 | |------:|------| | ≥ 75% | **高置信度 TP** | | 45–74% | **可能的 TP** | | < 45% | **低置信度** | ## 10. 降噪:NOCTRA 如何阻止警报洪流 SOC 分析员忽视其工具的第一大原因是**警报疲劳** —— 当一次逻辑上的攻击产生了 100 个警报,而真实信号被淹没在重复项中时。NOCTRA 在四个层面上解决了这个问题: ### 第 1 层 — 规则先聚合再发出 每个规则根据攻击上下文(`source_ip`、`user`、`device`、`sender`)对其匹配的事件进行分组,并发出**每组一个警报**,而不是每行一个。投放了 200 个文件的勒索软件运行过程 = **1** 个警报,其中包含 `event_count: 200` 以及 `extra` 中的文件名样本。 ### 第 2 层 — 滑动时间窗口 基于数量的规则(R001 暴力破解、R002 端口扫描、R008 模糊测试)要求阈值**在狭窄的时间窗口内**(60 秒、30 秒、5 分钟)被触发。一周内分散出现的 20 个 HTTP 404 是正常的浏览噪音;五分钟内的 20 个则是模糊测试。这一项检查就消灭了绝大多数“日志文件跨越 7 天”的误报。 ### 第 3 层 — 全 pipeline 的去重扫描 在所有规则运行完毕后,接入 pipeline 会进行最后一次扫描。任何共享 `(rule_id, source_ip, user, dest_ip)` 的警报都会被合并到最早生成的警报中 —— 保留更高的严重程度、更高的置信度,并记录 `rolled_up_count`,以便 UI 可以显示“抑制了 5 个重复项”。这能捕获到单规则聚合遗漏的任何内容,并防止同一活动的重复上传导致警报累积。 ### 第 4 层 — 解析器的稳健性确保规则能够真正触发 “警报过多”的另一半原因是“因为字段被错误解析而导致的错误警报”。NOCTRA 的解析器: - 当状态列存在但为空时,会重新运行状态启发式算法(这是一种常见的 CSV 怪癖,即 `keep_default_na=False` 会使空单元格看起来像是被填充了)。 - 为每个规范名称携带 **95+ 个字段别名**(40 个内置 + 55 个从 `parser_hints.json` 学习得到)—— `sourceIPAddress`、`source_ip`、`srcip`、`ClientIp`、`remote_addr`、`caller_ip_address`、`initiatedBy.user.ipAddress`、`hostname`、`destination` 等等,全都会被折叠归入对应的规范字段。 - 将嵌套的 JSON 展平,因此 Suricata 的 `alert.signature.id` 和 AWS 的 `userIdentity.arn` 最终都会变成规则可以读取的扁平列。 - 将每个空字符串/`"none"`/`"null"` 字符串标准化为 Python 的 `None`,以便 `.notna()` 检查在各种云 schema 中表现一致。 **最终效果:** 真实的攻击会触发预期的少数几个截然不同的警报。干净的日志不会触发任何警报。重复上传不会导致警报成倍增加。 ## 11. 操作演示:日志文件 → PDF 报告 ``` sequenceDiagram autonumber actor A as Analyst participant UI as Browser (NOCTRA UI) participant API as FastAPI Backend participant AI as Gemini AI A->>UI: Drop log file on Upload page UI->>API: POST /ingest API-->>UI: Session ready — ranked alerts A->>UI: Open Triage queue A->>UI: Click alert → drawer opens UI->>API: GET /verdict-assist A->>UI: Confirm TP / Dismiss FP A->>UI: Click "Run AI Agent" UI->>API: POST /agent-investigate API->>AI: Multi-step reasoning AI-->>API: Verdict + findings A->>UI: Export Report UI-->>A: PDF incident dossier ``` ## 12. 架构 ``` flowchart TB subgraph Browser["Browser (Vite + React 18)"] L[Landing] & U[Upload] & T[Triage] & I[Investigation] & H[Hunt] & Rb[Rule Builder] & D[Dashboard] end subgraph Backend["FastAPI Backend (Python 3.11)"] R[Routers] & E[Detection Engine] & S[Session Store] & AIS[AI Service] & TIS[Threat Intel] end subgraph External["External APIs"] G[Google Gemini] & AB[AbuseIPDB] & VT[VirusTotal] end Browser <-->|REST / JSON| R R --> E & S & AIS & TIS AIS --> G TIS --> AB & VT ``` ## 13. 部署 | 层级 | 平台 | URL | |-------|----------|-----| | **前端** | Vercel | [noctra-ai-autonomous-soc-platform.vercel.app](https://noctra-ai-autonomous-soc-platform.vercel.app) | | **后端** | Render | `https://noctra-ai-autonomous-soc-platform.onrender.com` | ### Vercel — 前端 | 设置 | 值 | |---------|-------| | 根目录 | `frontend` | | 构建命令 | `npm run build` | | 输出目录 | `dist` | | 安装命令 | `npm install` | **环境变量:** | 键 | 值|-----|-------| | `VITE_API_URL` | 你的 Render 后端 URL | ### Render — 后端 | 设置 | 值 | |---------|-------| | 根目录 | `backend` | | 运行时 | Python 3 | | 构建命令 | `pip install -r requirements.txt` | | 启动命令 | `uvicorn main:app --host 0.0.0.0 --port $PORT` | **环境变量:** | 键 | 描述 | |-----|-------------| | `GEMINI_API_KEY` | Google AI Studio 密钥 | | `ABUSEIPDB_API_KEY` | AbuseIPDB 密钥 | | `VIRUSTOTAL_API_KEY` | VirusTotal 密钥 | | `CORS_ORIGIN` | 你的 Vercel 前端 URL | | `SESSION_TTL_MINUTES` | `30` | | `MAX_UPLOAD_MB` | `25` | | `ADMIN_SECRET` | 用于 `POST /admin/retrain` 的 Bearer token(可选 —— 留空则禁用身份验证) | | `RETRAIN_SCHEDULE_HOUR_UTC` | 用于夜间重训的 UTC 小时时间(默认为 `3`) | ## 14. 本地开发 ### 方案 A — Docker(推荐) ``` # 复制并填入你的 API keys cp backend/.env.example backend/.env # 启动两个服务 docker compose up --build ``` 前端:[http://localhost:3000](http://localhost:3000) · 后端:[http://localhost:8000](http://localhost:8000) ### 方案 B — 手动设置 有关完整的手动设置说明,请参阅 [SETUP.txt](SETUP.txt)。 ``` # Backend cd backend python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt cp .env.example .env uvicorn main:app --reload --port 8000 # Frontend (新 terminal) cd frontend npm install npm run dev ``` 打开 [http://localhost:5173](http://localhost:5173)。 ### 方案 C — 自托管生产环境 ``` cp .env.example .env.prod # 使用真实的 API keys 和 URLs 填入 .env.prod docker compose --env-file .env.prod -f docker-compose.prod.yml up -d ``` ## 15. 新手术语表 | 术语 | 含义 | |------|---------| | **警报** | 平台标记“这看起来很可疑”。是一个聚合后的事件,而不是单个日志行。 | | **TP / FP** | 真阳性(真实的攻击)/ 假阳性(噪音)。 | | **分诊** | 快速将警报分类为 TP 还是 FP。 | | **MITRE ATT&CK** | 业界权威的攻击者技术目录。每一条 NOCTRA 规则都会映射到其中一项。 | | **技术 vs 战术** | *战术*是攻击者的目标(如“Credential Access”);*技术*是他们实现目标的手法(如“T1110 – Brute Force”)。 | | **UEBA** | 用户与实体行为分析 —— 使用 IsolationForest 标记偏离基线的行为。 | | **攻击链** | 一系列相关的警报,共同描述了一个完整的攻击故事(例如 暴力破解 → 提权 → 泄露)。 | | **杀伤链** | 描述攻击阶段的概念模型:侦察 → 武器化 → 投递 → 利用 → 安装 → C2 → 目标行动。 | | **IOC** | 入侵指标 —— 在攻击中出现的 IP、域名、哈希或用户。 | | **SHAP** | 一种解释哪些特征最影响了 ML 模型评分的技术。 | | **XGBoost** | ML 检测器使用的梯度提升树集成模型。68k 条训练记录,519 个特征(500 个 TF-IDF + 12 个手工设计 + 7 个格式 one-hots),≥70% 的置信度阈值。 | | **TF-IDF** | 词频-逆文档频率 —— 将原始日志文本转换为数值向量。前 500 个 n-grams 构成了 96% 的 ML 特征向量。 | | **自我升级 pipeline** | 5 阶段的后台任务(corpus_analyser → rule_synthesiser → parser_pattern_extractor → train_model),可根据标记的日志数据自动调整检测规则。在夜间运行或通过 `POST /admin/retrain` 按需运行。 | | **L1 / L2** | Tier-1(分诊与响应)/ Tier-2(追踪与关联)。 | | **滑动窗口** | 随着事件移动的时间范围 —— “在任何 60 秒的跨度内出现 5 次登录失败”,而不是“在固定的过去一分钟内”。 | | **聚合** | 将许多匹配的事件折叠成一个带有计数的警报,而不是每个事件生成一个警报。 | | **去重 / 折叠** | 全 pipeline 范围内的扫描,合并共享了规则 + 攻击者 + 目标的警报。阻止警报洪流。 | | **证据** | 触发规则的确切日志行索引 —— 让分析员可以亲自核实,而不仅仅是盲目信任。 | | **字段别名** | 许多日志源对同一事物使用不同的命名(`source_ip` vs `sourceIPAddress` vs `client_ip`)。别名将它们统一折叠为一个规范名称。 | | **无存储** | 任何数据都不会持久化到磁盘。会话仅存在于服务器 RAM 中,空闲 30 分钟后将被擦除。 | ## 16. 常见问题 **问:NOCTRA 会取代 Splunk / Sentinel 吗?** 不会。NOCTRA 适用于单次会话处理单个日志文件 —— 如事件响应、学习、演示、入侵后分诊。持续的企业级监控请使用完整的 SIEM。 **问:AI 会将我的原始日志发送给 Google 吗?** 不会。只有警报摘要包(规则名称、MITRE 标签、时间戳)会被发送给 Gemini。原始日志行保留在你的后端 RAM 中。 **问:如果 Gemini 宕机了或者我没有 API 密钥怎么办?** 一切仍会正常运作。平台会自动回退到 10 信号的确定性评分器。 **问:“无存储”是如何强制执行的?** 会话存在于进程内存的 Python 字典中。清理任务会在 30 分钟不活动后将其驱逐。没有数据库,没有磁盘写入。 **问:我可以添加自己的规则吗?** 可以 —— Rule Builder 自带四个模板。你可以组合多条件过滤器、分配严重程度、映射 MITRE 技术,并针对当前活动会话进行测试触发。 **问:我上传了两次相同的日志,得到了两次相同的警报。这是一个 bug 吗?** 不是 —— 每次上传都会创建一个独立的会话。在单个会话内,NOCTRA 会积极地进行去重(上文的第 3 层)。而在不同会话之间,历史记录被有意隔离,以确保演示和调查之间不会互相干扰。 **问:某条规则没有在我预期会触发的日志上触发。我该检查什么?** 依次检查这三点:(1) 解析器是否正确映射了你的列名?打开会话详情页 —— 如果 `source_ip` 显示为空行,说明你的日志使用了尚未被设置别名的名称。(2) 规则的阈值/时间窗口是否真的匹配?基于体量的规则需要突发量出现在其时间窗口内。(3) 是否被去重扫描合并到了另一个警报中?查看相邻警报上的 `extra.rolled_up_count > 1`。 **问:为什么是“43 条规则”?以后还会增加吗?** 43 是目前覆盖 MITRE ATT&CK 矩阵的规则总数,包含了从凭据获取到云持久化、EDR 检测以及 IDOR 枚举(R001–R043)的各项内容。ML 自我升级 pipeline (`POST /admin/retrain`) 可以从语料数据中合成新的规则候选。手动添加一条规则只需在 [`engine/rules.py`](backend/engine/rules.py) 中编写单个函数。 **问:NOCTRA 是如何区分“聚合”和“抑制”的?** 聚合发生在一条规则*内部*(将匹配同一规则的多行组合在一起)。去重发生在 pipeline 末端、跨越所有规则进行(合并指向同一攻击者+目标的警报)。两者都会保留 `event_count`,因此什么都不会“丢失” —— 去掉的仅仅是单行日志带来的噪音。 **问:目前实际支持哪些日志格式?** CSV / TSV(支持任意分隔符,表头大小写混用亦可)、JSON / JSONL / NDJSON(自动展平嵌套对象)、Apache combined / common、syslog(RFC 3164 + 5424)、Windows Event Log 文本导出、logfmt 键=值对、通用的自由文本(按行记录事件)。特定云端支持:AWS CloudTrail JSON、Entra Sign-In + Audit 日志、M365 Unified Audit、Defender for Endpoint 导出、Suricata EVE JSON。

NOCTRA AI · 自主 SOC · v4.0 · 43 条规则 · XGBoost ML 检测器 · 自我升级引擎 · 自动去重 · 天生无存储 · MIT License

标签:AMSI绕过, Cloudflare, MITRE ATT&CK, SOC平台, UEBA, XGBoost, 威胁检测, 安全运营, 扫描框架, 请求拦截, 逆向工具