JustinwkWan/NetSentinel

GitHub: JustinwkWan/NetSentinel

一款结合 LLM 代理与威胁情报的网络安全工具,通过解析网络流量自动检测异常并生成结构化的威胁分析报告。

Stars: 1 | Forks: 0

# NetSentinel 一款用于网络安全的 AI agent,能够获取 PCAP 文件(或实时流量),检测异常网络流,并使用由 CVE 和 MITRE ATT&CK 威胁情报支持的 ReAct 风格 agent 循环自主调查每个标记的流。输出结果为结构化的威胁报告,可在 Web 仪表板或 CLI 中查看。 ## 架构 ``` PCAP file / live capture | v [ Ingestion ] ---> FlowRecords (aggregated network flows) | v [ Detection ] ---> FlaggedFlows (anomalous flows with scores) | v [ Agent (LangGraph ReAct loop) ] |--- cve_lookup tool ---------> [ RAG Store (ChromaDB) ] |--- attack_technique_lookup -> [ RAG Store (ChromaDB) ] | v [ Structured Threat Reports ] | +--> CLI output +--> FastAPI backend ---> React dashboard ``` **4 个核心层:** 1. **Ingestion** - 通过与源无关的 `PacketSource` 接口读取 PCAP/pcapng 文件,将数据包聚合为带有派生特征(数据包速率、平均数据包大小)的 `FlowRecord` 对象。 2. **Detection** - 使用 `Detector` 协议标记异常流。可通过 `--detector` 标志选择 `StubDetector`(基于规则)和 `LstmDetector`(在正常流量上训练的 LSTM autoencoder)。 3. **Agent** - LangGraph ReAct 循环,用于调查每个标记的流。Agent 会决定调用哪些工具,对结果做出反应,并决定何时生成报告。设置硬迭代上限作为护栏。 4. **RAG** - 包含 CVE 条目和 MITRE ATT&CK 技术的 ChromaDB 向量存储,在自然边界上进行切分(一个 CVE = 一个 chunk,一个技术 = 一个 chunk)。 另外还有建立在基础之上的两个同级层: - **Evaluation** (`eval/`) - LLM-as-judge 评估工具,使用偏见缓解措施(rubric 评分、反冗长、可替换的 judge 模型),根据带标签的数据集对 agent 报告进行评分。 - **Web app** (`api/` + `web/`) - FastAPI 后端和 React 仪表板,用于运行 pipeline、浏览本地 pcap 以及从浏览器驱动实时捕获。 ## 技术栈 - **编程语言:** Python(核心)+ TypeScript(前端) - **数据包处理:** scapy - **异常检测:** PyTorch(LSTM autoencoder) - **向量存储:** ChromaDB - **Agent 编排:** LangGraph(ReAct 循环) - **LLM:** Anthropic Claude API(通过兼容 Anthropic 的 endpoint 支持 DeepSeek) - **后端 API:** FastAPI + Uvicorn - **前端:** React + Vite + Tailwind CSS - **实时捕获:** dumpcap (Wireshark) ring buffer - **CLI 入口点:** `netsentinel/cli.py` ## 设置 ### 前置条件 - Python 3.10+ - [Anthropic API key](https://console.anthropic.com/)(或 DeepSeek key —— 参见配置) - Node.js 18+ 和 npm —— 仅用于 Web 仪表板 - Wireshark / `dumpcap` —— 仅用于实时捕获 ### 安装 ``` # 克隆 repository git clone https://github.com/JustinwkWan/NetSentinel.git cd NetSentinel # 创建并激活虚拟环境 python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate # 安装依赖 pip install -r requirements.txt ``` ### 配置 在项目根目录下创建一个包含您的 API key 的 `.env` 文件: ``` cp .env.example .env # 编辑 .env 并添加你的 API key ``` ``` ANTHROPIC_API_KEY=your-api-key-here ``` **使用 DeepSeek(或其他兼容 Anthropic 的提供商):** 改为设置 model, base URL 和 key。NetSentinel 通过 `langchain-anthropic` 与任何兼容 Anthropic 的 endpoint 通信。 ``` LLM_MODEL=deepseek-v4-pro LLM_BASE_URL=https://api.deepseek.com/anthropic DEEPSEEK_API_KEY=your-deepseek-key ``` 所有可调设置(模型名称、检索 `k` 值、agent 迭代上限, 检测器阈值、路径)都位于 `config.py` 中 —— 代码中没有散落的魔法数字。 ### 构建 RAG Store 在运行 pipeline 之前,使用威胁情报数据构建 ChromaDB 向量存储: ``` python scripts/build_rag_store.py ``` 这将在 `data/chroma/` 处创建一个 ChromaDB collection,其中包含 CVE 条目(以及第二阶段的 ATT&CK 技术)。 ## 用法 ### 在 PCAP 文件上运行 pipeline ``` python -m netsentinel.cli # 使用 LSTM detector 替代默认 stub python -m netsentinel.cli --detector lstm ``` 使用内置示例: ``` python -m netsentinel.cli data/pcaps/sample_suspicious.pcap python -m netsentinel.cli data/pcaps/sample_suspicious.pcap --detector lstm ``` 该 pipeline 将: 1. 解析 PCAP 并组装网络流 2. 标记可疑流(stub:基于规则,lstm:重建误差) 3. 使用 AI agent 调查每个标记的流 4. 打印结构化的威胁报告 ### 训练 LSTM 检测器 ``` # 生成用于训练的正常流量 python scripts/generate_training_pcap.py # 训练模型 python scripts/train_lstm.py ``` ### 运行演示 ``` python scripts/run_demo.py ``` ### Web app(仪表板) Web app 提供了一个浏览器 UI,用于运行 pipeline 和查看报告, 无需解析终端输出。它由两部分组成:FastAPI 后端和 React/Vite 前端。 ``` # Terminal 1 — backend (http://127.0.0.1:8765) source venv/bin/activate uvicorn api.main:app --host 127.0.0.1 --port 8765 --reload # Terminal 2 — frontend (http://localhost:5173) cd web npm install # first time only npm run dev ``` 打开 http://localhost:5173。在仪表板中,您可以: - **从 `data/pcaps/` 运行** — 从下拉菜单中选择一个内置的 pcap,或上传一个。 - **浏览本地文件夹** — 将后端指向您机器上的任意文件夹并就地运行 pcap(无需复制)。 - **实时捕获** — 启动/停止滚动捕获;每个完成的窗口都会被自动分析。 - **查看报告** — 每个被标记流的严重程度、威胁类型、摘要、CVE、ATT&CK 技术和修复建议,以及运行历史记录。 前端将 `/api/*` 代理到后端(参见 `web/vite.config.ts`)。 ### 实时捕获 将实时流量捕获到滚动的 pcapng ring buffer 中,并在每个窗口完成时进行分析。 有两种驱动方式: **从仪表板** — 使用“实时捕获”面板(开始/停止,接口, 检测器)。后端管理 `dumpcap` 并在每次关闭轮转时自动运行 pipeline,在停止时清理捕获文件。 **从 CLI** — 两个独立脚本: ``` # Terminal A — 捕获 60秒窗口,10文件滚动缓冲区(约10分钟) sudo ./scripts/live_capture.sh # Terminal B — 在每个已完成窗口上运行 pipeline DETECTOR=lstm ./scripts/watch_and_run.sh ``` ### 评估测试工具 使用带有偏见缓解措施的 LLM-as-judge 对带标签数据集中的 agent 报告进行评分 (基于 rubric 的评分、反冗长指令、可通过 `EVAL_JUDGE_MODEL` 更换的 judge 模型)。 ``` # 运行完整 eval set python -m eval.harness --save # 运行特定用例 python -m eval.harness --cases reverse_shell_4444 ssh_brute_force ``` 结果会打印出每个 case 的明细以及总分,`--save` 会将 原始结果写入 `data/eval/eval_results.json`。 ### 运行测试 ``` pytest tests/ ``` ## 项目结构 ``` NetSentinel/ ├── config.py # Central config (model, k values, thresholds) ├── data/ │ ├── pcaps/ # Sample + live-capture PCAP files │ ├── threat_intel/ # Raw CVE/ATT&CK data │ ├── chroma/ # ChromaDB store (gitignored, built by script) │ └── eval/ # Eval results (gitignored) ├── netsentinel/ │ ├── cli.py # CLI entry point │ ├── ingestion/ │ │ ├── sources.py # PacketSource interface, PcapFileSource │ │ └── flows.py # FlowRecord dataclass │ ├── detection/ │ │ ├── base.py # Detector Protocol, FlaggedFlow │ │ ├── stub.py # StubDetector (rule-based) │ │ └── lstm.py # LstmDetector (LSTM autoencoder) │ ├── rag/ │ │ ├── store.py # ChromaDB query interface │ │ ├── chunking.py # Natural-boundary chunkers │ │ └── build_store.py # Download + chunk + embed CVE/ATT&CK │ └── agent/ │ ├── graph.py # LangGraph ReAct graph │ ├── state.py # Agent state definition │ ├── tools.py # cve_lookup, attack_technique_lookup │ ├── prompts.py # System and investigation prompts │ └── report.py # ThreatReport dataclass ├── eval/ # Evaluation harness (LLM-as-judge) │ ├── dataset.py # Labeled eval cases │ ├── judge.py # Rubric-based judge with bias mitigations │ ├── harness.py # Runs agent + judge over the dataset │ └── report.py # Aggregate scoring + summary ├── api/ # FastAPI backend │ ├── main.py # Routes: pcaps, runs, capture, local browse │ ├── jobs.py # Background job store + pipeline orchestrator │ ├── capture.py # Live-capture manager (dumpcap ring buffer) │ └── models.py # Pydantic schemas ├── web/ # React + Vite + Tailwind dashboard │ └── src/ │ ├── api.ts # Typed API client │ └── components/ # PcapSelector, RunControls, LiveCapturePanel, … ├── scripts/ │ ├── build_rag_store.py # Build the RAG store │ ├── generate_training_pcap.py # Generate normal traffic for LSTM training │ ├── train_lstm.py # Train the LSTM detector │ ├── run_demo.py # Run the demo │ ├── live_capture.sh # dumpcap rolling-window capture │ └── watch_and_run.sh # Auto-run pipeline on each captured window └── tests/ ``` ## 构建阶段 - [x] **Phase 1** - 骨架端到端 agent(PCAP -> StubDetector -> 最小化 RAG -> LangGraph 循环 -> 报告) - [x] **Phase 2** - 完整 RAG 层(真实 CVE/ATT&CK 数据,自然切分,第二个工具) - [x] **Phase 3** - LSTM autoencoder 检测器(在正常流量上训练,通过重建误差标记异常流) - [x] **Phase 4** - 使用 LLM-as-judge 的评估工具(rubric 评分 + 偏见缓解措施) - [x] **Phase 5** - Web 仪表板(FastAPI + React),实时捕获和本地文件夹浏览 ## 设计决策 - **检索:** top-k 为 3-5,绝不使用 20。Chunk 遵循自然边界(一个 CVE = 一个 chunk)。 - **Agent 循环:** 硬迭代上限作为护栏。终止动作是一个明确的“生成报告”步骤。 - **工具返回结构化、简洁的结果** - 绝不直接倾倒原始文档。 - **工具优雅地失败** - 返回“无相关结果”消息,绝不抛出异常。 - **与源无关的 Ingestion** - `PacketSource` 协议允许在不触及下游代码的情况下切换至实时捕获。 - **Detector 协议** - LSTM 可通过一行配置更改进行替换。 - **Eval judge 偏见缓解措施** - 基于 rubric 的评分(而非整体偏好),明确的反冗长指令,以及可以使用与 agent 模型不同的 judge 模型。 - **通过 ring buffer 进行实时捕获** - `dumpcap` 负责轮转和保留(固定大小窗口的滚动窗口);监视器仅对已关闭的文件触发分析。文件在停止时会被清理。 - **本地优先的 Web app** - 后端绑定到 localhost,可以从任何本地文件夹就地运行 pcap,无需上传/复制。 完整的技术设计文档请参见 [Design.md](Design.md)。
标签:AV绕过, DLL 劫持, FastAPI, React, Syscalls, 凭据扫描, 大语言模型, 威胁情报, 开发者工具, 网络安全, 网络流量分析, 逆向工具, 隐私保护