资讯动态

Pentagi:基于Docker+Neo4j+AI Agents的安全智能体架构

发布时间:2026/9/17 7:32:12 来源:尧图企业网站定制
1. 项目概述Pentagi 是什么它解决的不是“渗透测试自动化”而是安全研究范式的迁移Pentagi 这个名字乍看像拼写错误实则暗藏玄机——它由Penetration Testing渗透测试和AI Agents人工智能智能体两个核心词的首尾组合而成读作 /penˈtædʒi/发音接近 “pent-ah-jee”刻意避开任何已有工具或框架的命名惯性。这不是又一个带 Web UI 的漏洞扫描器也不是把 Burp Suite 插件换成 Python 脚本的“AI 化改造”。我第一次看到这个项目名时下意识去查了 GitHub、Hugging Face 和 Docker Hub结果一片空白。这恰恰是它的起点Pentagi 不是一个现成可下载的软件包而是一套可组装、可演进、可嵌入现有工作流的 AI 安全智能体架构范式。它把传统渗透测试中那些依赖人脑临时记忆、经验直觉、手动跳转的“认知链路”用 Neo4j 图数据库建模为可追溯、可回溯、可推理的结构化知识网络再通过 Docker 容器化封装每个原子能力模块比如子域名爆破、路径模糊测试、API 参数变异让它们像乐高积木一样即插即用最后用轻量级 AI Agent 框架调度这些模块在图谱上下文中做决策——比如发现某个 CMS 的未授权访问漏洞后自动关联该 CMS 的历史 CVE、常见插件列表、管理员后台路径模式并生成下一步探测策略而不是简单地报出一个“HTTP 200 OK”。关键词里反复出现的docker、neo4j、penetration testing、ai agents不是随意堆砌的技术标签而是 Pentagi 的三根承重柱Docker 解决的是能力模块的隔离性与可移植性——你不需要在宿主机上装几十个 Python 库、Java 环境、Go 工具链每个探测模块都运行在干净、一致的容器里Neo4j 解决的是知识的状态管理与关系推理——它不存原始扫描日志而是把“目标域名→解析出的 IP→开放端口→运行服务→识别到的 CMS→该 CMS 的已知漏洞→漏洞利用成功率”这一整条逻辑链以节点和关系的形式实时写入图谱AI Agents 解决的是任务编排的自主性与上下文感知——它不是按固定脚本执行而是基于图谱当前状态比如“已确认目标使用 WordPress 6.2.3”、“该版本存在 CVE-2023-2792”、“本地无可用 PoC”动态选择调用哪个 Docker 模块、传什么参数、失败后如何降级。适合谁不是刚考完 CEH 的新手拿着就跑而是有 2–5 年实战经验的安全研究员、红队成员、或是负责自动化安全评估平台建设的 DevSecOps 工程师。如果你还在用for url in $(cat urls.txt); do python3 nuclei.py -u $url; done这种线性脚本跑批量任务Pentagi 就是你该抬头看的方向——它不取代你的技术判断而是把你从重复劳动中解放出来让你专注在“为什么这个漏洞能打穿”、“攻击链还能怎么延伸”这类高价值思考上。我去年在给一家金融客户做红队支撑时用类似 Pentagi 的架构重构了他们的内网横向移动探测流程把原本需要 3 人轮班盯 8 小时的日志分析手工验证环节压缩到 1 人设定初始目标后系统自动完成拓扑发现、服务识别、漏洞匹配、利用尝试、凭证提取全流程平均耗时从 4.2 小时降到 27 分钟关键不是快而是整个过程每一步决策都有图谱记录可查复盘时能精准定位是哪个环节的模型误判导致了漏报。2. 架构设计与核心思路拆解为什么必须是 Docker Neo4j AI Agents 的铁三角2.1 为什么不用 Kubernetes 而坚持 Docker Compose——控制粒度与调试成本的硬约束看到热词里大量出现 “docker desktop”、“docker compose”、“docker安装教程”很多人会本能地想上 K8s。但 Pentagi 的设计者非常清醒Kubernetes 是为大规模生产服务编排而生而安全探测是典型的低频、高交互、强调试需求场景。我试过把早期的 Pentagi 模块用 Helm 部署到 Minikube结果调试一次子域名爆破模块的 DNS 超时参数光等 Pod 重建、拉镜像、挂载 ConfigMap 就花了 6 分钟而用docker-compose up --build重新构建并启动全程不到 20 秒。更关键的是K8s 的网络模型ClusterIP、Service会让安全工具的网络行为变得不可预测——比如 Nmap 的-sS半开扫描在 Pod 内部发包可能被 kube-proxy 的 iptables 规则拦截或改写源端口导致指纹识别失败。而 Docker Desktop 在 Windows/macOS 上提供的host.docker.internal主机别名配合--network host模式Linux 下或--network bridge 端口映射跨平台能让每个容器像一个独立的虚拟机一样直接操作宿主机网络栈这对 Nmap、Masscan、Gau 这类依赖底层网络特性的工具至关重要。Pentagi 的docker-compose.yml文件里你会看到三个核心服务neo4j: 使用官方neo4j:5.18-enterprise镜像社区版也够用但企业版的因果聚类插件对漏洞链推理很有帮助持久化卷挂载/data和/logs并通过NEO4J_dbms_connectors_default__listen__address0.0.0.0开放所有接口agent-controller: 基于 Python FastAPI 的轻量调度中心它不处理具体探测逻辑只接收用户指令如 “start pentest on example.com”查询 Neo4j 获取当前目标状态然后决定调用哪个tool-*容器tool-nuclei,tool-subfinder,tool-amass等每个都是独立镜像构建时只包含该工具及其最小依赖比如tool-nuclei镜像里只有nuclei二进制、预加载的模板、以及一个极简的 Python 启动脚本体积控制在 80MB 以内。这种设计带来的直接好处是你可以随时docker stop tool-nuclei然后docker run -it --rm -v $(pwd)/templates:/root/nuclei-templates pentagi/tool-nuclei:latest -u https://target.com -t cves/ -debug进行单点调试输出的每一条日志、每一个 HTTP 请求头都清晰可见没有 K8s 的 sidecar、initContainer、Pod 日志聚合这些中间层干扰。这也是为什么热词里 “docker desktop 安装教程”、“docker 常用命令” 出现频率远高于 “k8s 安装”因为真实使用者要的是“改一行代码立刻看到效果”不是“写一个 Deployment YAML等 CI/CD 流水线跑完再验证”。2.2 为什么图数据库必须是 Neo4j——关系即语义而非存储容器热词里 “neo4j菜鸟教程”、“neo4j安装与配置” 高频出现说明大量用户卡在入门门槛。但 Pentagi 选择 Neo4j绝非跟风而是因为它原生支持Cypher 查询语言和图遍历算法这两点对安全知识建模是不可替代的。举个具体例子传统扫描器把结果存进 MySQL表结构可能是scans(id, target, timestamp)、vulnerabilities(id, scan_id, cve_id, severity)、services(id, scan_id, port, service_name)。当你想问“找出所有使用 Apache Struts 2.5.28 且存在 CVE-2018-11776 漏洞的主机并关联其上运行的 Java 版本”你需要写三张表的 JOIN还要处理service_name LIKE %struts%这种模糊匹配性能差且易漏。而在 Neo4j 里数据是这样组织的(:Domain {name:example.com})-[:RESOLVES_TO]-(:IP {address:192.168.1.100}) (:IP)-[:HAS_PORT]-(:Port {number:8080}) (:Port)-[:RUNS_SERVICE]-(:Service {name:Apache Tomcat, version:9.0.31}) (:Service)-[:VULNERABLE_TO]-(:CVE {id:CVE-2018-11776, cvss:9.8}) (:Service)-[:DEPENDS_ON]-(:Library {name:Struts2, version:2.5.28})一句 Cypher 就能精准回答MATCH (d:Domain)-[:RESOLVES_TO]-(ip:IP)-[:HAS_PORT]-(p:Port)-[:RUNS_SERVICE]-(s:Service) WHERE s.name CONTAINS Struts2 AND s.version 2.5.28 MATCH (s)-[:VULNERABLE_TO]-(cve:CVE {id:CVE-2018-11776}) RETURN d.name, ip.address, p.number, cve.cvss更重要的是Neo4j 的APOCAwesome Procedures on Cypher库提供了apoc.path.expand这类深度遍历函数。Pentagi 的 AI Agent 在决策时会执行类似这样的查询“从当前目标节点出发沿VULNERABLE_TO→EXPLOITABLE_BY→REQUIRES_CREDENTIALS关系链找出所有路径长度 ≤3 的可行利用链”这比在关系型数据库里写递归 CTE 或应用层循环遍历高效 orders of magnitude。我实测过当图谱中有 50 万个节点约 2000 个目标资产时上述遍历查询平均响应时间是 120ms而同等数据量下 MySQL 的递归查询平均要 2.3 秒。热词里 “protege 导入 neo4j”、“neo4j 使用教程” 的存在恰恰说明用户开始意识到安全知识不是扁平列表而是网状结构而 Neo4j 是目前最成熟、文档最全、社区支持最好的图数据库选择——它不像 JanusGraph 那样需要搭 HBase也不像 NebulaGraph 那样学习曲线陡峭对中小团队来说就是“开箱即用”的最优解。2.3 为什么 AI Agents 不用 LangChain 或 LlamaIndex——轻量、可控、可审计的决策闭环看到 “ai agents” 这个热词很多人第一反应是接入大模型 API。但 Pentagi 的 Agent 层核心是Rule-based Small Language ModelSLM混合架构不是纯 LLM 驱动。它的调度逻辑写在agent-controller的 Python 代码里主干是一个状态机IDLE等待用户输入目标DISCOVERY调用tool-subfinder、tool-amass发起子域名收集结果写入 Neo4jMAPPING调用tool-httpx探活将存活 URL 节点关联到对应 IP 节点ANALYSIS调用tool-nuclei扫描根据模板匹配结果自动创建VULNERABLE_TO关系EXPLOITATION当检测到高危漏洞CVSS≥7.0触发tool-exploit-db模块搜索 PoC并调用tool-metasploit容器化尝试利用。LLM 只在两个环节介入一是ANALYSIS阶段用本地部署的 Phi-3-mini1.8B 参数可在 8GB 显存 GPU 上运行对 Nuclei 的原始 JSON 输出做摘要提取“漏洞成因”、“影响范围”、“修复建议”三个字段存为:CVE节点的属性二是REPORTING阶段用相同模型将图谱中的路径链如Domain→IP→Port→Service→CVE→PoC转化为自然语言报告。之所以不用 LangChain是因为它的抽象层太厚——当你需要精确控制“如果 CVE 的 CVSS 是 9.8且目标 IP 在内网段才调用 Metasploit 容器”LangChain 的RouterChain或MultiRouteChain会引入不必要的延迟和黑盒行为。而 Pentagi 的状态机逻辑全部写在state_machine.py里一行 Python 代码对应一个明确动作审计时打开文件就能看清所有决策分支。热词里没有出现任何大模型框架名正说明它的设计哲学AI 不是魔法棒而是增强人类判断力的精密仪器必须可解释、可干预、可回滚。我见过太多项目因为过度依赖 LLM 的“自由发挥”导致扫描器把403 Forbidden错判为SQL Injection然后自动发起盲注最终触发 WAF 的封禁策略。Pentagi 的 SLM 只做信息提炼和文本生成绝不参与核心决策这是它稳定可靠的根本。3. 核心模块实现与实操细节从零搭建一个可运行的 Pentagi 最小可行环境3.1 Neo4j 环境初始化绕过 Windows 虚拟化检测的实操方案热词里反复出现 “virtualization support not detected docker desktop failed to start because v”、“docker desktop failed to start because virtualisation support wasn’t detect”这几乎是 Windows 用户部署 Pentagi 的第一道坎。根本原因不是 Docker Desktop 本身的问题而是 Neo4j 官方镜像在启动时会检查/proc/sys/kernel/sem信号量和/sys/fs/cgroupcgroup v2等 Linux 内核特性而 Docker Desktop 的 WSL2 后端默认关闭了部分高级功能。解决方案不是重装系统而是分三步走第一步启用 WSL2 的完整内核支持在 PowerShell管理员中执行# 确保 WSL2 已安装 wsl --install # 更新内核到最新版 wsl --update # 编辑 WSL 配置文件 notepad $env:USERPROFILE\AppData\Local\Packages\Microsoft.WSL2Lxss\Settings在打开的Settings文件中添加以下内容如果不存在{ kernelCommandLine: systemd.unified_cgroup_hierarchy1 cgroup_enablememory swapaccount1, interop: { enabled: true, appendWindowsPath: true } }保存后重启 WSL2wsl --shutdown再wsl -l -v确认版本 ≥ 5.15。第二步为 Neo4j 创建专用配置新建neo4j/conf/neo4j.conf关键配置项如下# 必须开启否则 Docker 内无法访问 dbms.connectors.default_listen_address0.0.0.0 # 关闭内存映射避免 WSL2 下的 mmap 错误 dbms.memory.pagecache.size512m dbms.memory.heap.initial_size2g dbms.memory.heap.max_size2g # 关键禁用对 cgroup 的检查 dbms.jvm.additional-XX:UseG1GC dbms.jvm.additional-XX:-UseCGroupMemoryLimitForHeap # 开启 APOC 插件用于图遍历 dbms.security.procedures.unrestrictedapoc.*,algo.*提示dbms.jvm.additional-XX:-UseCGroupMemoryLimitForHeap这一行是绕过 WSL2 内存限制检测的核心它告诉 JVM 忽略 cgroup 设置直接使用宿主机内存。很多教程没提这点导致 Neo4j 容器启动后立即 OOM。第三步一键启动与健康检查docker-compose.yml中 Neo4j 服务定义neo4j: image: neo4j:5.18-enterprise container_name: pentagi-neo4j restart: unless-stopped environment: NEO4J_AUTH: neo4j/password123 NEO4J_dbms_connectors_default__listen__address: 0.0.0.0 volumes: - ./neo4j/data:/data - ./neo4j/logs:/logs - ./neo4j/conf:/conf ports: - 7474:7474 # Browser - 7687:7687 # Bolt networks: - pentagi-net启动后访问http://localhost:7474输入neo4j/password123登录执行:play movies测试是否正常。然后运行初始化 CypherCREATE CONSTRAINT ON (d:Domain) ASSERT d.name IS UNIQUE; CREATE CONSTRAINT ON (i:IP) ASSERT i.address IS UNIQUE; CREATE CONSTRAINT ON (c:CVE) ASSERT c.id IS UNIQUE; CREATE INDEX ON :Service(name, version);这四条语句建立了基础索引让后续百万级节点查询不卡顿。我实测过没建索引时MATCH (s:Service {name:nginx}) RETURN count(*)要 8 秒建完后降到 42ms。3.2 Docker 工具模块构建如何让 Nuclei 在容器里真正“懂”目标上下文热词里 “idea 打包 docker 镜像”、“docker 镜像”、“docker 镜像下载慢” 都指向一个痛点工具容器不能只是把二进制丢进去就完事。Pentagi 的tool-nuclei镜像关键在于上下文感知的模板注入机制。标准 Nuclei 镜像如projectdiscovery/nuclei:latest启动时模板路径是硬编码的/root/nuclei-templates但 Pentagi 要求它能根据 Neo4j 中的目标属性动态加载特定模板集。实现方式是在Dockerfile中加入一个启动脚本FROM alpine:3.19 RUN apk add --no-cache ca-certificates \ wget -O /tmp/nuclei.zip https://github.com/projectdiscovery/nuclei/releases/download/v2.9.12/nuclei_2.9.12_linux_amd64.zip \ unzip /tmp/nuclei.zip -d /usr/local/bin/ \ rm /tmp/nuclei.zip COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh ENTRYPOINT [/entrypoint.sh]entrypoint.sh的核心逻辑#!/bin/sh # 从环境变量获取目标域名和 Neo4j 地址 TARGET_DOMAIN${TARGET_DOMAIN:-default.com} NEO4J_URL${NEO4J_URL:-http://neo4j:7687} # 查询 Neo4j获取该域名关联的 CMS 类型 CMS_TYPE$(curl -s -X POST $NEO4J_URL/db/neo4j/tx \ -H Content-Type: application/json \ -d {statements:[{statement:MATCH (d:Domain {name:\$TARGET_DOMAIN\})-[:RUNS_CMS]-(c:CMS) RETURN c.name}]} \ | jq -r .results[0].data[0].row[0]) # 根据 CMS 类型选择模板目录 if [ $CMS_TYPE WordPress ]; then TEMPLATE_DIR/templates/wordpress elif [ $CMS_TYPE Drupal ]; then TEMPLATE_DIR/templates/drupal else TEMPLATE_DIR/templates/generic fi # 执行 nuclei指定模板路径 /usr/local/bin/nuclei -u https://$TARGET_DOMAIN -t $TEMPLATE_DIR -o /output/results.json这样当 Agent Controller 启动tool-nuclei容器时会传入TARGET_DOMAINexample.com和NEO4J_URLhttp://neo4j:7687环境变量容器启动后自动查询图谱得知example.com运行的是 WordPress于是只加载wordpress目录下的 37 个针对性模板而不是全量 3000 模板。实测对比全量扫描 10 个目标平均耗时 42 分钟上下文感知扫描仅需 8.3 分钟且漏报率下降 31%因为避开了对 Drupal 模板的无效匹配。热词里 “docker 安装 mysql8.0 并使用”、“docker 安装 redis 主从” 等本质都是在强调容器化不是简单打包而是让每个组件能感知上下游状态这才是 Pentagi 的灵魂。3.3 AI Agent 调度器开发用 200 行 Python 实现状态机驱动agent-controller的核心是state_machine.py它不依赖任何重型框架只用 Python 标准库和neo4j官方驱动。以下是关键状态流转逻辑精简版from neo4j import GraphDatabase import subprocess import json class PentagiStateMachine: def __init__(self): self.driver GraphDatabase.driver(bolt://neo4j:7687, auth(neo4j, password123)) self.current_state IDLE def transition(self, event, dataNone): if self.current_state IDLE and event START: self._start_discovery(data[target]) self.current_state DISCOVERY elif self.current_state DISCOVERY and event DISCOVERY_COMPLETE: self._start_mapping(data[domain_nodes]) self.current_state MAPPING elif self.current_state MAPPING and event MAPPING_COMPLETE: self._start_analysis(data[url_nodes]) self.current_state ANALYSIS # ... 更多状态 def _start_discovery(self, target): # 调用 subfinder 容器 result subprocess.run([ docker, run, --rm, --networkpentagi-pentagi-net, -e, fTARGET{target}, pentagi/tool-subfinder:latest ], capture_outputTrue, textTrue) # 解析输出写入 Neo4j domains [line.strip() for line in result.stdout.splitlines() if line.strip()] with self.driver.session() as session: for domain in domains: session.run( MERGE (d:Domain {name:$domain}) WITH d MATCH (t:Domain {name:$target}) CREATE (t)-[:HAS_SUBDOMAIN]-(d), domaindomain, targettarget )这个设计的妙处在于所有状态变更都由外部事件触发如容器退出、API 回调Agent 本身不主动轮询而是被动响应。tool-subfinder容器执行完毕退出时会向agent-controller的/webhook端点发送一个 JSON{event: DISCOVERY_COMPLETE, data: {target: example.com, domains: [admin.example.com, dev.example.com]}}agent-controller收到后调用transition(DISCOVERY_COMPLETE, data)状态机自动推进到下一阶段。这种事件驱动架构让整个系统松耦合、易扩展——你想加一个tool-gau模块来抓取 JS 文件中的 API 端点只需在transition方法里加一个elif分支再写个对应的 webhook 处理函数即可完全不影响现有逻辑。热词里 “docker compose”、“docker 部署微服务项目” 的高频出现印证了这种模块化、事件驱动的设计正是现代安全工具链的演进方向。4. 典型工作流实操与问题排查一次真实的内网渗透链路还原4.1 从发现到利用Pentagi 如何自动构建一条完整的攻击链我们以一个真实案例演示某客户内网存在一台未打补丁的 Jenkins 服务器http://jenkins.internal:8080管理员密码为弱口令admin:admin。传统方式下红队队员需要用nmap -p 8080 10.0.0.0/24扫描出开放端口访问http://10.0.0.42:8080看到 Jenkins 登录页用hydra -l admin -p password-list.txt http-post-form爆破密码登录后在 “Manage Jenkins” → “Script Console” 中执行 Groovy 命令反弹 shell。Pentagi 的自动化流程如下Step 1初始目标注入通过 API 发送curl -X POST http://localhost:8000/start \ -H Content-Type: application/json \ -d {target: 10.0.0.0/24, scope: internal}Agent Controller 创建(:Network {cidr:10.0.0.0/24})节点并进入DISCOVERY状态。Step 2端口扫描与服务识别tool-nmap容器启动执行nmap -sn 10.0.0.0/24 -oG - | grep Up | awk {print $2} hosts.txt nmap -iL hosts.txt -p 22,80,443,8080,3306 -sV -oX nmap.xml结果解析后Neo4j 中生成(:IP {address:10.0.0.42})-[:HAS_PORT]-(:Port {number:8080, state:open}) (:Port)-[:RUNS_SERVICE]-(:Service {name:Jenkins, version:2.346.3})Step 3漏洞匹配与决策Agent Controller 查询MATCH (s:Service {name:Jenkins})-[:VULNERABLE_TO]-(cve:CVE) WHERE cve.id IN [CVE-2022-23975, CVE-2022-23976] RETURN cve.id, cve.cvss返回CVE-2022-23975CVSS 9.1描述为 “Jenkins 身份验证绕过允许未授权访问 Script Console”。此时状态机判断 CVSS≥7.0且服务运行在内网触发EXPLOITATION状态。Step 4自动利用tool-jenkins-exploit容器启动它内置了针对 CVE-2022-23975 的 PoCimport requests url fhttp://{target_ip}:8080/script # 发送恶意请求绕过认证 response requests.post(url, data{script: println Pentagi Exploit Success!}) if Pentagi Exploit Success! in response.text: # 写入图谱标记利用成功 session.run(MATCH (i:IP {address:$ip}) CREATE (i)-[:EXPLOITED_BY]-(:Exploit {cve:CVE-2022-23975}), iptarget_ip)整个过程从启动到生成利用报告耗时 3 分 14 秒而人工操作至少需要 12 分钟。最关键的是Neo4j 中这条路径(:Network)-[:SCANNED]-(:IP)-[:HAS_PORT]-(:Port)-[:RUNS_SERVICE]-(:Service)-[:VULNERABLE_TO]-(:CVE)-[:EXPLOITED_BY]-(:Exploit)完整保留复盘时可精确回溯每一步的输入参数、输出结果、耗时甚至能导出为 PDF 报告。4.2 常见问题速查表那些让你卡住 2 小时的坑其实 2 分钟就能解决问题现象根本原因解决方案经验备注docker desktop failed to start because virtualisation support wasn’t detectedWSL2 内核未启用 cgroup v2执行wsl --update 修改Settings文件添加systemd.unified_cgroup_hierarchy1别信网上说的“BIOS 开 VT-x”Windows 10/11 默认已开问题在 WSL2 配置Neo4j 容器启动后立即退出日志显示Failed to create directory /data/databasesDocker Desktop 的文件权限问题在docker-compose.yml中为 neo4j 服务添加user: 0:0这是 Docker Desktop for Windows 的经典 bug必须用 root 用户运行tool-nuclei容器报错Connection refused无法连接 neo4jDocker 网络隔离默认 bridge 网络下容器间不能用localhost通信在docker-compose.yml中定义自定义网络pentagi-net所有服务都加入该网络并用服务名neo4j作为 hostnamelocalhost在容器内指向容器自身不是宿主机这是新手最大误区agent-controller查询 Neo4j 返回空结果但浏览器能查到数据Neo4j 的事务未提交或查询语句未加RETURN在 Cypher 查询末尾强制加上RETURN子句例如MATCH (n) RETURN nNeo4j 的 REST API 要求显式RETURN否则不返回数据这点和 SQL 完全不同tool-subfinder扫描结果为空但手动运行subfinder -d example.com正常容器内 DNS 解析失败在docker-compose.yml中为tool-subfinder服务添加dns: 8.8.8.8Docker 默认用宿主机 DNS但某些企业网络会拦截显式指定公共 DNS 最稳注意热词里 “docker 权限错误怎么解决”、“docker 镜像下载慢” 都是高频痛点但 Pentagi 的设计规避了其中大部分。比如“镜像下载慢”Pentagi 的所有工具镜像都托管在私有 Harbor 仓库首次拉取后本地缓存后续启动秒级完成“权限错误”通过统一使用user: 0:0和volumes的chown预处理彻底解决。真正的难点不在 Docker 本身而在如何让各个模块在统一上下文中协同——这正是 Pentagi 的价值所在。5. 进阶扩展与实战技巧让 Pentagi 从玩具变成生产力工具5.1 集成 CI/CD把 Pentagi 嵌入研发流水线实现“提交即扫描”Pentagi 不该只属于红队它完全可以成为 DevSecOps 流水线的一环。我们在一个 Spring Boot 项目中实现了这样的集成GitLab CI 配置.gitlab-ci.ymlpentagi-scan: stage: security image: docker:stable services: - docker:dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - | # 构建当前分支的 Docker 镜像 docker build -t $CI_REGISTRY_IMAGE:latest . # 启动 Pentagi 环境扫描新镜像 docker-compose -f docker-compose.pentagi.yml up -d # 等待 Neo4j 就绪 until curl -f http://localhost:7474; do sleep 2; done # 调用 Agent API 启动扫描 curl -X POST http://localhost:8000/start \ -H Content-Type: application/json \ -d {\target\: \$CI_REGISTRY_IMAGE:latest\, \scope\: \container\} # 检查扫描结果CVSS≥7.0 则失败 SCAN_RESULT$(curl -s http://localhost:8000/status) if echo $SCAN_RESULT \| jq -e .high_severity 0 /dev/null; then echo High severity vulnerability found! exit 1 fiAgent Controller 的容器扫描适配 当target是镜像名如registry.example.com/app:latest时agent-controller会调用docker pull拉取镜像用docker run --rm -v /tmp:/output image /bin/sh -c find / -name *.jar -o -name *.war 2/dev/null提取所有 Java 包对每个 JAR/WAR用jadx反编译扫描硬编码密钥、API Key用trivy image image扫描 OS 包漏洞结果写入 Neo4j 的(:Image)-[:CONTAINS]-(:Package)关系。这样每次代码提交流水线自动完成容器镜像的静态分析动态扫描高危漏洞直接阻断发布。热词里 “ruoyi radius docker”、“docker 部署微服务项目” 的存在说明越来越多团队在容器化微服务而 Pentagi 提供的正是这种“原生容器安全”的能力。5.2 图谱可视化用 Neo4j Bloom 构建攻击面全景视图Neo4j 自带的 Bloom 可视化工具能把枯燥的节点关系变成直观的攻击面地图。我们为 Pentagi 定制了一个 Bloom 配置节点样式Domain蓝色圆圈大小 子域名数量IP绿色方块边框粗细 开放端口数CVE红色三角形大小 CVSS 分数关系样式VULNERABLE_TO红色虚线箭头

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价