Lockelamoree/BreachLens-Splunk-MCP-SOC-Copilot

GitHub: Lockelamoree/BreachLens-Splunk-MCP-SOC-Copilot

BreachLens:基于Splunk的SOC副驾驶,提供证据驱动的安全事件响应。

Stars: 0 | Forks: 0

# BreachLens 我为Splunk Agentic Ops Hackathon安全赛道构建了BreachLens。想法很简单:我不想让一个AI聊天机器人猜测其通过事件响应的方式。我想要一个SOC工作流程,其中每个声明都有一个Splunk支持的证据ID作为其后盾。 BreachLens接收一个可疑警报,通过Splunk数据进行转换,构建事件时间线,将活动映射到MITRE ATT&CK,建议响应操作,并导出证据账本和Markdown事件报告。AI部分很有用,但它被故意限制在框内:它可以总结证据,而后端只接受引用真实证据ID和具体字段的笔记。 ![BreachLens调查控制台](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2e06667482021131.png) ## 我构建的内容 - 一个带有`breachlens`索引、JSON源类型、样本违规遥测、保存的搜索、宏和仪表板的Splunk应用程序。 - 一个FastAPI后端,具有三种数据模式: - `rest`:本地Splunk Enterprise实时数据模式。 - `mcp`:Splunk MCP Server模式,用于最终的Hackathon证明。 - `sample`:离线开发模式。 - 一个React/Vite SOC控制台,具有警报队列、证据条、时间线、证据抽屉、SPL转写、MITRE映射、响应计划、导出和检测草稿。 - 一个可以借助Ollama使用NiNa的证据门控分析师笔记。 - 对后端调查流程和前端演示路径的测试。 ## 为什么我认为它很重要 大多数SOC副驾驶演示看起来很棒,直到你问,“那个声明是从哪里来的?”BreachLens就是围绕这个问题构建的。 工作流程故意以证据为起点: 1. Splunk返回警报和相关遥测数据。 2. 代理记录工具调用和SPL转换。 3. 证据项获得稳定的ID,如`EV-001`。 4. 时间线事件、MITRE映射、响应操作、报告和AI笔记引用那些ID。 5. 如果AI响应没有引用真实的证据ID和具体证据字段,则后端将回退而不是信任它。 这就是全部要点:有用的AI,但带有分析师可以审计的护栏。 ## Hackathon Fit - **赛道**:安全 - **奖励目标**:最佳使用Splunk MCP Server - **演示视频**:[BreachLens - Splunk MCP SOC副驾驶与证据门控AI](https://youtu.be/FM6DZyjPXbs) - **我在演示中使用的AI模型**:通过本地Ollama的NiNa,模型链接在UI中显示:[LockeLamora2077/NiNa](https://huggingface.co/LockeLamora2077/NiNa) - **评委应寻找的内容**:第一个视口的证据条、SPL转写、证据抽屉、Splunk源链接、账本/报告导出和生成的检测。 有关我使用的Devpost说明,请参阅[docs/devpost_submission.md](docs/devpost_submission.md)。 有关我的当前实时环境状态,请参阅[docs/live_validation.md](docs/live_validation.md)。 ## 实时证明模式 我保留这些模式是明确的,因为这是一种安全工具,假装样本数据是实时数据是演示变得奇怪的原因。 | 模式 | 客户端标签 | 它意味着什么 | | --- | --- | --- | | `rest` | `splunk_rest` | 使用本地Splunk Enterprise容器和真实的`breachlens`索引数据。这是正常的本地验证路径。 | | `mcp` | `splunk_mcp` | 使用Splunk MCP Server。这是最终的Hackathon/奖金证明模式。 | | `sample` | `sample_data` | 仅使用本地JSONL文件。适用于开发,但不适用于最终的录制。 | 在演示录制中,证据条应显示: ``` Splunk MCP live mcp splunk_mcp NiNa 4/4 observed ``` 应可见的四个MCP调用是: ``` splunk_get_indexes splunk_get_metadata splunk_get_knowledge_objects splunk_run_query ``` 仅工具名称不足以进行MCP证明。SPL转写还记录了`transport`,并且当本地服务器公开新的名称时,UI只计算这四个调用作为MCP证明,例如`get_indexes`和`run_query`。 一个小命名注意事项:BreachLens显示这四个逻辑标签,因为这是我想要在演示中可见的证明点。MCP客户端将它们映射到本地Splunk MCP Server工具名称,当本地服务器公开新的名称时,例如`get_indexes`和`run_query`。 ## 如何将Splunk和AI结合起来 1. `apps/breachlens_splunk/`定义了Splunk应用程序、索引、源类型、输入、保存的搜索、宏和仪表板。 2. Splunk索引来自`sample_data/`的合成身份验证、云、端点、代理和警报事件。 3. 后端根据`BREACHLENS_MODE`通过REST或MCP运行调查。 4. 在MCP模式下,代理使用Splunk MCP Server工具进行索引发现、元数据、知识对象和SPL搜索。 5. NiNa/Ollama可以生成分析师笔记,但后端只接受具有支持状态、有效证据ID和声明级字段引用(如`EV-001.user`)的结构的JSON。 6. UI将结果显示为SOC工作流程,而不是聊天记录。 ``` flowchart LR Analyst["SOC analyst"] --> UI["BreachLens React console"] UI --> API["FastAPI investigation API"] API --> Agent["Evidence-gated SOC agent"] Agent --> Mode{"Runtime mode"} Mode --> MCP["Splunk MCP Server"] Mode --> REST["Splunk REST"] Mode --> Sample["Sample JSONL"] MCP --> Splunk["Local Splunk Enterprise"] REST --> Splunk Sample --> Data["Synthetic breach telemetry"] Splunk --> Data Agent --> NiNa["NiNa via Ollama"] NiNa --> Gate["Evidence ID + field-reference gate"] Agent --> Gate Gate --> Findings["Timeline, MITRE, response, detections"] Findings --> UI UI --> Exports["Evidence ledger + incident report"] ``` ## 仓库布局 ``` apps/breachlens_splunk/ Splunk app with index, sourcetypes, saved searches, dashboard backend/ FastAPI API, Splunk MCP/REST clients, agent, tests frontend/ React/Vite SOC console and Playwright smoke test sample_data/ Synthetic multi-stage breach JSONL logs docs/ Devpost notes, demo script, checklist architecture_diagram.md Root-level architecture diagram for Devpost ``` ## 快速入门 1. 复制环境模板。 Copy-Item .env.example .env 在`.env`中设置本地`SPLUNK_PASSWORD`,在启动Splunk之前。模板默认为`BREACHLENS_MODE=rest`,因此应用程序使用来自本地Splunk容器的实时数据。 2. 启动本地Splunk Enterprise。 docker compose up -d splunk 3. 在`http://127.0.0.1:18000`打开Splunk并以`.env`中的密码登录`admin`。 4. 创建后端环境并安装依赖项。 cd backend python -m venv .venv .\.venv\Scripts\python.exe -m pip install --upgrade pip .\.venv\Scripts\python.exe -m pip install -r requirements.txt 5. 验证Splunk已索引演示数据。 @' from app.config import load_settings from app.splunk_client import make_splunk_client client = make_splunk_client(load_settings()) print(client.name) print(client.run_query("search index=breachlens | stats count by sourcetype", earliest="0")) '@ | .\.venv\Scripts\python.exe - 预期的客户端在正常实时数据模式下: splunk_rest 6. 运行后端。 .\.venv\Scripts\python.exe -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8080 7. 运行前端。 cd ..\frontend npm install --ignore-scripts npm run dev 8. 在`http://localhost:5173`打开。 ## MCP演示设置 本地REST路径证明了应用程序正在使用实时Splunk数据。对于Splunk MCP奖金证明,在本地Splunk实例中安装Splunk MCP Server,为演示角色启用所需的工具执行功能,生成加密的MCP令牌,并设置: ``` BREACHLENS_MODE=mcp SPLUNK_MCP_URL= SPLUNK_MCP_TOKEN= SPLUNK_MCP_VERIFY_TLS=false ``` 然后重新启动后端。 我将在[docs/mcp_live_setup.md](docs/mcp_live_setup.md)中保留详细的实时设置步骤。 ## NiNa / Ollama 对于我的演示,我使用通过Ollama的NiNa: ``` OLLAMA_BASE_URL=http://127.0.0.1:11434 OLLAMA_MODEL=hf.co/LockeLamora2077/NiNa:latest ``` 如果没有配置模型,BreachLens将使用确定性回退推理,并在UI中明确标记。 ## MCP演示验证 在Splunk、Splunk MCP Server应用程序、后端和前端在MCP模式下运行后: ``` .\backend\.venv\Scripts\python.exe backend\scripts\validate_mcp.py --out docs\mcp_validation.md ``` ``` cd frontend $env:EXPECTED_BREACHLENS_MODE = "mcp" $env:EXPECTED_SPLUNK_CLIENT = "splunk_mcp" $env:EXPECTED_AI_MODEL_LABEL = "NiNa" npm run test:live ``` 这捕获了`docs/breachlens-ui-real-splunk.png`,下载了证据账本和事件报告,并检查证据条和SPL转写是否显示了所需的MCP信号。 ## AI评估 我添加了一个小型评估器,以便AI行为可重复,而不是从一张截图进行判断: ``` cd backend .\.venv\Scripts\python.exe scripts\evaluate_ai.py --alerts 3 ``` 当前的本地运行已保存在[docs/ai_evaluation.md](docs/ai_evaluation.md)。在该次运行中,NiNa为所有三个警报返回了接受的JSON,具有有效的证据ID和基于证据的字段声明,而确定性路径保持明确标记为回退。 ## API - `GET /api/alerts` - `POST /api/investigations` - `GET /api/investigations/{id}` - `POST /api/detections` - `GET /api/investigations/{id}/ledger` - `GET /api/investigations/{id}/report.md` 示例调查请求: ``` { "alert_id": "BLS-2026-001", "objective": "Determine account takeover and blast radius" } ``` ## 演示流程 1. 显示证据条,以便可见运行时模式、Splunk客户端、模型、工具调用和证据计数。 2. 运行关键的不可能旅行警报调查。 3. 沿着事件时间线导航并单击证据ID。 4. 在证据抽屉中显示原始Splunk字段和源事件链接。 5. 显示SPL转写。 6. 导出证据账本和事件报告。 7. 生成检测草稿。 ## 测试 后端: ``` cd backend .\.venv\Scripts\python.exe -m unittest discover tests ``` 前端: ``` cd frontend npm run test:e2e ``` ## 安全注意事项 - 没有秘密被提交。`.env`被忽略。 - MCP令牌必须在Splunk MCP Server应用程序中本地生成。 - AI笔记是证据门控的,并限制为已知证据ID加上具体证据字段引用。 - 后端拒绝明显的提示注入目标,例如请求忽略指令或泄露系统提示。 - 包含的`rest`设置适用于本地演示使用。它可以使用基本身份验证和`SPLUNK_VERIFY_TLS=false`,因为Splunk管理端口绑定到localhost在Docker中。 - 对于生产,我将使用令牌身份验证、TLS验证、最小权限Splunk角色、锁定CORS、网络允许列表和`.env`之外的秘密存储。 - MCP令牌、Splunk令牌和任何模型API密钥永远不应提交或显示在演示录制中。
标签:请求拦截