企业每年在漏洞扫描工具上的投入是惊人的。Nessus Professional 年费约 $3,990,Tenable.io 按资产计费,100个资产年费超过 $5,000。对于中小企业和独立安全团队来说,这笔费用完全可以省掉——Greenbone Vulnerability Management (GVM) + OpenVAS 是完全免费且功能对等的方案。
定价对比
| 项目 | Nessus Professional | Tenable.io | Greenbone/OpenVAS |
|---|---|---|---|
| 年费 | $3,990 | $5,000+(100资产) | 免费 |
| 漏洞库 | 190,000+ | 190,000+ | 110,000+(社区版) |
| 扫描引擎 | 闭源 | 闭源 | 开源 |
| 报告导出 | PDF/CSV/HTML | 全格式 | PDF/CSV/XML |
| 资产管理 | 有限 | 完整 | 完整 |
| API支持 | 有限 | 完整 | 完整(GMP协议) |
Greenbone 社区版的漏洞库虽然比商业版少,但覆盖了99%的常见漏洞,且每日自动更新。
架构说明
GVM 由以下组件构成:
- gvmd: 主守护进程,管理扫描任务、用户、配置
- openvas-scanner: 实际执行漏洞扫描的引擎
- gsad: Web管理界面(Greenbone Security Assistant)
- ospd-openvas: scanner与gvmd之间的通信桥梁
- PostgreSQL: 存储扫描结果和配置
- Redis: 缓存和消息队列
完整安装步骤(Ubuntu 22.04/24.04)
方式一:Docker一键部署(推荐)
# 安装Docker
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
# 拉取官方镜像
docker pull greenbone/gvm:latest
# 创建数据目录
mkdir -p /opt/gvm-data/{data-sockets,var-lib,ssh,gnupg}
# 启动容器
docker run -d \
--name gvm \
-p 8080:8080 \
-p 5432:5432 \
-v /opt/gvm-data/var-lib:/var/lib/gvm \
-v /opt/gvm-data/data-sockets:/run/ospd \
-v /opt/gvm-data/ssh:/etc/ssh \
-v /opt/gvm-data/gnupg:/etc/gnupg \
greenbone/gvm:latest
# 等待初始化完成(首次需要下载漏洞库,约10-20分钟)
docker logs -f gvm
# 访问 https://localhost:8080
# 默认账号: admin / admin
方式二:源码编译安装(生产环境推荐)
# 系统准备
apt update && apt upgrade -y
apt install -y \
gcc cmake pkg-config \
libglib2.0-dev libgnutls28-dev libpq-dev \
libssh-dev libxml2-dev libical-dev libgcrypt20-dev \
libgpgme-dev libhiredis-dev libradcli-dev \
libksba-dev libsnmp-dev libnet1-dev \
libpopt-dev libldap2-dev \
redis-server postgresql postgresql-contrib \
python3 python3-pip python3-dev python3-setuptools \
python3-psutil python3-gmpy2 python3-lxml \
xmlstarlet texlive-fonts-recommended texlive-latex-extra \
wget curl git nmap nsis zip unzip
# 创建gvm用户
useradd -r -M -U -d /opt/gvm -s /usr/sbin/nologin gvm
# 配置PostgreSQL
sudo -u postgres createuser gvm
sudo -u postgres createdb -O gvm gvmd
sudo -u postgres psql -c "ALTER USER gvm WITH SUPERUSER;"
# 配置Redis
cat > /etc/redis/redis-openvas.conf << 'EOF'
port 0
unixsocket /run/redis-openvas/redis.sock
unixsocketperm 770
loglevel notice
databases 128
maxmemory 512mb
maxmemory-policy allkeys-lru
save ""
EOF
mkdir -p /run/redis-openvas
chown redis:gvm /run/redis-openvas
usermod -aG gvm redis
# 编译安装各组件(按顺序)
export INSTALL_PREFIX=/usr/local
export SOURCE_DIR=/opt/gvm-source
mkdir -p $SOURCE_DIR
# 1. GVM-libs
cd $SOURCE_DIR
wget https://github.com/greenbone/gvm-libs/archive/refs/tags/v22.7.0.tar.gz
tar xzf v22.7.0.tar.gz && cd gvm-libs-22.7.0
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
-DSYSCONFDIR=/etc -DLOCALSTATEDIR=/var
make -j$(nproc) && make install
# 2. OpenVAS Scanner
cd $SOURCE_DIR
wget https://github.com/greenbone/openvas-scanner/archive/refs/tags/v22.7.1.tar.gz
tar xzf v22.7.1.tar.gz && cd openvas-scanner-22.7.1
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
-DSYSCONFDIR=/etc -DLOCALSTATEDIR=/var
make -j$(nproc) && make install
# 3. OSPD-OpenVAS
cd $SOURCE_DIR
wget https://github.com/greenbone/ospd-openvas/archive/refs/tags/v22.6.0.tar.gz
tar xzf v22.6.0.tar.gz && cd ospd-openvas-22.6.0
pip3 install . --prefix=$INSTALL_PREFIX --break-system-packages
# 4. gvmd
cd $SOURCE_DIR
wget https://github.com/greenbone/gvmd/archive/refs/tags/v23.0.0.tar.gz
tar xzf v23.0.0.tar.gz && cd gvmd-23.0.0
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
-DSYSCONFDIR=/etc -DLOCALSTATEDIR=/var
make -j$(nproc) && make install
# 5. GSA (Web UI)
cd $SOURCE_DIR
wget https://github.com/greenbone/gsa/archive/refs/tags/v23.0.0.tar.gz
tar xzf v23.0.0.tar.gz && cd gsa-23.0.0
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
-DSYSCONFDIR=/etc -DLOCALSTATEDIR=/var
make -j$(nproc) && make install
# 6. 下载漏洞库(Feed同步)
greenbone-feed-sync --type GVMD_DATA
greenbone-feed-sync --type SCAP
greenbone-feed-sync --type CERT
# 首次同步约30分钟,后续增量更新
# 创建Systemd服务
cat > /etc/systemd/system/gvmd.service << 'EOF'
[Unit]
Description=Greenbone Vulnerability Manager
After=postgresql.service redis-server.service
[Service]
Type=forking
User=gvm
Group=gvm
ExecStart=/usr/local/sbin/gvmd --osp-vt-update=/run/ospd/ospd-openvas.sock
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/openvas-scanner.service << 'EOF'
[Unit]
Description=OpenVAS Scanner
After=redis-server.service
[Service]
Type=simple
User=gvm
Group=gvm
ExecStart=/usr/local/bin/ospd-openvas \
--config /etc/ospd/ospd-openvas.conf \
--log-file /var/log/gvm/ospd-openvas.log \
--unix-socket /run/ospd/ospd-openvas.sock
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now gvmd openvas-scanner
配置详解
创建管理员用户
# 创建超级管理员
gvmd --create-user=admin --password=admin123 --role=Super
# 或修改密码
gvmd --user=admin --new-password=admin123
# 获取管理员UUID(后续配置需要)
gvmd --get-users --verbose | grep admin
配置扫描目标
# 通过GMP协议命令行操作
# 创建目标
gvm-cli --gmp-username admin --gmp-password admin123 \
socket --socketpath /run/gvmd/gvmd.sock \
--xml "<create_target><name>Production Network</name><hosts>192.168.1.0/24</hosts></create_target>"
# 创建扫描任务
TARGET_ID="<从上面命令返回获取>"
gvm-cli --gmp-username admin --gmp-password admin123 \
socket --socketpath /run/gvmd/gvmd.sock \
--xml "<create_task><name>Full Scan</name><target id='$TARGET_ID'/></create_task>"
Web界面操作流程
- 浏览器访问
https://localhost:8080(自签名证书,确认例外) - 用 admin 账号登录
- Configuration → Targets → 新建目标,填写IP范围、端口列表、SSH凭证
- Scans → Tasks → 新建任务,选择目标和扫描策略
- Full and Fast 是最常用的策略,覆盖95%的漏洞检测
- 点击开始按钮启动扫描
实战案例:扫描内网服务器
场景:扫描DMZ区Web服务器集群
# 创建专用扫描配置(只扫描Web相关端口)
gvm-cli --gmp-username admin --gmp-password admin123 \
socket --socketpath /run/gvmd/gvmd.sock \
--xml '<create_target>
<name>DMZ Web Servers</name>
<hosts>10.0.2.10,10.0.2.11,10.0.2.12</hosts>
<port_list id="33d0cd82-57c6-11e1-8ed1-406186ea4fc5"/>
</create_target>'
# 使用"Full and Fast Ultimate"策略(策略ID可以通过Web UI获取)
# 启动扫描任务
# 查看扫描进度
gvm-cli --gmp-username admin --gmp-password admin123 \
socket --socketpath /run/gvmd/gvmd.sock \
--xml "<get_tasks/>" | grep -oP 'progress="[^"]*"'
# 扫描完成后导出报告
gvm-cli --gmp-username admin --gmp-password admin123 \
socket --socketpath /run/gvmd/gvmd.sock \
--xml '<get_reports report_id="REPORT_ID" format_id="c402cc3e-b531-11e1-9163-406186ea4fc5"/>' \
> /tmp/scan_report.pdf
自动化定期扫描脚本
cat > /opt/gvm-auto-scan.sh << 'SCRIPT'
#!/bin/bash
GMP_USER="admin"
GMP_PASS="admin123"
SOCKET="/run/gvmd/gvmd.sock"
TARGET_ID="target-uuid-here"
# 启动扫描
TASK_ID=$(gvm-cli --gmp-username $GMP_USER --gmp-password $GMP_PASS \
socket --socketpath $SOCKET \
--xml "<create_task><name>Auto-$(date +%Y%m%d)</name><target id='$TARGET_ID'/></create_task>" \
| grep -oP 'id="[^"]*"' | head -1 | tr -d 'id="')
# 等待完成
while true; do
STATUS=$(gvm-cli --gmp-username $GMP_USER --gmp-password $GMP_PASS \
socket --socketpath $SOCKET \
--xml "<get_tasks task_id='$TASK_ID'/>" | grep -oP 'status="[^"]*"' | head -1)
echo "$(date): Status=$STATUS"
[[ "$STATUS" == "status=\"Done\"" ]] && break
sleep 60
done
# 导出CSV报告
REPORT_ID=$(gvm-cli --gmp-username $GMP_USER --gmp-password $GMP_PASS \
socket --socketpath $SOCKET \
--xml "<get_tasks task_id='$TASK_ID'/>" | grep -oP 'report id="[^"]*"' | head -1)
echo "Scan complete. Report: $REPORT_ID"
SCRIPT
chmod +x /opt/gvm-auto-scan.sh
# 加入crontab每周日2点执行
echo "0 2 * * 0 /opt/gvm-auto-scan.sh >> /var/log/gvm-scan.log 2>&1" | crontab -
性能调优
# /etc/openvas/openvas.conf 优化
cat >> /etc/openvas/openvas.conf << 'EOF'
max_hosts=30
max_checks=10
network_timeout=5
plugins_timeout=320
safe_checks=yes
optimize_test=yes
non_simult_ports=139, 445
EOF
# PostgreSQL优化
cat >> /etc/postgresql/14/main/postgresql.conf << 'EOF'
shared_buffers=512MB
work_mem=16MB
maintenance_work_mem=256MB
effective_cache_size=1536MB
EOF
systemctl restart postgresql
功能对比表
| 功能 | Nessus Pro | Greenbone/OpenVAS |
|---|---|---|
| CVE覆盖 | 99.9% | 95%+ |
| 扫描速度 | 快 | 中等(可调优) |
| Web界面 | 简洁 | 功能丰富 |
| API | REST | GMP/XML over Socket |
| 凭证扫描 | 支持 | 支持 |
| 合规扫描 | PCI-DSS/HIPAA等 | 基础支持 |
| 报告定制 | 灵活 | 灵活(XSLT模板) |
| 资产管理 | 内置 | 内置 |
| 告警通知 | 邮件/Webhook | 邮件/SCP/SMB |
| 多用户 | 支持 | 支持(RBAC) |
| 价格 | $3,990/年 | 免费 |
常见问题
Q: OpenVAS扫描结果误报率高怎么办? A: 在扫描配置中启用"Safe Checks",并使用凭证扫描(authenticated scan)可以大幅降低误报。
Q: 如何扫描外网资产? A: 在防火墙上开放Scanner到目标的端口,或部署远程Sensor。GVM支持多Sensor架构。
Q: 漏洞库更新频率? A: 社区Feed每日更新。商业Feed(Greenbone购买)更新更及时且覆盖面更广,但社区版足以应对99%的场景。
对于一个年预算有限的安全团队来说,OpenVAS + GVM 的组合完全能满足漏洞管理需求。唯一的成本是服务器资源和运维人员的学习时间。把省下的 $4,000 拿去加固基础设施,比买扫描工具更实在。
评论