OpenVAS 漏洞扫描
OpenVAS/GVM 命令:部署初始化与订阅更新、目标与任务管理(gvm-cli)、报告导出与 CVE 结果研判
前置知识
建议先阅读以下内容再进入本文:
OpenVAS/GVM 服务管理
基本写法:启动 GVM 服务
gvm-start
# 启动 Greenbone 漏洞管理服务
gvm-start
基本写法:停止 GVM 服务
gvm-stop
# 停止 GVM 所有服务
gvm-stop
基本写法:查看服务状态
gvm-check-setup
# 检查 GVM 安装与运行状态
gvm-check-setup
基本写法:重启 GVM 服务
systemctl restart gvmd
# 重启 gvmd 服务
sudo systemctl restart gvmd
sudo systemctl restart ospd-openvas
基本写法:查看日志
journalctl -u gvmd -f
# 实时查看 gvmd 服务日志
sudo journalctl -u gvmd -f
gvm-tools 命令行操作
基本写法:安装 gvm-tools
pip3 install gvm-tools
# 安装 gvm-tools 命令行工具
pip3 install gvm-tools
基本写法:连接 GVM
gvm-cli tls --hostname <主机> --port 9390 --gmp-username <用户> --gmp-password <密码>
# 连接 GVM 服务(交互式)
gvm-cli tls --hostname 127.0.0.1 --port 9390 --gmp-username admin --gmp-password admin
基本写法:执行 GMP 命令
gvm-cli tls --hostname <主机> --port 9390 --gmp-username <用户> --gmp-password <密码> --xml "<命令>"
# 执行 GMP XML 命令获取版本
gvm-cli tls --hostname 127.0.0.1 --port 9390 --gmp-username admin --gmp-password admin --xml "<get_version/>"
基本写法:从文件执行命令
gvm-cli tls --hostname <主机> --gmp-username <用户> --gmp-password <密码> <文件>
# 从 XML 文件批量执行命令
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin commands.xml
基本写法:使用 pyshell
gvm-pyshell --hostname <主机> --port 9390 --gmp-username <用户> --gmp-password <密码>
# 启动交互式 Python Shell
gvm-pyshell tls --hostname 127.0.0.1 --port 9390 --gmp-username admin --gmp-password admin
目标与任务管理
基本写法:创建目标
gvm-cli ... --xml "<create_target><name><名称></name><hosts><主机></hosts></create_target>"
# 创建扫描目标
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<create_target><name>Target1</name><hosts>192.168.1.10</hosts></create_target>'
基本写法:列出所有目标
gvm-cli ... --xml "<get_targets/>"
# 获取所有扫描目标
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_targets/>'
基本写法:创建扫描任务
gvm-cli ... --xml "<create_task><name>...</name><target id="..."/><config id="..."/></create_task>"
# 创建扫描任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<create_task><name>Scan1</name><target id="target-id"/><config id="config-id"/><scanner id="scanner-id"/></create_task>'
基本写法:启动扫描任务
gvm-cli ... --xml "<start_task task_id="<任务ID>"/>"
# 启动指定扫描任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<start_task task_id="task-id"/>'
基本写法:查看任务状态
gvm-cli ... --xml "<get_tasks task_id="<任务ID>"/>"
# 查看任务执行状态
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_tasks task_id="task-id"/>'
扫描配置管理
基本写法:列出扫描配置
gvm-cli ... --xml "<get_configs/>"
# 获取所有可用扫描配置
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_configs/>'
基本写法:查看配置详情
gvm-cli ... --xml "<get_configs config_id="<配置ID>"/>"
# 查看指定扫描配置详情
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_configs config_id="config-id"/>'
基本写法:导入扫描配置
gvm-cli ... --xml "<create_config><get_configs_response>...</create_config>"
# 从 XML 导入扫描配置
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml config.xml
基本写法:导出扫描配置
gvm-cli ... --xml "<get_configs config_id="<配置ID>" details="1"/>" > <文件>
# 导出扫描配置到 XML 文件
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_configs config_id="config-id" details="1"/>' > config.xml
扫描结果与报告
基本写法:获取扫描结果
gvm-cli ... --xml "<get_results task_id="<任务ID>"/>"
# 获取任务扫描结果
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_results task_id="task-id"/>'
基本写法:获取报告
gvm-cli ... --xml "<get_reports report_id="<报告ID>"/>"
# 获取指定报告详情
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id"/>'
基本写法:导出 PDF 报告
gvm-cli ... --xml '<get_reports report_id="<报告ID>" format_id="..."/>' > <文件>
# 导出 PDF 格式报告
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id" format_id="pdf-format-id"/>' > report.pdf
基本写法:导出 XML 报告
gvm-cli ... --xml '<get_reports report_id="<报告ID>"/>' > <文件>
# 导出 XML 格式报告
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id"/>' > report.xml
基本写法:获取漏洞详情
gvm-cli ... --xml '<get_results result_id="<结果ID>"/>'
# 获取单个漏洞详情
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_results result_id="result-id" details="1"/>'
NVT 更新管理
基本写法:更新 NVT 漏洞库
greenbone-nvt-sync
# 同步 NVT 漏洞检测脚本库
sudo greenbone-nvt-sync
基本写法:更新 SCAP 数据
greenbone-scapdata-sync
# 同步 SCAP 安全内容数据
sudo greenbone-scapdata-sync
基本写法:更新 CERT 数据
greenbone-certdata-sync
# 同步 CERT 通告数据
sudo greenbone-certdata-sync
基本写法:更新 GVMD 数据
greenbone-feed-sync --type <类型>
# 同步指定类型的数据源
sudo greenbone-feed-sync --type gvmd-data
基本写法:查看同步状态
gvmd --rebuild-gvmd-data=all
# 重建 gvmd 数据缓存
sudo gvmd --rebuild-gvmd-data=all
凭据与认证管理
基本写法:创建凭据
gvm-cli ... --xml '<create_credential><name>...</name><login>...</login><password>...</password></create_credential>'
# 创建扫描使用的认证凭据
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<create_credential><name>SSH-Cred</name><login>root</login><password>password</password><type>up</type></create_credential>'
基本写法:列出所有凭据
gvm-cli ... --xml '<get_credentials/>'
# 获取所有已创建凭据
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_credentials/>'
基本写法:为目标添加凭据
gvm-cli ... --xml '<modify_target target_id="..."><ssh_credential credential_id="..."/>...'
# 为扫描目标关联 SSH 凭据
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<modify_target target_id="target-id"><ssh_credential credential_id="cred-id" port="22"/></modify_target>'
基本写法:创建管理员用户
gvmd --create-user=<用户> --password=<密码> --role=Admin
# 创建 GVM 管理员账户
sudo gvmd --create-user=scanner --password=scanner123 --role=Admin
基本写法:删除用户
gvmd --delete-user=<用户>
# 删除 GVM 用户
sudo gvmd --delete-user=scanner
调度任务管理
基本写法:创建定时扫描
gvm-cli ... --xml '<create_schedule><name>...</name><first_time>...</first_time></create_schedule>'
# 创建定时扫描任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<create_schedule><name>Daily-Scan</name><first_time><minute>0</minute><hour>2</hour><day_of_month>1</day_of_month><month>1</month><year>2026</year></first_time><period><hour>24</hour></period></create_schedule>'
基本写法:列出所有调度
gvm-cli ... --xml '<get_schedules/>'
# 获取所有定时任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_schedules/>'
基本写法:为任务关联调度
gvm-cli ... --xml '<modify_task task_id="..."><schedule id="..."/></modify_task>'
# 关联调度到扫描任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<modify_task task_id="task-id"><schedule id="schedule-id"/></modify_task>'
基本写法:停止运行中任务
gvm-cli ... --xml '<stop_task task_id="<任务ID>"/>'
# 停止运行中的扫描任务
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<stop_task task_id="task-id"/>'
报告格式与导出
基本写法:列出报告格式
gvm-cli ... --xml '<get_report_formats/>'
# 获取所有可用报告格式
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_report_formats/>'
基本写法:导出 CSV 报告
gvm-cli ... --xml '<get_reports report_id="<报告ID>" format_id="..."/>' > <文件>
# 导出 CSV 格式报告
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id" format_id="csv-format-id"/>' > report.csv
基本写法:导出 HTML 报告
gvm-cli ... --xml '<get_reports report_id="<报告ID>" format_id="..."/>' > <文件>
# 导出 HTML 格式报告
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id" format_id="html-format-id"/>' > report.html
基本写法:解析 JSON 结果
python3 -c "import json; data=json.load(open('<文件>')); print(len(data['report']['results']))"
# 解析 JSON 报告统计漏洞数
python3 -c "import json; data=json.load(open('report.json')); print('漏洞数:', len(data['report']['results']))"
OpenVAS 自动化集成
基本写法:Python 脚本调用
python3 -c "from gvm.connections import TLSConnection; ..."
# Python 脚本调用 GVM API
python3 -c "
from gvm.connections import TLSConnection
from gvm.protocols.gmp import Gmp
connection = TLSConnection(hostname='127.0.0.1', port=9390)
gmp = Gmp(connection)
gmp.authenticate('admin', 'admin')
print(gmp.get_version())
"
基本写法:批量扫描脚本
for host in $(cat <文件>); do gvm-cli ... --xml "<create_target>...</create_target>"; done
# 批量创建扫描目标
for host in $(cat hosts.txt); do
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml "<create_target><name>$host</name><hosts>$host</hosts></create_target>"
done
基本写法:结合邮件通知
gvm-cli ... --xml '<get_reports/>' | mail -s "扫描报告" <邮箱>
# 扫描完成后邮件通知
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_reports report_id="report-id"/>' | mail -s "OpenVAS 扫描报告" admin@example.com
基本写法:与 SIEM 集成
gvm-cli ... --xml '<get_results/>' | python3 <解析脚本>
# 提取结果发送到 SIEM
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<get_results task_id="task-id"/>' | python3 parse_results.py | curl -X POST -d @- http://siem:9200/vulns/_bulk
OpenVAS 性能与维护
基本写法:调整扫描并发
gvm-cli ... --xml '<modify_config config_id="..."><preference><name>...</name><value>...</value></preference></modify_config>'
# 调整最大并发 NVT 数量
gvm-cli tls --hostname 127.0.0.1 --gmp-username admin --gmp-password admin --xml '<modify_config config_id="config-id"><preference><name>Max concurrently executed NVTs per host</name><value>10</value></preference></modify_config>'
基本写法:重建数据库
gvmd --rebuild
# 重建 gvmd 数据库
sudo gvmd --rebuild
基本写法:清理数据库
gvmd --optimize
# 优化数据库性能
sudo gvmd --optimize
基本写法:查看磁盘使用
du -sh /var/lib/gvm/*
# 查看 GVM 数据目录磁盘占用
du -sh /var/lib/gvm/*