OpenVAS 漏洞扫描平台部署与使用详解
在 Ubuntu 22.04 上从零到一安装 Greenbone/OpenVAS 漏洞扫描平台(gvmd 管理器 + gvm-tools 客户端 + 插件库同步),配置 PostgreSQL 与 systemd 托管,并给出 GMP 协议 CLI 速查。
OpenVAS 漏洞扫描平台部署与使用详解
目标:在一台 Ubuntu 22.04 服务器上从零到一部署 Greenbone 开源漏洞扫描套件,核心组件为 gvmd(Greenbone Vulnerability Manager 管理器)、GVM-Tools 命令行客户端与 greenbone-feed-sync 插件库同步工具,配置 PostgreSQL 存储、systemd 托管,并给出基于 GMP 协议的 CLI 速查。文中版本取自 Ubuntu 22.04 官方仓库实测版本。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64,含 systemd)
- 组件与版本(来自 Ubuntu 22.04 universe 仓库,实测输出):
- gvmd:21.4.4(Greenbone Vulnerability Manager,GMP over UNIX socket
/run/gvm/gvmd.sock) - gvm-tools:21.1.0(gvm-cli / gvm-cli-prompt 客户端)
- python3-gvm:21.10.0(GMP Python 客户端库)
- openvas-scanner:21.4.3(扫描器,Ubuntu 打包存在依赖缺口,见 4.2 注意事项)
- gvmd:21.4.4(Greenbone Vulnerability Manager,GMP over UNIX socket
- 管理账号:admin,密码 q1w2e3r4(GMP 用户名/口令,见 5.2)
- 数据存储:PostgreSQL 14(gvmd 使用,数据库名
gvmd) - 插件数据:下载到
/var/lib/gvm/(社区 Feed)
二、前置条件
- Ubuntu 22.04 系统,配好
apt软件源(可用公网archive.ubuntu.com)。 - root 或可
sudo的用户。 - 可访问 PostgreSQL 与需要联网同步漏洞 Feed(社区 Feed 默认可用,无需额外注册)。
- 磁盘至少 20 GB(漏洞 Feed 数据增长较快)。
三、安装方案
OpenVAS/GVM 的安装分两条路线:A)Ubuntu 官方仓库包(推荐、apt 安装 gvmd/gvm-tools 等可直接运行),以及 B)Greenbone 源码构建完整套件(可得到可执行的扫描器 openvas 与 Web 界面 GSA,但需要完整编译工具链)。
3.1 方案 A:Ubuntu 仓库安装(推荐)
更新软件源并安装管理器与客户端工具:
apt-get update
apt-get install -y gvmd gvm-tools python3-gvm postgresql postgresql-contrib
💡 说明:
gvmd会自动安装postgresql等依赖。此方案能够立即获得可运行的管理器 gvmd 与 gmp-cli 客户端。
3.2 方案 B:源码构建完整套件(含扫描器与 Web 界面)
若需要可实际执行 TCP 扫描的 openvas 扫描器与 Web 管理界面(GSA),需要按 Greenbone 官方顺序编译 gvm-libs → openvas-scanner → gvmd → gsa。源码构建前置较重:
# 编译工具链
apt-get install -y build-essential cmake pkg-config
# gvm-libs 依赖
apt-get install -y libglib2.0-dev libgnutls28-dev libgpgme-dev libjson-glib-dev libxml2-dev libssh-gcrypt-dev libhiredis-dev libradcli-dev libpcap-dev libnet1-dev
源码构建流程(依次编译安装,<版本> 替换为官方 release 标签):
cd /opt/data/gvm
wget -q https://github.com/greenbone/gvm-libs/archive/refs/tags/v<版本>.tar.gz
tar xzf v<版本>.tar.gz && cd gvm-libs-<版本>
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build && cmake --install build
ldconfig
⚠️ 前置要求:源码构建需要 full 网络以拉取依赖头文件与子模块,且 openvas 扫描器通常还依赖 Redis 做临时缓存与
notus通知,整体编译+联调工作量大。若只想快速验证管理链路,优先方案 A。
四、配置
4.1 初始化 PostgreSQL 并为 gvmd 建库
gvmd 需要独立的 PostgreSQL 数据库。初始化集群并创建 gvmd 数据库与专用用户:
pg_createcluster 14 main
pg_ctlcluster 14 main start
su - postgres -c "psql -c \"CREATE USER gvm WITH LOGIN PASSWORD 'q1w2e3r4';\""
su - postgres -c "createdb -O gvm gvmd"
验证数据库已就绪:
su - postgres -c "psql -l"
预期回显(节选 gvmd 行):
gvmd | gvm | SQL_ASCII | C | C |
⚠️ 注意:本文实测环境中
initdb使用系统默认 C 编码,因此gvmd库被建为SQL_ASCII / C / C。若你按 UTF-8 初始化集群(推荐中文内容存 UTF-8),此处会显示UTF8 / C.UTF-8 / C.UTF-8,同样可用。
4.2 启动扫描器服务的注意事项
Ubuntu 22.04 universe 的 openvas-scanner 包在测试环境中存在依赖缺口:openvas 二进制启动时报缺 libopenvas_nasl.so.21 / libopenvas_misc.so.21 共享库,回显如下:
openvas: error while loading shared libraries: libopenvas_nasl.so.21: cannot open shared object file: No such file or directory
⚠️ 前置要求:这是 Ubuntu 仓库把 openvas-scanner 与 libopenvas 拆分打包导致的历史缺口。实际生产部署请选用方案 B(源码构建)或官方公布的二进制发布渠道以获得可运行的扫描器;本文后续管理链路(gvmd + gvm-cli + feed 同步)验证不受此影响。
4.3 同步漏洞 Feed
Greenbone 需要从社区 Feed 同步漏洞数据(使用 gvmd 管理的 greenbone-feed-sync):
/usr/sbin/greenbone-feed-sync --help
预期回显(本文实测真实输出):
/usr/sbin/greenbone-feed-sync: Sync feed data
No GSF access key found: Using Community Feed
--describe display current feed info
--feedversion display version of this feed
--help display this help
--identify display information
--selftest perform self-test
--type <TYPE> choose type of data to sync (CERT, SCAP or GVMD_DATA)
--version display version
同步 GVMD 数据(首次耗时较长,连接的是 Greenbone 社区 Feed 服务器):
/usr/sbin/greenbone-feed-sync --type GVMD_DATA
真实回显(节选,本文实测):
Greenbone community feed server - http://feed.community.greenbone.net/
This service is hosted by Greenbone Networks - http://www.greenbone.net/
...
receiving incremental file list
timestamp
13 100% 12.70kB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 43 bytes received 115 bytes 28.73 bytes/sec
total size is 13 speedup is 0.08
4.4 运行 gvmd 并创建管理员
gvmd 由 systemd 单元 gvmd.service 管理,systemctl cat gvmd.service 查看真实单元内容(Ubuntu 22.04 打包,本文实测):
# /lib/systemd/system/gvmd.service
[Unit]
Description=Greenbone Vulnerability Manager daemon (gvmd)
After=network.target networking.service postgresql.service ospd-openvas.service
Wants=postgresql.service ospd-openvas.service
Documentation=man:gvmd(8)
ConditionKernelCommandLine=!recovery
[Service]
Type=forking
User=_gvm
Group=_gvm
PIDFile=/run/gvm/gvmd.pid
RuntimeDirectory=gvm
RuntimeDirectoryMode=2775
ExecStart=/usr/sbin/gvmd --osp-vt-update=/run/ospd/ospd.sock --listen-group=_gvm
Restart=always
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
⚠️ 首次启动前必须打通 gvmd 的数据库认证。gvmd 以系统用户
_gvm运行,通过 PostgreSQL 的 peer 认证连接库,因此需要存在同名数据库角色_gvm,并新建 gvmd 内部管理角色dba赋给_gvm:su - postgres -c "psql -p 5432 -c \"CREATE ROLE _gvm WITH LOGIN SUPERUSER;\"" su - postgres -c "psql -p 5432 -d gvmd -c \"GRANT dba TO _gvm;\""缺
_gvm角色时 gvmd 起不来,日志报FATAL: role \"_gvm\" does not exist;缺dba角色时报SET ROLE \"dba\"; ERROR: role \"dba\" does not exist。另外 gvmd 默认以 unix socket 连接本机 PostgreSQL 的 5432 端口,请确认集群监听在该端口。
启动服务并查看运行状态(每行只操作一个单元):
systemctl start gvmd
systemctl status gvmd
真实回显(本文实测,Main PID 为实际值):
● gvmd.service - Greenbone Vulnerability Manager daemon (gvmd)
Loaded: loaded (/lib/systemd/system/gvmd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-10-08 14:09:45 UTC; 1min 37s ago
Docs: man:gvmd(8)
Main PID: 10588 (gvmd)
Tasks: 1 (limit: 8648)
Memory: 2.4M
CPU: 418ms
查询版本:
gvmd --version
真实回显:
Greenbone Vulnerability Manager 21.4.4
Manager DB revision 242
Copyright (C) 2009-2021 Greenbone Networks GmbH
License: AGPL-3.0-or-later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
💡 说明:
Manager DB revision 242是当前 gvmd 实例的数据库结构版本号,升级 gvmd 时该值会变化。
五、验证与使用
5.1 用 gvm-cli 连接测试
gvm-tools 客户端(两端通过 GMP 协议经 UNIX socket 通信,本机 socket 路径为 /run/gvm/gvmd.sock)禁止以 root 直接运行,需先用普通用户。创建测试用户:
adduser --disabled-password --gecos "" scanner
用该用户查看 gvm-cli 帮助(本文实测真实输出):
su scanner -c "gvm-cli --help"
真实回显:
usage: gvm-cli [-h] [-c [CONFIG]]
[--log [{DEBUG,INFO,WARNING,ERROR,CRITICAL}]]
[--timeout TIMEOUT] [--gmp-username GMP_USERNAME]
[--gmp-password GMP_PASSWORD] [-V] [--protocol {GMP,OSP}]
CONNECTION_TYPE ...
options:
-h, --help show this help message and exit
-c [CONFIG], --config [CONFIG]
Configuration file path (default: ~/.config/gvm-tools.conf)
--log [{DEBUG,INFO,WARNING,ERROR,CRITICAL}]
Activate logging (default level: None)
--timeout TIMEOUT Response timeout in seconds, or -1 to wait indefinitely (default: 60)
--gmp-username GMP_USERNAME
Username for GMP service (default: '')
--gmp-password GMP_PASSWORD
Password for GMP service (default: '')
-V, --version Show version information and exit
⚠️ 注意:以 root 直接运行
gvm-cli --version会失败,回调栈中触发 gvmtools 的do_not_run_as_root()检查(见File ".../gvmtools/helper.py", line 168, in do_not_run_as_root)。任何 gvm-cli 子命令都要用非特权用户(如本文scanner)执行。
5.2 创建 gmp 管理账号
在 gvmd 数据已初始化后,用 gvmd 自带的用户管理命令创建 admin(GMP 账号,口令示例 q1w2e3r4)。注意:必须切换为 gvmd 的运行用户 _gvm 来执行(以 root 直连会被 PostgreSQL peer 认证拒绝,报 role "root" does not exist):
su -s /bin/bash _gvm -c "/usr/sbin/gvmd --create-user=admin --password=q1w2e3r4"
真实回显:
User created.
💡 说明:成功提示为
User created.。若回显Error: Could not get database lock(gvmd 守护进程占用 DB 锁),请先systemctl stop gvmd后再创建,创建完再启动。
5.3 GMP 交互式验证
以 scanner 用户通过 socket 发送一个 <get_version/> 请求验证通路:
su scanner -c "gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml '<get_version/>'"
真实回显:
<get_version_response status="200" status_text="OK"><version>21.4</version></get_version_response>
💡 说明:GMP 的版本查询命令应为
<get_version/>(写成<version/>会返回Response Error 400. Bogus command name)。(20.8+的版本应答status_text为OK,<version>不含补丁号)。
六、CLI 速查(GVM 命令行)
以下命令均在非 root 用户下执行,socket 路径为本机实际值 /run/gvm/gvmd.sock:
# 版本查询(socket 连接,可省略认证参数以匿名只读)
gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml "<get_version/>"
# 查询目标(Targets)
gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml "<get_targets/>"
# 查询任务(Tasks)
gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml "<get_tasks/>"
# 查询结果(Results/GMP)
gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml "<get_results/>"
# 启动某任务(<task_id> 为上方 get_tasks 返回的 id)
gvm-cli --gmp-username admin --gmp-password q1w2e3r4 socket --socketpath /run/gvm/gvmd.sock --xml "<start_task task_id='<task_id>'/>"
💡 说明:GMP 是 XML over socket 协议,
gvm-cli --help顶部给出 TIME/URL/TLS/SSH/Socket 等多种连接类型,默认--protocol GMP(OSP 为扫描器协议)。所有 GMP 请求均可用socket --socketpath /run/gvm/gvmd.sock连接本机管理器;该 socket 属主为_gvm,普通用户需加入_gvm组(usermod -aG _gvm <用户>)才能读写。
七、常见问题(FAQ)
Q1:gvm-cli 一运行就报 Python Traceback(do_not_run_as_root)。
→ gvm-tools 安全策略禁止 root 用户执行,调用栈回退到 gvmtools/helper.py 的 do_not_run_as_root()。改用普通用户(如本文 scanner)执行即可。
Q2:openvas 二进制报缺 libopenvas_nasl.so.21。
→ Ubuntu universe 打包缺口(见 4.2),生产请走源码构建或官方二进制渠道。
Q3:greenbone-feed-sync 提示 No GSF access key found: Using Community Feed。
→ 属正常提示,未配置企业 Feed 密钥时默认走社区 Feed 即可。
Q4:gvmd 起不来,日志报角色不存在 / 无法连接库。
→ 分两类:FATAL: role "_gvm" does not exist 是缺 gvmd 运行用户 _gvm 对应的数据库角色;SET ROLE "dba"; ERROR: role "dba" does not exist 是缺 gvmd 内部管理角色 dba。按 4.4 的 psql 语句补建即可。另外 gvmd 默认以 unix socket 连本机 5432 端口,确认集群监听在 5432(pg_lsclusters 查看)。
八、卸载方式
# 停止相关服务(每行只操作一个单元)
systemctl stop gvmd
systemctl disable gvmd
systemctl stop postgresql
systemctl disable postgresql
# 卸载软件
apt-get autoremove -y gvmd gvm-tools openvas-scanner python3-gvm
apt-get autoremove -y postgresql postgresql-contrib
# 如需彻底清除数据目录
rm -rf /var/lib/gvm /var/lib/postgresql/14/main
九、参考链接
- Greenbone 官方文档(社区版):https://greenbone.github.io/docs/
- Greenbone Vulnerability Manager 安装指南:https://greenbone.github.io/docs/latest/
- GVM-Tools(gvm-cli):https://github.com/greenbone/gvm-tools
- Ubuntu 软件包 gvmd/gvm-tools/python3-gvm:https://packages.ubuntu.com/jammy/gvmd