OpenVAS 漏洞扫描平台部署与使用详解

在 Ubuntu 22.04 上从零到一安装 Greenbone/OpenVAS 漏洞扫描平台(gvmd 管理器 + gvm-tools 客户端 + 插件库同步),配置 PostgreSQL 与 systemd 托管,并给出 GMP 协议 CLI 速查。

漏洞扫描漏洞扫描OpenVAS2026/10/08

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 注意事项)
  • 管理账号: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

九、参考链接