引言
在日益复杂的网络环境中,漏洞管理已成为企业安全策略不可或缺的一部分。Greenbone Vulnerability Management (GVM),前身为广为人知的 OpenVAS,是一个功能强大的开源漏洞评估系统。虽然 GVM 提供了直观的 Web 界面 Greenbone Security Assistant (GSA) 进行日常操作,但对于需要大规模自动化、集成到 CI/CD 流水线或进行深度定制化管理的安全团队而言,gvm-tools 才是真正的利器。
gvm-tools 是 Greenbone 官方提供的命令行工具集和 Python 库,它允许安全工程师、DevSecOps 团队和系统管理员通过脚本化方式,对 GVM 后端进行精细控制。通过 gvm-tools,用户可以实现扫描任务的创建、启动、监控、报告提取以及与其他企业安全工具的无缝集成,从而将漏洞管理流程融入自动化工作流,极大地提升安全运营效率。
主要特性
gvm-tools 并非传统的图形化桌面客户端,而是一个功能丰富的命令行工具集和 Python 库,其核心特性包括:
- 命令行接口 (
gvm-cli): 提供简洁的命令行指令,用于执行单个 GMP(Greenbone Management Protocol)操作,如列出扫描任务、创建目标等。 - 脚本化自动化 (
gvm-script):gvm-tools的核心功能,允许用户编写复杂的 Python 脚本,利用python-gvm库提供的 API,实现端到端的漏洞扫描生命周期自动化,包括动态目标管理、任务编排、异步轮询和报告处理。 - 交互式 Shell (
gvm-pyshell): 提供一个预加载了gmp实例的 Python 交互式环境,方便开发者快速测试 GMP 函数、探索 API 结构和调试脚本逻辑,极大地提升了开发效率。 - 灵活的连接方式: 支持多种通信通道与 GVM 后端 (
gvmd) 建立安全连接:- Unix Domain Socket (
--sockpath): 在gvm-tools与gvmd同机部署时,提供最快、最安全的本地通信,绕过了 TCP/IP 协议栈和 TLS 加解密。 - TLS 通道 (
--hostname/--gmp-port=9390): 适用于跨主机或容器间的安全通信,但需配置 TLS 客户端证书或忽略不受信任的自签名证书。 - SSH 隧道 (
--ssh-user): 允许通过 SSH 协议安全地连接远程 GVM 后端,直接复用既有 SSH 密钥对访问远程gvmd,无需在远程主机上暴露额外的端口,特别适合跨网络隔离区(DMZ)的场景。
- Unix Domain Socket (
- 强大的 GMP/OSP 协议支持: 底层基于 Greenbone Management Protocol (GMP) 和 Open Scanner Protocol (OSP) 协议,通过 XML 消息进行通信,确保与 GVM 后端功能的完全对齐,支持管理 GVM 的所有核心组件。
- 报告数据精细化处理: 支持在服务端进行报告过滤,避免下载巨型原始 XML,并能将报告导出为 XML、PDF、CSV 等多种格式,便于后续解析和集成到其他系统。
安装与快速入门
gvm-tools 主要通过 Python 的 pip 包管理器进行安装。
安装步骤:
1. 确保您的系统已安装 Python 3.x 和 pip。
2. 通过 pip 安装 gvm-tools:
bash
pip install gvm-tools
3. 如果需要支持 SSH 连接,可能还需要安装 paramiko:
bash
pip install 'gvm-tools[ssh]'
快速入门示例 (列出所有扫描任务):
在安装完成后,您可以通过 gvm-cli 连接到您的 GVM 后端并执行第一个命令。假设您的 GVM 后端运行在 localhost,端口为 9390,用户名为 admin:
gvm-cli --hostname localhost --gmp-port 9390 --username admin --password your_password gmp --xml "<get_tasks/>"
注意: 在生产环境中,应避免在命令行中直接暴露密码。建议使用配置文件或环境变量进行凭据管理。
实战指南与技巧
gvm-tools 的真正价值在于其强大的自动化能力。以下是一些实战中的高级用法和技巧,能够帮助您更高效地管理 GVM:
-
凭据与连接最佳实践:
- 凭据脱敏: 官方示例常将明文密码硬编码在命令行中。实践技巧是利用
~/.config/gvm-tools.conf配置文件或通过环境变量(GVM_USERNAME/GVM_PASSWORD)结合 CI/CD Secrets 管理器注入凭据,防止密码泄漏在 Bash 历史记录中。 - 选择合适的通信通道:
- Unix Domain Socket: 最快且最安全,适合作为 Jenkins/GitLab Runner 在本地执行操作时的首选。
- TLS 通道: 跨主机/容器间通信的推荐方式,但需配置 TLS 客户端证书或忽略不受信任的自签名证书。
- SSH 隧道: 跨网络隔离区(DMZ)时的最佳无代理方案,直接复用既有 SSH 密钥对访问远程
gvmd。
- 凭据脱敏: 官方示例常将明文密码硬编码在命令行中。实践技巧是利用
-
构建 CI/CD 漏洞扫描流水线:
将gvm-tools集成到 DevSecOps 流水线中,实现代码发布后的自动安全扫描,将“安全左移”落到实处:- 在 GitLab CI、GitHub Actions 或 Jenkins 流水线中,构建/部署步骤完成后调用
gvm-script或gvm-cli。 - 脚本使用 GMP 协议连接至 GVM 后端,动态创建或更新扫描目标(Target)(传入刚部署的环境 IP/域名)。
- 自动创建扫描任务(Task)并启动扫描,利用
gvm-tools的轮询机制监控扫描进度。 - 扫描完成后自动提取 XML 或 PDF 格式报告,解析报告中的高危漏洞(如 CVSS > 7.0)。如果发现超标漏洞,自动阻断流水线(Build Failure)。
- 在 GitLab CI、GitHub Actions 或 Jenkins 流水线中,构建/部署步骤完成后调用
-
高效处理大型扫描报告:
直接导出的原始 XML 报告可能极其庞大。不应将巨大 XML 全部下载到本地解析,而是利用 GMP 协议提供的filter_string参数进行服务端精细化预过滤:- 示例过滤字符串:
filter_string = "apply_overrides=1 levels=hml min_qod=70 rows=-1"apply_overrides=1: 应用已标记的误报覆盖规则。levels=hml: 只提取高、中、低严重程度的漏洞。min_qod=70: 只提取可信度(Quality of Detection)大于等于 70% 的结果。rows=-1: 获取所有匹配结果,而非默认的前 1000 条。
- 示例过滤字符串:
-
与企业既有系统协同:
- CMDB 联动与 Target 自动化分片: 从资产管理系统(如 NetBox)拉取最新的 IP 范围。利用
gvm-script进行分片逻辑编写,将数千个 IP 自动切割为每 256 个 IP 一个 Target,防止单次扫描任务过大导致 OpenVAS 扫描引擎宕机或性能瓶颈。 - 自动闭环工单对接: 将扫描出的高危漏洞(如特定 CVE 或 CVSS > 7.0)自动推送到 Jira、DefectDojo 或 ServiceNow 等工单系统,创建 Bug 工单并附带修复建议。当工单在 Jira 中被标记为“已修复”时,可反向触发
gvm-tools进行局部漏洞复测(Targeted Rescan),确认修复后自动关闭工单。 - SIEM 数据流管道集成: 将漏洞结果转化为 JSON 扁平化数据流(JSON Lines),批量推送到日志平台(如 Elasticsearch / Splunk)进行可视化和安全态势分析。
- CMDB 联动与 Target 自动化分片: 从资产管理系统(如 NetBox)拉取最新的 IP 范围。利用
-
高效调试技巧 (
gvm-pyshell):
gvm-pyshell是官方文档中常被忽视但极具价值的工具。在编写复杂的gvm-script脚本前,先启动gvm-pyshell。它预置了全局的gmp实例,开发者可以在交互式 Shell 中快速测试底层 GMP 函数(例如查看所有scan_configs的 UUID),验证复杂 XML 节点选择器(XPath)或测试过滤条件是否生效,极大地提升编写自动化脚本的效率。
高级用法与定制化
gvm-tools 提供了强大的 API 接口,支持高度定制化的安全工作流,打破了 Web GUI 界面的局限。
-
动态靶机与任务编排 (Dynamic Target & Task Lifecycle):
通过python-gvm库,可以实现从外部 CI/CD 管道或资产管理系统(CMDB)拉取 IP,通过 API 动态创建 Port List、Target、Task 并触发扫描,最后销毁临时资源。这对于云原生环境中频繁变化的资产管理至关重要。“`python
实战范例:动态创建目标和任务
import time
from gvm.protocols.gmp import Gmpgmp 实例已在 gvm-script 环境中自动注入
def main(gmp: Gmp, args):
# 1. 获取默认端口列表和扫描配置
port_list_id = gmp.get_port_lists(filter_string=”name=All IANA assigned TCP”).xpath(‘port_list/@id’)[0]
scan_config_id = gmp.get_scan_configs(filter_string=”name=Full and fast”).xpath(‘scan_config/@id’)[0]
scanner_id = gmp.get_scanners(filter_string=”name=OpenVAS Default”).xpath(‘scanner/@id’)[0] # 假设使用默认扫描器# 2. 动态创建目标 target_name = "Dynamic-CI-Target-1001" target_hosts = ["192.168.1.100", "192.168.1.101"] # 从外部动态获取的IP列表 target_response = gmp.create_target(name=target_name, hosts=target_hosts, port_list_id=port_list_id) target_id = target_response.xpath('@id')[0] print(f"创建目标: {target_name} (ID: {target_id})") # 3. 创建并启动任务 task_name = "Auto-Scan-for-CI-1001" task_response = gmp.create_task(name=task_name, config_id=scan_config_id, target_id=target_id, scanner_id=scanner_id) task_id = task_response.xpath('@id')[0] print(f"创建任务: {task_name} (ID: {task_id})") gmp.start_task(task_id=task_id) print(f"任务 {task_id} 已启动。") # 4. 轮询监控任务状态 while True: task = gmp.get_task(task_id) status = task.xpath('task/status/text()')[0] progress = task.xpath('task/progress/text()')[0] if task.xpath('task/progress/text()') else '0' print(f"扫描进行中... 当前进度: {progress}% (状态: {status})") if status in ['Done', 'Stopped', 'Interrupted']: break time.sleep(30) # 每30秒轮询一次 # 5. 获取最后一期的 Report ID last_report_id = task.xpath('task/last_report/report/@id')[0] # 6. 精确过滤下载高危漏洞 (High / Critical) filter_str = "levels=h min_qod=70" report = gmp.get_report( report_id=last_report_id, filter_string=filter_str, details=True ) # 7. 后续:解析 XML 节点并发送至 Slack / Jira print("报告提取完成,准备推送至 Alert 系统...")if name == ‘gvm‘:
main(gmp, args)
“` -
自定义报告生成与数据二次加工 (Custom Reporting):
除了导出 GVM 预设的 PDF/CSV 报告,gvm-tools还能获取原始 XML 报告,允许开发者进行深度解析和定制化处理。- 原生格式导出: 通过查询
gmp.get_report_formats()获取预定义格式的report_format_id(如 PDF 格式 IDc402cc3e-b531-11e1-9163-406186ea4fc5),然后通过gmp.get_report()获取 Base64 编码的报告内容并解码保存。 - XML 解析与集成: 请求 XML 格式报告(XML Format ID
a9944583-56ff-11e1-9078-406186ea4fc5),然后使用 Python 的lxml或xml.etree.ElementTree库解析 XML 节点,提取关键漏洞信息(CVE、CVSS、修复建议),并将其转化为 JSON 格式推送到 SIEM,或生成企业自定义的 Markdown 安全通报并发送至 Slack/钉钉。
- 原生格式导出: 通过查询
技术深度解析
gvm-tools 的架构设计体现了其作为 GVM 后端自动化接口的定位,理解其底层机制有助于更好地优化使用。
- 分层架构:
gvm-tools(包含gvm-cli、gvm-pyshell、gvm-script)本身是一个轻量级的命令行工具与脚本执行环境,不直接实现协议逻辑。其底层依赖python-gvm库提供 API 抽象,负责处理与gvmd的通信连接、GMP/OSP 协议的 XML 序列化与反序列化,以及不同协议版本的适配。这种解耦设计使得gvm-tools能够专注于用户接口和脚本执行。 - 通信传输机制与 API 性能:
- Unix Socket Connection: 在与
gvmd同机部署时性能最优。绕过了 TCP/IP 协议栈和 TLS 加解密,时延最低,是高频 API 交互(如实时扫描状态轮询)的首选。 - TLS Connection: 跨主机调用的标准模式,存在 TCP 握手及 TLS 证书校验开销。
- SSH Connection: 开销最高。每次建立连接均需完整的 SSH 隧道协商,适合一次性低频管理脚本,严禁用于高并发或高频 API 调用场景。
- XML 客户端解析瓶颈: 当通过
gvm-tools/python-gvm请求大规模报告时,Python 端的 XML DOM 解析会带来显著的 CPU 消耗与内存膨胀。建议在脚本层尽量拉取轻量级的 XML 字段或采用流式解析。
- Unix Socket Connection: 在与
- 大规模场景下的可伸缩性考量:
- 利用服务端 Filter 下推: GMP 支持强大的 Filter String。
gvm-toolsAPI 的最佳实践是将过滤、排序与分页(Pagination)下推给gvmd及底层的 PostgreSQL 数据库执行,仅传输精简后的结果集,从而减轻 Payload 负担。 - 同步阻塞连接与并发扩展策略: 单个 GMP 管道连接是同步且单线程的。在需要同时管理数百个扫描任务的大型企业环境中,不能依赖单进程
gvm-script,而需基于python-gvm构建分布式任务队列(如 Celery / Redis Queue),每个 Worker 维护独立的连接池,实现水平扩展。 - 长轮询与异步任务解耦: 在通过 API 触发扫描时,
gvm-tools提交的是异步任务。API 客户端不应保持长连接等待扫描完成,而应采用“触发 – 退出 – 定时轻量级 Status 轮询”的模式,防止底层 Socket 连接因超时中断。
- 利用服务端 Filter 下推: GMP 支持强大的 Filter String。
与类似工具对比
在漏洞扫描客户端和安全自动化领域,gvm-tools 面临着多种选择,理解其定位有助于做出正确的工具选型:
| 维度 / 需求 | gvm-tools (OpenVAS/GVM) |
pyTenable / Nessus |
Nuclei |
|---|---|---|---|
| 开源/成本 | 完全开源免费 | 商业收费 | 完全开源免费 |
| 部署架构 | 客户端轻量,但依赖重型 GVM 后端 | 云端 SaaS 或商业 Appliance | 极轻量(单执行文件) |
| 自动化能力 | 强(GMP 脚本控制完整生命周期) | 极强(成熟的 REST API) | 强(CLI/管道命令/YAML) |
| 应用场景 | 企业内网自动化漏洞巡检、私有云安全编排、深度漏洞管理与状态维护 | 预算充足的企业级合规与资产管理、低运维成本 | DevSecOps 快速 POC 验证、应用层轻量扫描、无状态快速扫描 |
| 协议/数据 | GMP/OSP (XML) | RESTful API (JSON) | YAML/CLI |
- 与传统商业扫描器 API/客户端 (如 pyTenable / Qualys API) 对比:
gvm-tools的优势在于完全开源免费,且数据与控制指令完全保留在本地网络,适合严格合规或断网环境。但其后端 GVM 运维成本较高,且 GMP 协议基于 XML,相较于现代商业工具的 RESTful API/JSON,原生数据处理复杂度较高。 - 与现代轻量级漏洞扫描工具/客户端 (如 Nuclei / Nikto) 对比:
gvm-tools不仅触发扫描,还能管理目标资产、配置任务计划、合并历史扫描报告和跟踪漏洞修复状态,提供符合 CVE、NVT、OVAL 标准的深度网络与系统级漏洞扫描控制。而 Nuclei 等主要专注于无状态的快速扫描与特定 POC 验证,轻量化与速度是其优势。 - 与 GVM 生态内部工具演进 (
ompvsgvm-tools):gvm-tools完全替代了已弃用的omp(OpenVAS Management Protocol CLI)。其采用 Python 开发,提供了更高的扩展性,通过gvm-script支持直接调用 Python 原生库处理 XML 解析、数据库写入和第三方集成。 - 与图形化界面控制 (GSA – Greenbone Security Assistant) 对比: GSA 是 Web 交互界面,适合手动操作。
gvm-tools则是 CLI/API 交互,支持无人值守批量触发、定时脚本、动态资产导入和自动化报告导出,且扫描配置和自动化逻辑可以作为代码存入 Git,实现可重复性与版本控制。
总结
gvm-tools 是 Greenbone Vulnerability Management (GVM) / OpenVAS 生态系统中不可或缺的自动化利器。它弥补了传统 GUI 界面在自动化、大规模部署和深度集成方面的不足,为安全团队提供了强大的脚本化控制能力。
如果您的团队已有 OpenVAS/GVM 基础设施,并希望实现无人值守的周期性扫描、报告自动提取以及与企业内部安全平台(如 DefectDojo/Jira)的串接,gvm-tools 是唯一且最佳的官方自动化桥梁。无论是希望在 CI/CD 流水线中实现自动化安全测试、将漏洞数据无缝对接至企业工单系统,还是在云原生环境中动态管理资产,gvm-tools 都能提供灵活、高效的解决方案。对于已经部署或计划部署 OpenVAS/GVM 的组织而言,掌握 gvm-tools 将是提升安全运营效率和实现 DevSecOps 实践的关键一步。
我们鼓励您访问 gvm-tools 的 GitHub 项目页面,探索其文档和示例,开始您的自动化漏洞管理之旅。

评论(0)