SecurityClaw/SecurityClaw

GitHub: SecurityClaw/SecurityClaw

一个模块化的自主 SOC 代理框架,利用 LLM 与 RAG 技术监控日志数据、构建行为基线并自动分析实时异常。

Stars: 7 | Forks: 2

# SecurityClaw — 自主 SOC 代理框架 一个模块化、基于技能的自主安全运营中心 (SOC) 代理,监控 OpenSearch/Elasticsearch 数据,构建基于 RAG 的行为记忆,并使用 LLM 验证实时异常。 ## 功能 ✅ **技能模块化** — 功能作为独立文件夹,包含 `logic.py` (Python) + `instruction.md` (LLM 指导) ✅ **心跳循环** — 类 Cron 调度器:1 分钟异常监视器,6 小时记忆构建器 ✅ **供应商无关** — 通过配置在 OpenSearch↔Elasticsearch 和 Ollama↔OpenAI 之间切换 ✅ **基于 RAG 的记忆** — 向量嵌入存储在 OpenSearch 中;上下文感知的威胁分析 ✅ **工作记忆** — 紧凑的结构化记忆本地存储在 data/agent_memory.json 中,包含有限数量的调查、发现和决策部分 ✅ **本地 GeoIP 查询** — 可选的 MaxMind GeoLite2 城市/州/国家丰富化,每周刷新 ✅ **离线测试套件** — 约 300 个收集的测试,带有模拟 DB/LLM 和覆盖率报告 ## Web 界面 SecurityClaw Web Interface ## 快速开始 ### 0. 前置条件 - **Python 3.11+** (使用 `python --version` 检查) - **Git** (用于克隆仓库) - **OpenSearch 2.x 或 Elasticsearch 8.x** (或使用 mock 进行测试) - **Ollama 或 OpenAI API key** (用于 LLM 提供商) - **4GB+ RAM** (推荐用于 Ollama 模型;生产环境推荐 8GB+) - **约 2GB 磁盘空间** 用于模型和向量索引 ### 0.5 快速 Ollama 设置 [config.yaml.example](config.yaml.example) 中的当前示例配置使用: - `qwen2.5:7b-instruct-q4_K_M` 用于聊天/推理 - `nomic-embed-text:latest` 作为示例配置引用的轻量级本地辅助嵌入模型 快速设置: ``` curl -fsSL https://ollama.com/install.sh | sh ollama serve ollama pull qwen2.5:7b-instruct-q4_K_M ollama pull nomic-embed-text:latest ``` ### 1. 创建虚拟环境 & 安装依赖 **步骤 1a**: 克隆仓库 ``` git clone https://github.com/SecurityClaw/SecurityClaw.git cd SecurityClaw ``` **步骤 1b**: 创建 Python 虚拟环境 ``` # 使用 venv (内置) python3.11 -m venv .venv # 或者使用 virtualenv (如果已安装) virtualenv .venv ``` **步骤 1c**: 激活虚拟环境 ``` # 在 Linux/macOS 上 source .venv/bin/activate # 在 Windows (PowerShell) 上 .venv\Scripts\Activate.ps1 # 在 Windows (Command Prompt) 上 .venv\Scripts\activate.bat ``` **步骤 1d**: 安装 Python 依赖 ``` pip install -r requirements.txt # 或者使用 Pipenv (如果你更喜欢): pipenv install --dev ``` **验证安装**: ``` python -c "import main; import core; print('✓ Dependencies OK')" ``` ### 2. 交互式引导 ``` .venv/bin/python main.py onboard ``` 向导将指导您完成: - **数据库**: 主机、端口、SSL、认证 - **LLM**: 提供商 和凭证 - 两项服务的**连接测试** - **配置保存** 到 `config.yaml` 和 `.env` 详情请参阅 [ONBOARDING.md](ONBOARDING.md)。 ### 3. 启动代理 ``` .venv/bin/python main.py run ``` 代理将启动后台调度器并开始轮询异常。 ### 4. 查看状态 在另一个终端中: ``` .venv/bin/python main.py status # Print the compact agent memory snapshot .venv/bin/python main.py list-skills # Show loaded skills and intervals .venv/bin/python main.py dispatch # Fire a skill manually (e.g., anomaly_triage) ``` ## 架构 ### 目录结构 ``` SecurityClaw/ ├── config.yaml # Central DB/LLM/RAG configuration ├── .env # Secrets (master credentials) ├── main.py # CLI entrypoint │ ├── core/ │ ├── config.py # YAML + env loader │ ├── memory.py # Compact structured memory store │ ├── runner.py # Conductor (skill discovery, scheduling) │ ├── scheduler.py # APScheduler wrapper │ ├── skill_loader.py # Dynamic skill discovery │ ├── db_connector.py # OpenSearch/ES abstraction │ ├── llm_provider.py # Ollama/OpenAI abstraction │ └── rag_engine.py # Embedding store & retrieval │ ├── skills/ │ ├── chat_router/ # API-only: Routes user questions to skills │ ├── network_baseliner/ # 6h: Aggregate logs → RAG vectors │ ├── fields_baseliner/ # 1h: Catalog OpenSearch field schemas │ ├── anomaly_triage/ # Manual: Poll AD findings → enrich → escalate │ ├── threat_analyst/ # Manual: RAG reasoning → verdict │ ├── opensearch_querier/ # Manual: Execute database queries │ ├── forensic_examiner/ # Manual: Build incident timelines │ ├── baseline_querier/ # Manual: Search behavioral baselines │ ├── fields_querier/ # Manual: Query field schema catalog │ ├── geoip_lookup/ # Cron (Tue/Fri 2 AM UTC): Maintain MaxMind DB │ └── rag_querier/ # Manual: RAG context retrieval │ ├── tests/ │ ├── conftest.py # Shared fixtures │ ├── mock_opensearch.py # In-memory DB (cosine kNN) │ ├── mock_llm.py # Deterministic LLM (keyword-dispatched) │ ├── data_generator.py # Synthetic network logs & anomalies │ └── test_*.py # Offline tests + coverage │ ├── requirements.txt / Pipfile # Dependencies └── ONBOARDING.md # Interactive setup guide ``` ### 核心设计原则 | 原则 | 实现 | |-----------|---| | **技能模块化** | 每个技能是一个包含 `logic.py` (入口点) 和 `instruction.md` (LLM 系统提示词) 的文件夹 | | **自动发现** | Runner 扫描 `/skills` 并动态加载所有有效技能 | | **有状态记忆** | data/agent_memory.json 中的有界 JSON 记忆存储跟踪焦点、发现、决策和升级,防止不受控制的增长 | | **定时执行** | APScheduler 按间隔触发技能;间隔在技能 `instruction.md` front-matter 中定义 | | **供应商无关** | 抽象的 `BaseDBConnector` 和 `BaseLLMProvider` 允许通过配置切换供应商 | | **RAG 上下文** | 嵌入存储在向量索引中;在 LLM 分析期间检索以获取行为上下文 | | **可测试性** | 模拟 DB、LLM 和数据生成器支持带有覆盖率报告的可重复离线测试 | ## 技能参考 ### NetworkBaseliner (6 小时周期) **目的**: 构建“正常”网络行为的基线。 **逻辑**: 1. 查询近期日志 (例如,过去 24 小时) 2. 聚合为摘要 (典型端口、协议、字节量) 3. 生成 LLM 增强的描述 4. 作为嵌入向量存储在 RAG 索引中 **输出**: ThreatAnalyst 用于上下文的基线向量。 ### AnomalyTriage (手动) **目的**: 轮询异常检测结果并升级高置信度异常。 **发布说明**: 此技能正在积极验证中。可通过在 `instruction.md` 中添加 `schedule_interval_seconds: 60` 转换为计划任务。 **逻辑**: 1. 查询 OpenSearch AD 索引以获取新发现 (基于游标,从上次轮询开始) 2. 使用 LLM 描述丰富每个发现 (实体、分数、严重性) 3. 如果严重性 ≥ 阈值:写入代理记忆中的升级队列 4. 更新游标以备下次轮询 **输出**: 记忆中的升级发现,等待 ThreatAnalyst 分析。 ### ThreatAnalyst (手动) **目的**: 使用 RAG 上下文分析升级的发现;发布裁决。 **发布说明**: 此技能正在积极验证中。可通过在 `instruction.md` 中添加 `schedule_interval_seconds: 300` 转换为计划任务。 **逻辑**: 1. 从代理记忆中读取升级队列 2. 对于每个发现: - 查询 RAG 引擎以获取相似的基线上下文 - 使用发现 + 基线上下文构建 LLM 提示词 - 请求裁决 (TRUE_THREAT, FALSE_POSITIVE, UNKNOWN, ERROR) 3. 将裁决和操作写入“近期决策” 4. 如果是 TRUE_THREAT:设置“当前焦点”并触发 IR 剧本 **输出**: 带有置信度、MITRE 战术映射、推荐操作的裁决。 ### GeoIPLookup (每周刷新 + 按需查询) **目的**: 维护本地 MaxMind GeoLite2-City 数据库并回答直接的 IP 地理位置问题。 **逻辑**: 1. 首次使用时,如果缺少 MMDB 则下载 2. 每周一次,如果过期则刷新 3. 对于提供的 IP,返回本地城市 / 分区 / 国家 / 时区 / 坐标数据 **输出**: 来自本地 MaxMind DB 的确定性地理位置字段。 ### 发布状态说明 | 技能 | 状态 | 说明 | |-------|--------|-------| | **chat_router** | 稳定 | 为 Web 界面和 API 提供支持 | | **network_baseliner** | 稳定 | 从日志构建行为基线 | | **fields_baseliner** | 稳定 | 编目 OpenSearch 字段模式 | | **anomaly_triage** | 进行中 | 手动技能;在 instruction.md 中启用调度 | | **threat_analyst** | 进行中 | 手动技能;在 instruction.md 中启用调度 | | **opensearch_querier** | 稳定 | DB 查询的唯一联系点 | | **forensic_examiner** | 进行中 | 时间线重建;积极开发中 | | **baseline_querier** | 进行中 | 搜索行为基线;尚未完善为发布状态 | | **fields_querier** | 稳定 | 搜索字段模式目录 | | **geoip_lookup** | 稳定 | MaxMind GeoLite2 维护和查询 | | **rag_querier** | 稳定 | RAG 上下文检索 | **图例**: - **稳定**: 可发布;已在生产模式中测试 - **进行中**: 正在积极验证;欢迎反馈 - **已弃用**: 使用替代技能;保留以向后兼容 ## 配置 ### config.yaml ``` agent: name: SecurityClaw version: "1.0.0" skills_dir: skills log_level: INFO scheduler: heartbeat_interval_seconds: 60 memory_build_interval_hours: 6 db: provider: opensearch # or: elasticsearch host: localhost port: 9200 use_ssl: false verify_certs: false username: "" # Loaded from .env password: "" # Loaded from .env # Index configuration (configured during onboarding) logs_index: securityclaw-logs # Where to scan for network logs anomaly_index: securityclaw-anomalies # Where AD findings are stored vector_index: securityclaw-vectors # RAG embedding store llm: provider: ollama # or: openai ollama_base_url: http://localhost:11434 ollama_model: qwen2.5:7b-instruct-q4_K_M ollama_embed_model: nomic-embed-text:latest # or: # openai_model: gpt-4o # openai_api_key_env: OPENAI_API_KEY rag: embedding_model: all-MiniLM-L6-v2 top_k: 5 similarity_threshold: 0.65 anomaly: detector_id: default-detector poll_interval_seconds: 60 severity_threshold: 0.7 max_findings_per_poll: 50 geoip: enabled: true db_path: data/geoip/GeoLite2-City.mmdb edition_id: GeoLite2-City update_interval_days: 7 download_url: https://download.maxmind.com/app/geoip_download timeout_seconds: 60 license_key: "" # Loaded from .env via MAXMIND_LICENSE_KEY ``` ### 索引配置说明 SecurityClaw 使用 **三个索引**: | 索引 | 目的 | 使用者 | 示例 | |-------|---------|---------|---------| | **logs_index** | 用于基线构建的历史网络日志 | NetworkBaseliner (6 小时周期) | `securityclaw-logs`, `logs-*`, `filebeat-*` | | **anomaly_index** | 异常检测结果 (发现) | AnomalyWatcher (1 分钟周期) | `securityclaw-anomalies`, `.opendistro-anomaly-results*` | | **vector_index** | RAG 嵌入 (正常行为基线) | ThreatAnalyst (5 分钟周期) | `securityclaw-vectors` | **流程:** 1. **NetworkBaseliner** → 查询 `logs_index` → 生成摘要 → 将嵌入存储在 `vector_index` 2. **AnomalyWatcher** → 轮询 `anomaly_index` 获取新发现 → 升级到记忆 3. **ThreatAnalyst** → 读取升级 → 从 `vector_index` 检索上下文 → 发布裁决 在引导期间,您可以使用您的环境提供的任何索引名称/模式 (例如,如果您的日志在 `filebeat-networking-*` 中,请使用它而不是 `securityclaw-logs`)。 ### .env (git 忽略) ``` OPENSEARCH_USERNAME= OPENSEARCH_PASSWORD= OPENAI_API_KEY= OLLAMA_BASE_URL=http://localhost:11434 ``` ## CLI 命令 ``` # 交互式设置 .venv/bin/python main.py onboard # 启动 web interface + backend API + scheduler .venv/bin/python main.py service # 运行 CLI agent (阻塞; 按 Ctrl+C 停止) .venv/bin/python main.py run # CLI 中的交互式聊天 .venv/bin/python main.py chat # 立即触发一个 skill .venv/bin/python main.py dispatch anomaly_triage .venv/bin/python main.py dispatch network_baseliner .venv/bin/python main.py dispatch threat_analyst # 查看 working memory .venv/bin/python main.py status # 列出 skills 和时间间隔 .venv/bin/python main.py list-skills # 设置日志级别 .venv/bin/python main.py --log-level DEBUG run ``` ## Web 界面 ### 启动 Web 服务器 Web 界面提供了一个现代的基于聊天 的 UI,用于与 SecurityClaw 技能交互并查看推理步骤。 ``` # 首先激活虚拟环境 source .venv/bin/activate # or: .venv\Scripts\activate on Windows # 启动 web server + backend API + scheduler python main.py service ``` **预期输出**: ``` [INFO] Starting web server and API... [INFO] Frontend available at: http://localhost:3000 [INFO] API backend available at: http://localhost:5000/api [INFO] Scheduler running in background [INFO] Press Ctrl+C to stop ``` ### Web 界面功能 **聊天界面** (http://localhost:3000) - 💬 **实时聊天**: 发送问题并接收来自 SecurityClaw 技能的回答 - 🧠 **推理步骤**: 查看 LLM 推理和决策过程 - 📋 **对话历史**: 浏览和管理过去的对话 - 🎯 **技能调度**: 手动触发技能 (anomaly_triage, threat_analyst 等) - 📊 **记忆视图**: 监控代理的工作记忆和发现 **API 端点** (http://localhost:5000/api) - `GET /api/status` — 代理状态和记忆摘要 - `POST /api/chat/stream` — 流式聊天响应 - `GET /api/conversations` — 列出对话历史 - `DELETE /api/conversations/{id}` — 删除对话 - `GET /api/skills` — 列出可用技能 - `POST /api/skills/{name}/dispatch` — 手动触发技能 - `GET /api/config` (只读) — 查看掩码配置 ### 访问 Web UI **本地访问** (单机): - 在浏览器中打开:**http://localhost:3000** **远程访问** (从另一台机器): 1. 查找服务器的 IP 地址: hostname -I # Linux ipconfig # Windows ifconfig # macOS 2. 从远程机器访问 (将 `SERVER_IP` 替换为实际 IP): http://SERVER_IP:3000 - 确保防火墙允许 3000/5000 端口流量 - 对于生产环境,使用 HTTPS 并设置反向代理 ### 示例:无头运行 (仅服务器) 如果您只想要 API 而不打开浏览器: ``` # 启动 server python main.py service & # 在另一个终端中,查询 API curl http://localhost:5000/api/status # 或者在主终端中使用 CLI python main.py dispatch threat_analyst ``` ### Web 服务器故障排除 **"端口 3000 已被占用"** ``` # 终止占用端口 3000 的进程 lsof -ti:3000 | xargs kill -9 # Linux/macOS netstat -ano | findstr :3000 # Windows ``` **"无法连接到 API"** - 验证后端是否正在运行:`curl http://localhost:5000/api/status` - 检查防火墙规则 - 查看主终端中的错误 **"聊天无响应"** - 检查 LLM 可用性 (Ollama 正在运行?OpenAI key 有效?) - 查看日志:`python main.py --log-level DEBUG service` - 检查 config.yaml 中的提供商设置是否正确 ## 测试 所有测试默认为离线 (模拟 DB + 模拟 LLM),现在通过 `pytest-cov` 生成覆盖率报告。 ``` # 运行带有 coverage 的完整套件 .venv/bin/python -m pytest # 运行特定的测试文件 .venv/bin/python -m pytest tests/test_rag.py -v # 可选的 HTML coverage 报告 .venv/bin/python -m pytest --cov-report=html ``` 覆盖率 XML 写入 [coverage.xml](coverage.xml) 用于 CI/报告。 当前的发布准备基线:全套测试会自动测量,但总覆盖率仍被进行中的模块和特定提供商的适配器拉低。将报告视为测量工具,而不是声称每个技能都已完善为发布状态。 ### 测试内容 | 层 | 测试 | 说明 | |-------|-------|-------| | **配置** | (通过 conftest) | YAML + env 加载 | | **调度器** | 13 | 作业注册、调度、间隔、cron 表达式 | | **DB 抽象** | 20 | 搜索、kNN、异常发现、批量索引 | | **LLM 抽象** | 11 | 嵌入、聊天、固定响应 | | **RAG 引擎** | 15 | 存储、检索、上下文构建、类别过滤器 | | **技能加载器** | 14 | 发现、指令加载、间隔解析 | | **技能** | 活覆盖 | 稳定的编排路径已覆盖;进行中的技能仍在积极验证中 | | **数据生成器** | 24 | 合成日志、异常、基线块、嵌入 | 冗余的主管路由测试已合并,以保持发布套件更小且更易于维护。 ## 编写新技能 ### 技能剖析 ``` skills/my_skill/ ├── logic.py # Python └── instruction.md # LLM guidance ``` **logic.py**: ``` """ skills/my_skill/logic.py Context dict keys: - db → BaseDBConnector - llm → BaseLLMProvider - memory → AgentMemory - config → Config - skills → dict of loaded Skill objects """ from pathlib import Path SKILL_NAME = "my_skill" INSTRUCTION_PATH = Path(__file__).parent / "instruction.md" def run(context: dict) -> dict: """ Main entry point. Called by Runner on schedule. Return a dict with status, results, etc. """ db = context.get("db") llm = context.get("llm") memory = context.get("memory") config = context.get("config") # Your logic here memory.add_finding("Found something interesting") return { "status": "ok", "findings": 5, } ``` **instruction.md**: ``` --- schedule_interval_seconds: 300 --- # 我的 Skill You are a security analyst specializing in [X]. When given anomalies, your job is to: 1. [Step 1] 2. [Step 2] Respond in JSON format with: ```json { "verdict": "...", "confidence": ..., "reasoning": "..." } ``` ``` --- ## 扩展 SecurityClaw ### 添加一个新的 Skill 1. Create `skills/my_skill/` directory 2. Write `logic.py` with `run(context)` function 3. Write `instruction.md` with LLM guidance and optional `schedule_interval_seconds` 4. Restart agent or run `.venv/bin/python main.py dispatch my_skill` to test ### 添加一个 DB Backend 1. Subclass `BaseDBConnector` in `core/db_connector.py` 2. Set `db.provider: my_db` in `config.yaml` 3. Update `build_db_connector()` factory to instantiate your class ### 添加一个 LLM Backend 1. Subclass `BaseLLMProvider` in `core/llm_provider.py` 2. Set `llm.provider: my_llm` in `config.yaml` 3. Update `build_llm_provider()` factory to instantiate your class --- ## 故障排除 **"Module 'X' not found"** ```bash .venv/bin/pip install -r requirements.txt ``` **"无法连接到 OpenSearch"** - 验证 OpenSearch 是否正在运行:`curl -u admin:admin http://localhost:9200` - 检查 config.yaml 主机/端口 - 检查防火墙规则 **"无法连接到 Ollama"** - 启动 Ollama:`ollama serve` - 拉取示例模型:`ollama pull qwen2.5:7b-instruct-q4_K_M && ollama pull nomic-embed-text:latest` - 验证 config.yaml 中的 base URL **"技能未加载"** - 检查 `/skills//logic.py` 是否存在 - 验证 `run(context)` 函数签名 - 检查日志:`.venv/bin/python main.py --log-level DEBUG run` **"未检测到发现"** - 为模拟 DB 填充数据:有关示例合成数据,请参阅 `tests/conftest.py` - 检查异常索引:`curl http://localhost:9200/_cat/indices?v` - 验证 config.yaml 中的检测器 ID ## 性能说明 - **LLM 调用**: 每个异常监视器和威胁分析周期调用 LLM 1 次以上 (Ollama:每次调用约 1 秒,OpenAI:约 2 秒) - **RAG 检索**: kNN 搜索在模拟中为 O(n);在填充数据的 DB 上每次查询约 1 毫秒 - **调度器**: 后台 APScheduler 具有最小的开销 (空闲时约 1% CPU) ## 贡献 欢迎贡献!增强领域: - [ ] Elasticsearch 兼容性测试 - [ ] 高级 MITRE ATT&CK 映射 - [ ] 事件响应剧本集成 - [ ] 多租户支持 - [ ] 用于外部集成的 API 端点 - [ ] 扩展的 Web 仪表板,用于结构化记忆可视化 ## 许可证 [在此处填写您的许可证] ## 支持 如有问题、疑问或功能请求,请提出 issue 或联系 SecurityClaw 团队。 ## 安全 / 发布检查清单 - `config.yaml`、`.env` 和 `data/agent_memory.json` 旨在保留在本地。 - 使用 [config.yaml.example](config.yaml.example) 作为公共模板。 - 发布前运行快速扫描: git grep -nEI '(password|api[_-]?key|BEGIN [A-Z ]*PRIVATE KEY|sk-)' -- . git log --all -G 'password|api[_-]?key|sk-' --oneline - 当前审计结果:在此发布过程中,跟踪文件中未发现明显的真实凭证。占位符值和私有示例主机已清理。 **最后更新**: 2026 年 3 月 6 日 **版本**: 1.0.0 **状态**: 积极开发 / 发布准备
标签:AI安全, AI风险缓解, AMSI绕过, Chat Copilot, CISA项目, DLL 劫持, Elasticsearch, GeoIP, LLM评估, Nomic, Ollama, OpenAI, Petitpotam, Python, Qwen, RAG, Ruby, 企业安全, 内存规避, 向量数据库, 大语言模型, 威胁检测, 安全运营中心, 异常检测, 无后门, 本地部署, 检索增强生成, 模块化设计, 知识库, 结构化查询, 网络安全, 网络映射, 网络资产管理, 自动化修复, 自动化安全, 自动化扫描, 逆向工具, 隐私保护