jryan5150/gone-phishing

GitHub: jryan5150/gone-phishing

面向 MSP 的 AI 驱动事件响应计划引擎,将自由文本事件描述转化为符合 NIST 800-61 标准、带角色和监管期限的结构化行动方案。

Stars: 0 | Forks: 0

# Gone-Phishing [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/) [![FastAPI](https://img.shields.io/badge/FastAPI-0.115-009688.svg)](https://fastapi.tiangolo.com/) [![Tests](https://img.shields.io/badge/tests-60%20passing-brightgreen.svg)](#tests) **一个面向 MSP 的、由 AI 驱动的事件响应计划引擎。** 该引擎接收自由文本的事件描述,通过语义搜索将其与符合 NIST 800-61 标准的预案进行匹配,并生成一个包含角色分配、时间限制以及监管通知要求的行动计划。具备跨四个 LLM 提供商的 BYOM 适配器架构,集成了 ConnectWise + N8N,并包含一个拥有 60 个测试用例的场景语料库。 ## 为什么会有这个项目 当 MSP 的客户遭遇安全事件时 —— 比如点击了钓鱼邮件、检测到勒索软件、凭据被盗用 —— 响应质量完全取决于谁接手了这个工单。NIST 800-61 标准虽然存在,但在应对活跃事件时,没人会去翻开那份长达 79 页的 PDF。监管合规的时间窗口(如 HIPAA 的 60 天,PCI-DSS 的 72 小时,各州的数据泄露法律)非常紧迫且极易错过。ConnectWise 工单只记录了*发生了什么*,却无法指导*下一步该做什么、按什么顺序、由谁来做*。 **核心痛点在于:** 缺乏一个能够连接“报告事件”和“提供带有角色分配和监管期限的有序行动计划”的工具。 这就是你需要的工具,而且它是开源的,任何 MSP 都可以运行它。 ## 工作原理 ``` incident description → ChromaDB semantic search → LLM action plan (NIST-aligned playbooks) (role-assigned + time-bound + regulatory) ``` 1. 将符合 NIST 800-61 标准的预案以 Markdown 格式放入 `playbooks/` 目录 —— 它们会在启动时自动导入 ChromaDB 2. 向 `/api/incident` POST 一段自由文本的事件描述 3. 语义搜索会选择最相关的预案 4. LLM(由你选择 —— Anthropic, OpenAI, Gemini 或本地 Ollama)将生成一个带有角色分配、时间表和监管标记的优先行动清单 5. 在 `/api/chat` 的后续聊天会保留事件上下文,用于解答调查过程中的问题 6. 可选操作:通过内置的 cw-mcp 工具触发 ConnectWise 工单操作,或触发 N8N webhooks 进行升级上报 ## 技术栈 | 层级 | 技术 | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | API | FastAPI (Python 3.11+) | | 向量数据库 | ChromaDB (余弦相似度, sentence-transformers) | | LLM | **BYOM** — Anthropic Claude / OpenAI GPT-4o / Google Gemini / local Ollama (Llama 3.1, Phi-3, 等) | | 聊天 UI | 内置(单文件暗色主题),或 Chainlit,或 Open WebUI,或 Gradio | | 集成 | ConnectWise Manage (通过 [cw-mcp](https://github.com/jryan5150/cw-mcp-server)), N8N webhooks | | 测试 | 60 个 pytest 测试,涵盖 API 契约、集成生命周期、搜索排名、适配器注册表、语料库完整性 | ## 独特之处 **大多数“AI 安全自动化”工具都硬编码了单一的提供商和固定的预案分类体系。本项目则完全反转了这两点:** - **BYOM (自带模型)** —— LLM 是可以替换的。生产环境使用 Claude,开发环境使用 Ollama,合规环境使用任何已获批准的模型。适配器模式强制执行统一的接口;在启动时就会拒绝错误的提供者,而不是在请求时才报错 - **预案是 Markdown,而不是配置文件** —— 将 `.md` 文件放入 `playbooks/`,访问 `/api/ingest`,即可实现搜索。你可以像添加文档一样,用同样的方式添加客户特定的合规预案 - **语义搜索,而非分类** —— 事件描述不需要使用准确的专业词汇。*"用户点击了一个可疑链接,现在他们的 Outlook 正在向联系人发送电子邮件"* 会自动找到凭据泄露和钓鱼相关的预案,无需技术人员事先对事件进行分类 - **包含 2,000 个事件场景语料库** —— 程序化生成,基于 MITRE ATT&CK 种子,可通过 `--seed` 保证输出确定性。可用于沙盘推演、评估数据集、差距分析或演示。该数据拥有对应的生成器 (`scripts/generate_scenarios.py`),而不是一个神秘的数据团 - **测试验证的是行为,而非语法** —— *"勒索软件查询是否将勒索软件预案排在第一位?"* 是一个测试。*"此函数是否返回 dict?"* 则不是。 - **在开发过程中融入了安全审查** —— 通过 prompt 注入进行的 XSS 攻击(已拦截)、错误消息泄露(已拦截)、速率限制(已添加)、安全响应头(已设置)。历史提交记录展示了完整的审计过程。 ## 快速开始 ``` git clone https://github.com/jryan5150/gone-phishing.git cd gone-phishing # 安装 pip install -r requirements.txt # 配置 cp .env.example .env # 编辑 .env — 至少设置你的 LLM 提供商的 API key # 运行 cd server python app.py # → http://localhost:8100 ``` 服务器在启动时会自动导入预案。打开 `http://localhost:8100` 访问内置的聊天 UI,或使用 `POST /api/incident` 进行编程调用。 ## BYOM — 自带模型 在 `.env` 中设置 `LLM_PROVIDER`: ``` LLM_PROVIDER=anthropic # Claude (default; ANTHROPIC_API_KEY) LLM_PROVIDER=openai # GPT-4o (OPENAI_API_KEY) LLM_PROVIDER=gemini # Gemini 1.5 Pro (GEMINI_API_KEY) LLM_PROVIDER=ollama # Local models (OLLAMA_HOST + OLLAMA_MODEL) ``` 对于 Ollama,请先拉取你的模型:`ollama pull llama3.1:8b`。适配器验证会在启动时进行 —— 错误的提供者名称会迅速报错,而不是在处理第一个事件时才失败。 ## 聊天 UI 选项 | 选项 | 设置 `CHAT_UI=` | 安装 | 说明 | | ---------- | -------------- | ---------------------- | ----------------------------------------------------------- | | 内置 | `builtin` | 无需额外依赖 | 位于 `/` 的单文件暗色主题 UI | | Chainlit | `chainlit` | `pip install chainlit` | 位于 `/chat` 的生产级聊天 UI (挂载到 FastAPI) | | Open WebUI | — | Docker container | 完整的 AI 平台 (通过 API 连接) | | Gradio | — | `pip install gradio` | 快速演示界面 | 查看 [docs/WIRING.md](docs/WIRING.md) 了解每个选项的分步设置。 ## API | 接口 | 方法 | 说明 | | ---------------- | ------ | ------------------------------------ | | `/api/incident` | POST | 提交事件 → 获取行动计划 | | `/api/chat` | POST | 在聊天上下文中的后续问题 | | `/api/search` | POST | 直接的预案语义搜索 | | `/api/playbooks` | GET | 列出所有已导入的预案 | | `/api/ingest` | POST | 重新导入预案文件 | | `/api/health` | GET | 服务器健康状况 (含依赖检查)| ## 项目结构 ``` gone-phishing/ ├── server/ │ ├── app.py # FastAPI server + chat UI mounting │ ├── config.py # Centralised config with startup validation │ ├── vector_store.py # ChromaDB ingestion + semantic search │ ├── llm.py # Action plan generation (provider-agnostic) │ ├── cl_app.py # Chainlit integration (optional) │ │ │ ├── adapters/ # BYOM — Bring Your Own Model │ │ ├── base.py # Abstract adapter interface │ │ ├── anthropic_adapter.py │ │ ├── openai_adapter.py │ │ ├── gemini_adapter.py │ │ └── ollama_adapter.py │ │ │ └── tools/ # MCP tool modules │ ├── irp_tools.py # Core IRP (search, plan, list) │ ├── cw_tools.py # ConnectWise Manage (via cw-mcp) │ └── n8n_tools.py # N8N webhook triggers │ ├── tests/ # 60 tests — API, integration, data, adapters ├── scripts/ │ └── generate_scenarios.py # Procedural scenario generator (pure Python) ├── playbooks/ # Drop .md files here → auto-ingested │ ├── ransomware.md phishing.md data-breach.md bec.md ... ├── web/index.html # Built-in chat UI ├── data/ │ ├── scenarios.json # 2,000 generated incident scenarios │ └── chroma/ # ChromaDB persistence (.gitignored) ├── docs/WIRING.md # Setup: chat UIs, CW MCP, N8N, LLM providers ├── pyproject.toml ├── .env.example └── requirements.txt ``` ## 测试 ``` pip install pytest httpx pytest tests/ -v ``` 跨 5 个模块的 **60 个测试**: | 模块 | 测试数 | 涵盖范围 | | ---------------------- | ----- | ---------------------------------------------------------------------------- | | `test_api.py` | 23 | 接口契约、验证、搜索排名、幂等导入 | | `test_integration.py` | 8 | 完整的请求生命周期、上下文传递、重新导入的安全性、错误传播 | | `test_vector_store.py` | 9 | 分块逻辑、重叠正确性、搜索质量、跳过规则 | | `test_adapters.py` | 5 | BYOM 注册表、未知提供者拒绝、ABC 强制执行 | | `test_scenarios.py` | 15 | 语料库完整性、分布情况、MITRE 覆盖范围、生成器可复现性 | 测试验证的核心行为: - **搜索排名**:勒索软件查询 → 勒索软件预案排名第一(而不是钓鱼攻击) - **多轮对话**:搜索上下文使用最新的用户消息,而不是第一条 - **幂等导入**:重新导入产生完全相同的分块数量 - **错误传播**:LLM 故障 → 包含信息的干净 500 错误,而不是堆栈跟踪 - **数据完整性**:所有搜索结果都包含元数据,没有空内容 - **生成器确定性**:相同的 `--seed` → 产生完全一致的场景输出 ## 场景语料库 `data/scenarios.json` 包含跨 10 个类别的 2,000 个程序化生成的事件场景,这些场景基于 MITRE ATT&CK 技术、真实世界的违规模式和 MSP 特定环境生成。 使用以下命令重新生成: ``` python scripts/generate_scenarios.py --seed 42 --output data/scenarios.json ``` 可用于沙盘推演、LLM 微调/评估数据集、预案差距分析或演示。 ## 添加预案 将任何 `.md` 文件放入 `playbooks/` 并 `POST /api/ingest`。系统会将其分块、嵌入并使其可被搜索。建议的结构: ``` # [事件类型] ## 严重程度指标 - ... ## 遏制步骤 1. ... ## 调查步骤 1. ... ## 通知要求 - HIPAA: ... - State breach laws: ... - PCI-DSS: ... ## 恢复步骤 1. ... ``` 语义匹配器不要求严格遵循此结构 —— 但一致的结构能提高分块质量和搜索相关性。 ## ConnectWise + N8N 集成 IRP 引擎将操作委托给你现有的 **cw-mcp** 服务器进行工单操作,并触发 **N8N** 的 webhooks 进行上报链处理。**两者都是可选的** —— 引擎可以完全独立运行。 如果你所在的 MSP 正在使用 ConnectWise:内置的 `cw_tools.py` 可以读取与事件相关的工单、创建响应计划工单,并随着行动计划的推进更新工单状态。查看 [docs/WIRING.md](docs/WIRING.md) 了解完整配置。 如果你使用 N8N 进行编排:`n8n_tools.py` 中的 webhook 触发器会在计划生成、上报阈值触发和监管截止日期临近时被激活。你可以将它们连接到你的团队正在使用的任何上报链中。 ## 开发历史 本项目是通过 AI 编排的开发方式在公开环境中构建的 —— 在移动端进行头脑风暴和原型设计,然后转移到桌面端进行并行 Agent 执行。每个阶段都交付了一个连贯的切片;下面的提交链接指向了对应的时刻。 | 阶段 | 内容 | 提交 | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | | **基础设施** | IRP 引擎,BYOM 适配器,CW MCP 客户端,预案导入,聊天 UI | [`283e870`](../../commit/283e870) | | **代码质量审计** | 修复了配置重复,移除了死代码,单例 ChromaDB 客户端,统一使用 pathlib | [`39d9ec9`](../../commit/39d9ec9) | | **运维强化** | 启动配置验证(缺少密钥时快速失败),包含依赖验证的真实健康检查,符合 CORS 规范 | [`5efcb04`](../../commit/5efcb04) | | **适配器埋点** | 所有 LLM 调用的日志(模型、延迟、token 数),修复了 Gemini SDK 的 bug(system_instruction 位置错误) | [`3581961`](../../commit/3581961) | | **前端安全** | 用 marked.js 替换了正则表达式 markdown,添加了 DOMPurify 以防止通过 LLM 提示注入引发的 XSS | [`7486c92`](../../commit/7486c92) | | **文档清理** | IRP 模板来源的适当归属,去除了泄露的章节编号,移除了不存在功能的文档 | [`5b45e3a`](../../commit/5b45e3a) | | **数据来源** | 程序化场景生成器(纯 Python,带种子,10 个类别,MITRE ATT&CK,20 种勒索软件变体) —— 数据现在有了生成器,不再是神秘的数据团 | [`520b2b5`](../../commit/520b2b5) | | **测试套件** | 60 个测试:API 契约、集成生命周期、搜索排名质量、适配器注册表、语料完整性、生成器确定性 | [`fbc3834`](../../commit/fbc3834) | | **项目结构** | pyproject.toml,规范的包布局,带有测试文档的 README,免费层级 LLM 使用指南 | [`35797cc`](../../commit/35797cc) | | **安全审查** | 速率限制,安全响应头,通用错误消息(无内部细节泄露),XSS 防护 | [`f06ad9b`](../../commit/f06ad9b) | ## 相关工作 - **姊妹案例研究:** [事件响应预案引擎](https://github.com/jryan5150/portfolio/tree/main/case-studies/incident-response-playbook) —— 附带项目背景的完整架构论述 - **MCP 服务器关联项目:** [cw-mcp-server](https://github.com/jryan5150/cw-mcp-server) —— 包含 73 个工具的 ConnectWise Manage MCP 服务器 (由 `cw_tools.py` 调用) - **方法论:** 用于构建项目的 [四层上下文架构](https://github.com/jryan5150/claude-harness-starter) —— 根据变化频率分离的 身份 / 规则 / 记忆 / 项目 层 - **生产运行时同类项目:** esexpress-v2 中的哨兵层 —— 相同的神经科学基础(带有反馈的自适应信任评分),不同的应用体现(安全防御 vs 事件预案引擎) ## 贡献 欢迎提交 Issue 和 PR。特别欢迎以下方向: - 更多符合 NIST 800-61 标准的预案(不同垂直行业 —— 医疗、金融、法律、制造) - 新的 BYOM 适配器(Anthropic Bedrock, Mistral,自定义 OpenAI 兼容接口) - 合规包贡献(特定州的数据泄露通知要求,特定行业的框架) - 测试语料库扩展(更多的 MITRE 技术覆盖,特定行业的场景) 在贡献之前:请阅读 [docs/WIRING.md](docs/WIRING.md) 了解完整的集成面。如果你计划进行重大更改,请先提交 Issue 讨论 —— 以保持讨论公开透明。 ## 许可证 MIT —— 见 [LICENSE](LICENSE)。可自由 Fork。无需署名,但如能注明将不胜感激。 *由 [Jace Ryan](https://github.com/jryan5150) 构建,献给那些厌倦了在凌晨 2 点翻开 NIST 800-61 PDF 的 MSP 从业者。*
标签:AI风险缓解, Anthropic, API服务, AV绕过, BYOM, ChromaDB, CIS基准, ConnectWise, DLL 劫持, FastAPI, FTP漏洞扫描, Gemini, HIPAA, IRP, IT安全, IT管理, LLM, LLM评估, MIT开源许可, MSP, N8N, NIST 800-61, Object Callbacks, Ollama, OpenAI, PCI-DSS, Python, RAG, Unmanaged PE, 人工智能, 内存规避, 凭据泄露, 勒索软件, 合规监管, 向量数据库, 响应计划, 大语言模型, 安全剧本, 安全编排, 安全规则引擎, 安全运营, 托管服务提供商, 扫描框架, 无后门, 用户模式Hook绕过, 系统集成, 网络调试, 网络钓鱼, 自动化, 自带模型, 语义搜索, 逆向工具