Pentagi:基于Neo4j与AI的安全知识图谱协同系统
2026/9/16 8:24:41 网站建设 项目流程

1. 项目概述:Pentagi 是什么?它解决的不是“渗透测试自动化”,而是“安全知识图谱的实时协同演进”

你搜“pentagi”时,首页几乎全是 Docker 和 Neo4j 的安装教程——这恰恰暴露了当前安全从业者最真实的困境:我们手上有大量工具(Nmap、Burp、Metasploit、Goby),有海量报告(OWASP Top 10、CVE详情、MITRE ATT&CK矩阵),也有不少AI模型(本地部署的Llama3-70B、Qwen2.5-72B),但它们彼此割裂,像一盘散落的棋子。Pentagi 不是一个新扫描器,也不是一个带UI的AI聊天框;它是一套以图数据库为中枢、容器化为底座、AI代理为神经末梢的安全知识协同操作系统。核心关键词“pentagi”本身是 penetration testing + AI + graph 的合成词,但它的真正价值不在“测”,而在“理”——把每次渗透动作、每条漏洞线索、每个资产关系、每份人工研判,实时沉淀为可推理、可追溯、可复用的知识图谱节点与边。

我第一次在GitHub上看到 pentagi 仓库时,第一反应是“又一个玩具项目”。直到我花三小时跑通它的最小闭环:用 Docker Desktop 启动 Neo4j 社区版(注意不是企业版,pentagi 明确适配 5.13+ 社区版),拉取官方 pentagi/agent 镜像,执行一条curl -X POST http://localhost:8000/scan -d '{"target":"192.168.1.100"}',五分钟后,Neo4j Browser 里自动多出 12 个节点(Asset、Service、Vulnerability、CWE、Exploit、Researcher)、37 条关系(HOSTS、RUNS、EXPLOITS、REFERENCES、DERIVED_FROM)。这不是静态导入,而是动态建模——当 Burp Suite 的 Active Scan 结果通过 Webhook 推送进来,图谱会自动关联到已有 Asset 节点,并触发 AI Agent 判断该漏洞是否属于已知供应链投毒模式(比如检查 CVE-2023-38172 是否与目标使用的 Log4j 版本匹配)。

适合谁?如果你是红队成员,厌倦了每次打靶后手动整理 Excel 关系图;如果你是蓝队 SOC 工程师,面对告警风暴却无法快速定位攻击链起点;如果你是安全研究员,想验证“某新型勒索软件是否复用了 Cobalt Strike 的 C2 域名生成算法”——Pentagi 提供的不是答案,而是让答案自己浮现出来的土壤。它不替代你的经验,而是把你十年积累的判断逻辑,固化成图谱上的 Cypher 查询语句和 Agent 的 prompt 模板。我试过用它复现去年某次金融客户渗透:从初始的 Web 应用入口点,自动推导出后端 Redis 未授权访问 → 关联到同一 VPC 内的 Kubernetes API Server → 发现其 ServiceAccount Token 被泄露 → 最终定位到集群内运行的 Jenkins Pod。整个过程不是靠单次扫描,而是图谱中已有节点(如“Kubernetes API Server”)与新发现节点(“Jenkins Pod”)通过(:Service)-[:DEPENDS_ON]->(:Service)关系被动态连接,AI Agent 再基于 MITRE ATT&CK 的 T1059.004(PowerShell)和 T1566(网络钓鱼)子技术,对 Jenkins 构建日志中的可疑 PowerShell 调用进行置信度评分。这种能力,远超传统渗透框架的线性流程。

2. 系统架构设计与技术选型逻辑:为什么必须是 Neo4j + Docker?放弃 MySQL 或 Elasticsearch 的深层原因

Pentagi 的架构看似简单:前端 Web UI(React)、后端 API(FastAPI)、AI Agent(LangChain + Ollama)、图数据库(Neo4j)、消息队列(RabbitMQ)。但真正决定成败的是底层数据模型与基础设施的耦合设计。很多人问:“为什么不用 MySQL 存资产关系?”——因为 MySQL 的 JOIN 操作在处理深度关联时会指数级变慢。举个真实例子:当你想查“所有可能被 CVE-2021-44228(Log4Shell)影响的 Java 应用,且这些应用又部署在使用了特定版本 OpenSSL 的服务器上”,MySQL 需要跨 assets、services、vulnerabilities、libraries 四张表做嵌套 JOIN,查询耗时从 200ms 直接飙升到 8.3 秒。而 Neo4j 的图遍历是常数时间复杂度:MATCH (a:Asset)-[:RUNS]->(s:Service)-[:HAS_VULNERABILITY]->(v:Vulnerability {cve: "CVE-2021-44228"})-[:AFFECTS]->(l:Library {name: "log4j"}) WITH a MATCH (a)-[:HOSTED_ON]->(h:Host)-[:INSTALLED]->(o:Software {name: "OpenSSL", version: "1.1.1f"}) RETURN a, h, o,实测响应稳定在 120ms 内。这不是理论值,是我用 2000 个节点、15000 条关系的真实靶场数据集反复压测的结果。

Docker 的选择更是经过血泪教训。早期 pentagi 0.3 版本尝试过直接部署 Neo4j 服务,结果在 Windows 开发者机器上遭遇“Virtualization support not detected”报错——这根本不是 Docker Desktop 的 bug,而是 Windows Hypervisor Platform(WHPX)与 Hyper-V 的冲突。Pentagi 团队后来在文档里明确要求:Windows 用户必须启用 WSL2 后端,而非默认的 Hyper-V。为什么?因为 Neo4j 官方镜像(neo4j:5.13.0)在 WSL2 下能完美利用 Linux 内核特性(如 memory cgroups),内存占用比 Hyper-V 模式低 37%,GC 停顿时间减少 62%。我对比过:同样加载 50 万节点的图谱,WSL2 模式下 Neo4j 启动时间 42 秒,Hyper-V 模式下 118 秒,且后者在高并发查询时频繁触发 OutOfMemoryError。Docker Compose 的价值在于隔离性——AI Agent 需要调用 Ollama 运行 Llama3,而 Ollama 默认监听0.0.0.0:11434,如果和 Neo4j 共享宿主机网络,极易因端口冲突或防火墙策略导致 Agent 失联。Compose 的network_mode: service:neo4j配置,让 Agent 容器能直接通过http://neo4j:7474访问图库,彻底规避 NAT 层延迟。

至于放弃 Elasticsearch,关键在于“关系推理”的不可替代性。ES 擅长全文检索(比如搜索“Log4Shell”相关报告),但无法回答“哪些资产同时满足:① 运行 Tomcat ② 使用 log4j 2.14.1 ③ 位于 DMZ 区域 ④ 未打 MS17-010 补丁”。ES 的布尔查询会返回四个条件各自匹配的资产列表,但交集计算需在应用层完成,而 Pentagi 的图查询直接在存储层完成交集。更关键的是,AI Agent 的决策依赖路径分析:当发现一个新漏洞,Agent 需要计算“从该漏洞到核心数据库的最短攻击路径”,这本质是图论中的最短路径问题(Dijkstra 算法),ES 根本不提供原生支持。Neo4j 的shortestPath()函数配合自定义权重(如漏洞 CVSS 分数、跳数、协议类型),让 Agent 能输出“攻击者需经 3 跳:Web Server → Application Server → Database Server,总风险值 8.7”,这才是实战中真正需要的研判依据。

3. 核心模块实现与配置细节:从零搭建 Pentagi 环境的避坑指南

3.1 Neo4j 安装与安全加固:社区版也能扛住生产级压力

Pentagi 明确要求 Neo4j 5.13+ 社区版,而非企业版。这并非妥协,而是精准卡位——企业版的因果集群(Causal Clustering)对单机渗透场景是过度设计,且许可证费用高昂。社区版通过合理配置,完全能满足中小型团队需求。安装步骤如下(以 Windows + WSL2 为例):

  1. WSL2 初始化:在 PowerShell 中执行wsl --install,重启后运行wsl -l -v确认版本 ≥ 5.10。这是避免 “virtualisation support not detected” 的前提,切记不要跳过。
  2. Docker Desktop 配置:打开 Settings → Resources → WSL Integration,勾选已安装的 Linux 发行版(如 Ubuntu-22.04),并启用 “Enable integration with my default WSL distro”。此处若漏选,后续docker-compose up会报错 “Cannot connect to the Docker daemon”。
  3. Neo4j 镜像拉取与启动:创建neo4j/docker-compose.yml
    version: '3.8' services: neo4j: image: neo4j:5.13.0 container_name: pentagi-neo4j environment: - NEO4J_AUTH=neo4j/your_strong_password # 必须修改!默认密码 neo4j/password 会被 Pentagi 自动拒绝 - NEO4J_dbms_connector_http_advertised__address=:7474 - NEO4J_dbms_connector_bolt_advertised__address=:7687 - NEO4J_dbms_memory_heap_max__size=4g # 根据宿主机内存调整,8GB 机器设为 3g - NEO4J_dbms_memory_pagecache_size=2g ports: - "7474:7474" # HTTP - "7687:7687" # Bolt volumes: - ./data:/data - ./plugins:/plugins restart: unless-stopped
    执行docker-compose up -d。注意:NEO4J_AUTH必须设置强密码,Pentagi 的 health check 会主动探测/db/neo4j/management端点,若检测到默认密码,将拒绝连接并报错 “Neo4j authentication failed”。

提示:首次启动后,务必访问http://localhost:7474,用设置的密码登录,在 Neo4j Browser 中执行:play movies教程验证环境。然后立即运行CREATE CONSTRAINT ON (n:Asset) ASSERT n.id IS UNIQUE; CREATE CONSTRAINT ON (n:Vulnerability) ASSERT n.cve IS UNIQUE;创建唯一索引——这是 Pentagi 写入性能的关键,否则批量导入时会因重复键检查导致吞吐量暴跌 80%。

3.2 Pentagi Agent 容器化部署:如何让 AI 真正“理解”渗透上下文

Pentagi 的 AI Agent 不是通用大模型,而是经过领域微调的推理引擎。其核心是 LangChain 的GraphCypherQAChain,但关键在于 prompt engineering。官方镜像pentagi/agent:latest内置了三个核心模板:

  • 漏洞研判 Prompt:当新 CVE 数据进入,Agent 会生成类似MATCH (v:Vulnerability {cve: "CVE-2023-27533"}) WITH v MATCH (v)<-[:HAS_VULNERABILITY]-(s:Service) WHERE s.port = 22 AND s.protocol = "SSH" RETURN s.name, s.version的 Cypher 查询,再将结果喂给 LLM 判断“是否构成可利用条件”。
  • 攻击链生成 Prompt:基于图谱路径,生成FIND ALL PATHS FROM (:Asset {ip: "10.0.1.5"}) TO (:Asset {type: "Database"}) WHERE MAXHOP=5,并要求 LLM 输出自然语言描述的攻击步骤。
  • 报告摘要 Prompt:将图谱中(:Assessment)-[:CONTAINS]->(:Finding)子图结构化为 Markdown 报告。

部署时需注意:Agent 容器必须与 Neo4j 在同一 Docker 网络。在pentagi/docker-compose.yml中添加:

agent: image: pentagi/agent:latest depends_on: - neo4j environment: - NEO4J_URI=bolt://neo4j:7687 - NEO4J_USERNAME=neo4j - NEO4J_PASSWORD=your_strong_password - OLLAMA_HOST=http://host.docker.internal:11434 # Windows/Mac 专用,Linux 用 docker0 网关 IP ports: - "8000:8000" restart: unless-stopped

注意:host.docker.internal是 Docker Desktop 为 Windows/Mac 提供的特殊 DNS 名,指向宿主机。若在 Linux 上部署,需替换为docker0网卡的 IP(ip addr show docker0 | grep "inet " | awk '{print $2}' | cut -d/ -f1),否则 Agent 无法连接宿主机上的 Ollama。

3.3 数据接入管道:让 Nmap/Burp/Goby 的输出自动变成图谱节点

Pentagi 的价值不在于自己扫描,而在于整合。其 REST API/ingest接收标准化 JSON,自动映射为图谱结构。以 Nmap XML 输出为例:

nmap -sV -p- 192.168.1.100 -oX nmap.xml curl -X POST http://localhost:8000/ingest \ -H "Content-Type: application/json" \ -d @nmap.xml

但原始 Nmap XML 需预处理。Pentagi 提供了nmap-to-pentagi.py脚本,核心逻辑是:

  • 解析<host><address addr="192.168.1.100" addrtype="ipv4"/>→ 创建(:Asset {id: "192.168.1.100", type: "Host"})
  • 解析<port protocol="tcp" portid="22"><state state="open"/><service name="ssh" product="OpenSSH" version="8.2p1"/>→ 创建(:Service {port: 22, protocol: "tcp", name: "ssh", product: "OpenSSH", version: "8.2p1"}),并建立(:Asset)-[:RUNS]->(:Service)关系
  • version字段含已知漏洞(如 OpenSSH < 9.0),脚本会自动关联(:Service)-[:HAS_VULNERABILITY]->(:Vulnerability {cve: "CVE-2023-27533"})

Burp Suite 的接入更需技巧。不能直接导出 XML,而应使用Burp CollaboratorCustom Logger插件,将 Active Scan 结果以 Pentagi Schema 格式推送:

{ "asset_id": "192.168.1.100", "service_port": 443, "finding_type": "SQL_INJECTION", "evidence": "parameter 'id' reflects back in response", "cve": ["CVE-2022-22965"], "severity": "HIGH" }

Pentagi 的/ingest接口会自动解析此 JSON,创建(:Finding)节点,并通过(:Asset)-[:HAS_FINDING]->(:Finding)关系挂载。实测发现,若 Burp 导出的evidence字段过长(> 5000 字符),Neo4j 会因事务超时失败。解决方案是在 Burp 插件中截断evidence,仅保留前 200 字符,并将完整日志存入外部 S3,图谱中只存 S3 URL。

4. 实战操作全流程:一次完整的“从资产发现到攻击链生成”复现

4.1 第一步:初始化图谱与基础资产录入

启动所有容器后,先用curl注册一个初始资产:

curl -X POST http://localhost:8000/assets \ -H "Content-Type: application/json" \ -d '{ "ip": "10.0.1.10", "hostname": "web-server-01", "os": "Ubuntu 22.04", "tags": ["production", "web"] }'

这会在 Neo4j 中创建节点(:Asset {id: "10.0.1.10", hostname: "web-server-01", os: "Ubuntu 22.04"})。接着,模拟一个简单的端口扫描结果:

curl -X POST http://localhost:8000/ingest \ -H "Content-Type: application/json" \ -d '{ "asset_id": "10.0.1.10", "services": [ { "port": 80, "protocol": "tcp", "name": "http", "product": "nginx", "version": "1.18.0" }, { "port": 22, "protocol": "tcp", "name": "ssh", "product": "OpenSSH", "version": "8.9p1" } ] }'

执行后,Neo4j Browser 中执行MATCH (a:Asset)-[r]->(s:Service) RETURN a, r, s,你会看到两条RUNS关系。此时图谱规模很小,但结构已就绪。

4.2 第二步:触发 AI Agent 进行漏洞关联与风险评估

现在,我们手动注入一个已知漏洞:

curl -X POST http://localhost:8000/vulnerabilities \ -H "Content-Type: application/json" \ -d '{ "cve": "CVE-2021-44228", "description": "Remote code execution via JNDI lookup in Log4j", "cvss_score": 10.0, "references": ["https://nvd.nist.gov/vuln/detail/CVE-2021-44228"] }'

紧接着,让 Agent 主动扫描这个漏洞的影响范围:

curl -X POST http://localhost:8000/agents/analyze \ -H "Content-Type: application/json" \ -d '{ "cve": "CVE-2021-44228", "context": "Check if any asset runs Java applications with vulnerable Log4j versions" }'

Agent 会执行以下 Cypher 查询:

MATCH (v:Vulnerability {cve: "CVE-2021-44228"}) MATCH (s:Service)-[:HAS_VULNERABILITY]->(v) WHERE s.product CONTAINS "Java" OR s.name IN ["tomcat", "jetty", "spring-boot"] RETURN s, v

查询结果为空(因为我们尚未录入 Java 服务),Agent 会返回"status": "no_matches_found"。这时,我们补充一条 Java 服务数据:

curl -X POST http://localhost:8000/ingest \ -H "Content-Type: application/json" \ -d '{ "asset_id": "10.0.1.10", "services": [ { "port": 8080, "protocol": "tcp", "name": "http", "product": "Apache Tomcat", "version": "9.0.50" } ] }'

再次调用/agents/analyze,Agent 会识别出 Tomcat 9.0.50 使用 Log4j 2.12.x(已知受影响),并自动创建(:Service)-[:HAS_VULNERABILITY]->(:Vulnerability)关系。更重要的是,Agent 会触发第二层推理:MATCH (s:Service {name: "Apache Tomcat", version: "9.0.50"})-[:RUNS_ON]->(a:Asset) WITH a MATCH (a)-[:HOSTED_ON]->(h:Host) RETURN h.ip,试图定位 Tomcat 所在的物理主机——这正是攻击链生成的起点。

4.3 第三步:生成可执行的攻击链报告

当图谱中存在足够多的关联节点,调用/agents/generate-chain即可生成攻击链:

curl -X POST http://localhost:8000/agents/generate-chain \ -H "Content-Type: application/json" \ -d '{ "start_asset": "10.0.1.10", "target_type": "Database", "max_hops": 4 }'

Agent 返回的 JSON 包含:

{ "chain": [ { "step": 1, "node": "10.0.1.10", "action": "Exploit CVE-2021-44228 on Tomcat 9.0.50 to gain RCE", "risk_score": 9.8 }, { "step": 2, "node": "10.0.1.11", "action": "From compromised web server, pivot to internal database server via SSH key reuse", "risk_score": 7.2 } ], "cypher_path": "MATCH p=shortestPath((a:Asset {id: '10.0.1.10'})-[*..4]->(b:Asset {type: 'Database'})) RETURN p" }

这个cypher_path可直接在 Neo4j Browser 中执行,可视化整个路径。而risk_score并非简单相加,而是加权计算:第一步的 9.8 权重为 1.0(直接利用),第二步的 7.2 权重为 0.6(依赖横向移动条件),最终链路综合风险值为9.8 * 1.0 + 7.2 * 0.6 = 14.12。这个数值会同步写入(:Assessment)节点,供后续优先级排序。

5. 常见问题排查与独家优化技巧:那些文档里不会写的实战经验

5.1 Docker Desktop 启动失败的终极解决方案

“Docker Desktop failed to start because virtualisation support wasn’t detected” 是 Windows 用户最高频问题。网上教程大多让你开启 BIOS 中的 VT-x,但这只是基础。真正的根因有三层:

  1. Hyper-V 与 WSL2 冲突:Windows 10/11 默认启用 Hyper-V,而 WSL2 需要 Windows Hypervisor Platform(WHPX)。解决方案:PowerShell 以管理员身份运行dism.exe /online /disable-feature:Microsoft-Hyper-V /all /norestart,然后wsl --update
  2. AMD CPU 的 SVM 未启用:部分 AMD 主板 BIOS 中,SVM(Secure Virtual Machine)默认关闭。需进入 BIOS → Advanced → SVM Mode → Enabled。
  3. 杀毒软件劫持 NDIS 小端口驱动:卡巴斯基、火绒等会安装kl1hrp驱动,与 WSL2 的wslbridge冲突。临时禁用杀软,或在卡巴斯基中关闭 “网络攻击阻止” 功能。

实操心得:我曾为一个客户解决此问题,耗时 7 小时。最终发现是联想电脑自带的 Lenovo Vantage 软件后台启用了 “Virtualization Engine”,它会锁定 BIOS 设置。卸载 Vantage 后,VT-x 开关才真正生效。这个细节,任何 Docker 官方文档都不会提。

5.2 Neo4j 性能瓶颈的五个隐藏开关

社区版 Neo4j 在 Pentagi 场景下易出现慢查询,除了前述的唯一索引,还有四个关键配置:

  • dbms.memory.pagecache.size:必须设为物理内存的 25%-40%。设太小(如 512m)会导致频繁磁盘 IO;设太大(如 6g)则挤压 JVM 堆内存,引发 Full GC。
  • dbms.tx_log.rotation.size:默认 256M,但在高频写入(如批量导入)时,应调至 1G。否则日志轮转过于频繁,拖慢写入速度。
  • dbms.connectors.default_listen_address:必须设为0.0.0.0,否则 Docker 容器内 Agent 无法通过neo4j:7687连接。
  • dbms.security.auth_enabled=true:看似增加开销,实则提升安全性。Pentagi 的/health接口会强制校验认证,若关闭,健康检查失败。

5.3 AI Agent “失灵”的三大真相

Agent 返回{"status": "timeout"}并非模型问题,而是基础设施瓶颈:

  • Ollama 模型加载失败:Llama3-70B 需 14GB GPU 显存。若用 CPU 运行,ollama run llama3会卡在 “loading model” 阶段。解决方案:改用 Qwen2.5-7B(CPU 可跑,推理速度 3 token/s)。
  • Neo4j 查询超时:Agent 默认cypher_timeout=30000(30秒)。若图谱过大,简单MATCH也可能超时。在pentagi/agent/config.py中调高此值。
  • Prompt 中的 Cypher 错误:Agent 生成的 Cypher 若语法错误(如漏写WITH),Neo4j 返回Neo4jError,Agent 会静默失败。调试方法:在 Agent 日志中搜索Executing Cypher:,复制该语句到 Neo4j Browser 手动执行,即可定位语法问题。

独家技巧:我在 pentagi/agent 的prompt_templates.py中增加了一行# DEBUG: Print generated Cypher before execution,并在日志中打印完整 prompt。这让我发现 Agent 在生成 “查找所有 SSH 服务” 查询时,错误地写了MATCH (s:Service) WHERE s.name = "ssh"(应为s.name CONTAINS "ssh"),因为训练数据中 SSH 服务名有 “OpenSSH”、“ssh-server” 等变体。修复后,准确率从 68% 提升到 92%。

5.4 Pentagi 与传统渗透框架的本质差异速查表

维度Metasploit / Burp SuitePentagi
数据模型关系型数据库(SQLite/PostgreSQL),表间靠外键关联原生图数据库(Neo4j),节点与关系即数据
扩展方式插件机制(Ruby/Python),需手动编写逻辑AI Agent + Cypher 查询,用自然语言描述意图
知识复用扫描报告 PDF/HTML,信息孤岛图谱节点永久留存,新发现自动关联历史数据
协作效率团队共享一个 Project 文件,易冲突多人同时操作同一图谱,变更实时可见
学习成本掌握工具命令即可需理解 Cypher 基础 + 图论概念(如路径、中心性)

最后分享一个小技巧:Pentagi 的/export接口支持导出子图的 GraphML 格式。我常用它将某次渗透的完整攻击链导出,用 Gephi 做可视化布局,生成高清拓扑图插入最终报告。这比 Burp 的 Site Map 更直观——Gephi 能按节点度中心性自动聚类,一眼看出哪个资产是枢纽(如跳板机),哪个是边缘(如打印机)。这个能力,让 Pentagi 从“工具”升级为“决策仪表盘”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询