artk-code/virgil

GitHub: artk-code/virgil

VIRGIL 是一个供应商无关的端点安全平台启动包,将可运行的多语言检测响应 pipeline 与安全推理模型的合成训练语料库整合在一起。

Stars: 0 | Forks: 0

# VIRGIL **供应商无关的响应治理智能层 (Vendor Independent Response Governance Intelligence Layer)** VIRGIL 是一个开放的端点安全平台启动包和 ML 训练工作区, 用于检测、调查和响应。它将一个可运行的多语言 安全 pipeline 与不断增长的合成训练语料库结合在一起,专为 **VIRGIL Advisor**(一个安全推理助手)设计,旨在帮助分析师将 遥测数据映射到行为、解释证据并推荐响应操作。 当前代码库具有极强的实用性:它通过 Docker Compose 在本地启动,暴露真实的查询 API,包含一个小型操作员仪表板,并提供了 可立即用于 SFT 实验的模型训练资产。 ## 为什么选择 VIRGIL 大多数安全项目将运行时和模型工作分成了独立的 领域。VIRGIL 让它们保持紧密联系: - 具体的端点遥测 pipeline,您可以运行、测试和扩展。 - 基于 Postgres 的干净数据模型,用于事件、发现、主机和 agent 心跳。 - 使用 Redis Streams 进行传输、重试和 DLQ 工作流。 - 专用的 ML 包,包含约 **213 万 token** 的原创合成安全 推理数据,用于训练和评估 VIRGIL Advisor。 - 训练脚本和配置,适用于本地 Mac 测试和 RunPod/H100 QLoRA 微调。 ## 项目目标 VIRGIL 的构建旨在实现四个实用目标: - **可运行的安全基础设施:** 保持技术栈易于在本地计算机上启动、检查、 测试和扩展。 - **供应商无关的响应逻辑:** 对事件、检测、发现 和响应工作流进行建模,而不会将核心设计绑定到特定的 EDR、SIEM 或 LLM 供应商。 - **训练级安全数据:** 为希望针对端点调查、 检测工程和结构化安全推理训练中小型模型的人员维护干净、有用的语料库。 - **以人为本的自动化:** 使用 agent 和模型来加速分类和 证据审查,同时保留明确的契约、日志和操作员 批准边界。 ## 当前状态 截至 2026 年 5 月,VIRGIL 处于 Phase 0/Phase 1 基准阶段。该代码库故意保持较小规模, 但核心路径是真实的:事件流经 Redis,由 Python worker 评分,存入 Postgres,并通过 Go API 和静态 仪表板可见。 | 领域 | 目前已实现 | 下一步重点 | |---|---|---| | 运行时 pipeline | Rust 事件模拟器,Redis Streams,Python 规则 worker,Postgres ETL,Go API,nginx UI | 强化 transformer checkpoint 恢复和幂等性 | | 运维 | `make doctor`、`make test`、`make verify`,Docker Compose,DLQ 重放工具 | 为 doctor、测试和 compose 冒烟测试添加 CI 门禁 | | API | 健康/就绪状态、agent 签到/状态、最近告警、事件搜索、查询验证和分页元数据 | 扩展告警工作流、资产清单和检测情报 | | UI | 健康、最近告警和使用同源 `/api/*` 的事件搜索面板 | 围绕分类、事件详情和发现构建操作员工作流 | | ML | 2,008 条合成记录,约 213 万合成 token,训练/评估快照,Unsloth 配置 | 向 1000 万 token 的 VIRGIL-PHI1 目标迈进,并集成模型推理 | ## 架构 ``` flowchart LR sensor["rust-worker
host telemetry simulator"] -->|XADD security_events| redis[("Redis Streams")] redis -->|consumer group| rules["python-worker
rules, scoring, alerts"] rules -->|security_analysis| redis rules -->|security_alerts| redis rules -->|security_dlq| redis redis -->|checkpointed reads| etl["python-transformer
stream to SQL ETL"] etl --> postgres[("Postgres
events, findings, hosts")] postgres --> api["go-api
health, ready, query APIs"] redis -. health .-> api api --> nginx["nginx
/api proxy"] nginx --> ui["ts-ui
operator dashboard"] ``` VIRGIL 将 Redis 用作传输层,将 Postgres 用作权威的 长期存储。Python worker 使用 启发式方法和评分执行当前的运行时分析;ML 包是训练轨道,将成为 Advisor 模型层。 ## 此代码库中包含什么 | 路径 | 用途 | |---|---| | `go-api/` | 用于健康、就绪状态、agent 状态、最近告警和事件搜索的 HTTP 边缘接口。 | | `python-worker/` | 规则 worker、评分辅助程序、Redis 摄取、DLQ 发布和 transformer ETL 作业。 | | `rust-worker/` | 异步 Tokio 模拟器,将规范化的安全事件发布到 Redis Streams。 | | `rust-host-agent/` | 用于未来原生收集工作的早期主机 agent 包边界。 | | `ts-ui/` | 由 nginx 提供服务的静态操作员仪表板,带有代理到 Go API 的 `/api/*`。 | | `db/migrations/` | 用于主机、事件、发现、心跳和 ETL checkpoint 的 Postgres schema。 | | `scripts/` | 引导、技术栈验证和安全的 DLQ 重放工具。 | | `docs/` | API/数据模型说明、事件契约、部署说明和下一次构建计划。 | | `ml/` | VIRGIL Advisor 合成语料库、数据集文档、Fireworks 导出/评估工具和训练脚本。 | ## 快速开始 ``` # 如果需要,会从 .env.example 创建 .env 并注入一次性 256 位 # 本地 Postgres 密码。现有的 .env 文件保持不变。 make bootstrap docker compose up --build -d make verify ``` 本地 URL: | 服务 | URL | |---|---| | 操作员仪表板 | `http://localhost:3000` | | Go API 健康状态 | `http://localhost:8080/health` | | UI 代理的 API 健康状态 | `http://localhost:3000/api/health` | | Postgres | `localhost:5432` | | Redis | `localhost:6379` | 如果默认端口被占用,请调整 `docker-compose.yml` 中的主机绑定。 ## 开发者命令 ``` make doctor # Show local toolchain and Docker availability make test # Run Go, Rust, and Python tests; missing toolchains are skipped make up # Build and start the full stack make down # Stop the stack, preserving named volumes make logs # Tail service logs make verify # Smoke-test API and UI proxy health after the stack is up ``` 当前的主机测试套件涵盖 Go API 行为、Rust 事件形状辅助程序, 以及 Python worker/可观测性/DLQ 基础知识。 ## API 接口 | 端点 | 描述 | |---|---| | `GET /health` | Redis 和 Postgres 的健康检查。 | | `GET /ready` | 使用相同依赖探测的就绪状态检查。 | | `POST /api/v1/agents/checkin` | 更新或插入主机以及最新的 agent 心跳。 | | `GET /api/v1/agents/{agent_id}/status` | 返回单个 agent 的最新状态。 | | `GET /api/v1/alerts/recent?limit=20&offset=0` | 读取最近的发现,带有分页元数据。 | | `GET /api/v1/events/search?host_id=&event_type=&severity=&limit=50&offset=0` | 使用经过验证的过滤器搜索已持久化的事件。 | 查询防护机制: - `alerts/recent`:`limit` 必须为 `1..100`;`offset` 必须为 `0..10000`。 - `events/search`:`limit` 必须为 `1..250`;`offset` 必须为 `0..10000`。 - `events/search` 严重程度必须是 `low`、`medium`、`high` 或 `critical` 之一。 - 无效的查询参数返回 `400` 以及 `error_code`、`message` 和可选的 `details`。 ## 数据流 ``` sequenceDiagram autonumber participant R as rust-worker participant S as Redis Streams participant W as python-worker participant T as python-transformer participant P as Postgres participant A as go-api participant U as ts-ui R->>S: Publish normalized event W->>S: Read security_events W->>W: Normalize, redact, dedupe, score W->>S: Publish analysis and alerts W-->>S: Publish DLQ entry on terminal failure T->>S: Read streams from checkpoints T->>P: Upsert events and findings U->>A: Request /api/v1/alerts/recent A->>P: Query findings A-->>U: Return JSON + pagination ``` worker 在记录日志或 发布派生分析之前,会对明显的敏感命令内容进行脱敏处理。除非数据被明确认为是安全的, 否则请避免添加原始 payload 日志记录。 ## VIRGIL Advisor ML `ml/` 包是项目的模型训练端。它是围绕 兼容 OpenAI 的 `messages` JSONL 和显式的结构化答案契约构建的,因此微调后的 模型可以被评估,并最终接入运行时 pipeline。 Arthur Kaiser 的博客上提供了一篇关于训练运行的伴随文章: [一夜之间,两百万 token,以及一个自定义网络安全模型](https://www.artkaiser.net/blog/custom-cybersecurity-models-fireworks)。 VIRGIL Advisor 示例教导模型: - 将观察到的活动映射到 MITRE ATT&CK 技术。 - 解释为什么遥测数据是可疑的或良性的。 - 阅读 Sigma 风格的检测逻辑并识别已涵盖的行为。 - 推荐遥测、遏制和调查的后续步骤。 - 在端点和 SOC 时间线上执行多假设推理。 - 保留下游代码可以解析的结构化答案。 ### 语料库快照 | 指标 | 当前值 | |---|---:| | 合成注册表版本 | `0.3-synthesis` | | 合成源记录 | 2,008 | | 合成源 token 估计值 | 2,129,858 | | 合成域文件 | 13 | | 当前 Fireworks SFT 导出 | 1,900 训练 / 100 评估示例 | | 当前确定性基准快照 | 13,689 训练 / 1,964 评估示例 | | 归档的 v0.2 训练/评估快照 | 13,731 / 1,974 示例 | 这 200 万 token 的核心语料库在 `ml/synthesis_registry.json` 中进行跟踪,并 存放在 `ml/data/synthesis/` 下。兼容 Fireworks/OpenAI 的导出文件位于 `ml/data/fireworks/` 下。已提交的 `ml/data/final/` 和 `ml/training/data/` 文件是当前的 Unsloth 配置使用的确定性基准快照, 除非您更新 `dataset_path` 以指向更新的 合成导出文件。 当前的 Fireworks 清单将 2,000 条源记录导出为 1,900/100 训练/评估拆分。该注册表包含一个额外的小型 `web_framework_security` 文件,可在下次刷新导出时 包含进去。 ML 树特意排除了 PDF、解析器分块和提取的原始书籍 文本。已提交的语料库是原创的合成训练材料。 该数据集在本代码库之外也很有用。它可以作为: - 网络安全助手的 SFT 数据,该助手必须以结构化 契约进行回答。 - 用于 ATT&CK 映射、SOC 推理和遥测 推荐的评估夹具。 - 用于将较大的教师模型行为提炼为较小的 本地或托管模型的种子材料。 - 用于构建防御性安全数据集的参考格式,无需发布 受版权保护的源文本或原始敏感遥测数据。 ### 记录契约 每个训练示例都是一个包含 system、user 和 assistant 消息的聊天记录。源记录在顶层的 `meta` 对象中保存出处;Fireworks 导出会从每行中剥离该元数据,并将拆分/来源详细信息保留在 `ml/data/fireworks/manifest.json` 中。Assistant 响应使用两部分契约: ``` { "messages": [ {"role": "system", "content": "You are VIRGIL-Advisor..."}, {"role": "user", "content": "Investigate this endpoint scenario..."}, { "role": "assistant", "content": "Evidence-based analysis...\n{\"severity\":\"high\"}" } ], "meta": { "task": "hypothesis_testing", "split": "train", "synthesized": true } } ``` `` 部分教授调查纪律。`` 部分是结构化 JSON,旨在用于自动解析和评估。 ### ML 训练循环 ``` flowchart TB concepts["Security concepts
ATT&CK, Sigma, SOC, endpoint internals"] --> synth["LLM synthesis batches
VIRGIL-format examples"] synth --> registry["synthesis_registry.json
counts, domains, token estimates"] synth --> source["ml/data/synthesis/*.jsonl
domain files"] source --> prep["export/prepare scripts
split, validate, package"] prep --> train["train/eval JSONL
Fireworks or Unsloth"] train --> unsloth["Unsloth QLoRA
Mac test or RunPod H100"] unsloth --> adapter["VIRGIL-PHI1 adapter
security reasoning model"] adapter --> eval["Fireworks/inference evals
format and answer checks"] eval --> synth ``` ### 训练快速开始 检查语料库: ``` cd ml cat synthesis_registry.json ``` 将合成语料库导出为兼容 Fireworks/OpenAI 的 SFT 文件: ``` cd ml python scripts/export_fireworks_sft.py \ --input-dir data/synthesis \ --output-dir data/fireworks \ --eval-ratio 0.05 python scripts/validate_fireworks_sft.py \ data/fireworks/virgil_fireworks_train.jsonl \ data/fireworks/virgil_fireworks_eval.jsonl ``` 针对已提交的训练快照运行 Unsloth 训练: ``` # 生产级 cloud run cd ml/training python scripts/train_virgil_phi1.py --config configs/virgil_phi1_h100.yaml # 本地 24GB Mac 测试运行 python scripts/train_virgil_phi1.py --config configs/virgil_phi1_mac.yaml --force-mac ``` 当前的目标模型是使用 Unsloth QLoRA 的 `microsoft/phi-4`。JSONL 格式同样适用于其他接受聊天模板 `messages` 数据集的 SFT 技术栈。要在合成导出上训练 Unsloth 路径,请更新 配置 `dataset_path`,使其指向 `../data/fireworks/virgil_fireworks_train.jsonl`。 ## 运维说明 ### DLQ 重放 使用重放工具检查并安全地将失败的工作器消息从 `security_dlq` 重新排队。 ``` # Dry run,无写入 python3 scripts/replay_dlq.py --limit 50 # 重新排队消息 python3 scripts/replay_dlq.py --execute --limit 50 # 重新排队并删除成功重放的 DLQ 条目 python3 scripts/replay_dlq.py --execute --delete-replayed --limit 50 ``` 有用的标志: - `--from-id ` 从特定的 DLQ 流 ID 恢复。 - `--target-stream ` 强制指定目标流。 - `--fallback-stream ` 在缺少 DLQ 源流或 源流无效时使用。 ### 密钥 不要提交 `.env`。它已被 gitignore,应包含本地 Postgres 凭据、`DATABASE_URL`、`REDIS_URL` 和任何 API 密钥。如果 git 会跟踪 `.env`,`make bootstrap` 将拒绝写入 `.env`,然后从 `.env.example` 创建它,并生成一个 256 位的本地 Postgres 密码。现有的 `.env` 文件永远不会被覆盖。请保持 `.env.example` 仅包含占位符。 `DATABASE_URL` 必须与 `.env` 中的 Postgres 凭据匹配。如果本地 Postgres 卷是使用旧凭据初始化的,请在 Postgres 中轮换密码,或使用以下命令重置开发卷: ``` docker compose down -v docker compose up --build -d ``` 该重置操作具有破坏性,应仅用于本地开发数据。 ## 路线图 下一次构建顺序特意采用后端优先的原则: 1. **Transformer 安全 (`ART-14`)** 强化 `python-worker/transform_job.py` 中的 checkpoint 恢复、幂等性 和部分批处理失败行为。 2. **CI 基准 (`ART-15`)** 为 `make doctor`、`make test` 和 compose 冒烟测试添加工作流门禁 验证。 3. **产品面扩展在运行时基准更安全之后,构建更丰富的告警详细信息、调查工作流、资产清单和 模型辅助的分类。 4. **VIRGIL-PHI1 增长** 将语料库扩展到 1000 万 token 的目标,提高评估覆盖率,训练 适配器,并为 Advisor 推理定义运行时集成边界。 详细的里程碑追踪位于 `docs/next-build-plan.md` 中。 ## encinitas (Gemma 4 26B MoE LoRA) **encinitas** 是基于 [Gemma 4 26B A4B](https://huggingface.co/google/gemma-4-26B-A4B-it) 的面向生产的 LoRA,用于 VIRGIL 式蓝队推理:ATT&CK 映射、Sigma 分析、恶意软件分类和结构化的 `` / `` JSON。在约 3600 万 token(约 380 美元 SFT)上训练;公开的 OOD 评估表明,它在**输出规范**和推理经济性方面匹敌或超越了体积大得多的模型。相关文章:[VIRGIL 训练](https://www.artkaiser.net/blog/custom-cybersecurity-models-fireworks) · [encinitas 评估与成本](https://www.artkaiser.net/blog/encinitas-cheaper-better-cyber-inference)。 | 组件 | 位置 | |-------|----------| | 文档 + ROCm/CUDA 脚本 | [`inference/encinitas/`](inference/encinitas/) | | LoRA 权重 (~1 GB) | [`coldcurrent/encinitas-gemma4-lora`](https://huggingface.co/coldcurrent/encinitas-gemma4-lora) | | 基础模型 (~49 GB,受限) | `google/gemma-4-26B-A4B-it` | 需要 **48 GiB+ VRAM** (fp16)。已测试 Strix Halo / gfx1151(约 96 GiB 统一内存)。仅限 GPU —— 此技术栈不支持 NPU 混合路径。 ``` cd inference/encinitas cp encinitas.env.example encinitas.env # HF_TOKEN locally — never commit # 请先在 Hugging Face 上接受 Gemma 4 许可协议 bash fix_encinitas_gfx1151_torch.sh # AMD Strix Halo / gfx1151 (recommended) # bash fix_encinitas_rocm_venv.sh # 其他 AMD ROCm # bash setup_cuda_venv.sh # NVIDIA 48GB+ ./run_encinitas_local.sh "Investigate this endpoint alert..." ``` 完整的设置、评估表、故障排除和生产说明:[`inference/encinitas/README.md`](inference/encinitas/README.md)。 ## 许可证 MIT 许可证。详见 `LICENSE`。
标签:DLL 劫持, Docker, PostgreSQL, 可视化界面, 大语言模型, 安全分析助手, 安全运营, 安全防御评估, 扫描框架, 搜索引擎查询, 日志审计, 模型微调, 测试用例, 端点安全, 补丁管理, 请求拦截, 逆向工具