1. 为什么要在KOS上折腾OpenVAS?从源码编译开始
如果你是一位在浪潮信息KOS系统上工作的安全工程师或运维人员,想找一个靠谱的开源漏洞扫描工具,OpenVAS(Open Vulnerability Assessment System)绝对是个绕不开的名字。它功能强大,社区活跃,检测规则每日更新,能帮你发现服务器、网络设备乃至Web应用里潜藏的各种安全问题。但问题来了,KOS作为一款企业级的国产服务器操作系统,它的官方软件源里并没有直接提供OpenVAS的安装包。这就意味着,如果你想用上它,就得走一条“硬核”但充满成就感的路——从源代码开始手动编译安装。
别被“源码编译”吓到,这其实就像自己动手组装一台高性能电脑。直接买整机(用包管理器安装)固然方便,但遇到特殊需求(比如KOS特有的环境)或者想获得最新特性时,自己动手往往是最佳选择。这个过程能让你对OpenVAS的组件依赖、运行机制有更深刻的理解,以后排查问题心里更有底。我当初在KOS上部署时,也踩过不少坑,尤其是那个经典的libgcrypt库适配问题,差点让我放弃。但解决之后,你会发现整个系统的掌控感是完全不同的。
这篇文章,我就把自己在KOS 5.8系统上,从零开始编译、配置到最终运行OpenVAS进行实战扫描的完整流程和经验分享给你。我会重点讲解KOS环境下特有的编译“坑点”及其解决方案,并提供详细的命令和配置,确保你能够复现。我们最终的目标不仅仅是让OpenVAS跑起来,更是要让它稳定、高效地为我们工作。好了,废话不多说,我们开始准备“组装”环境。
2. 战前准备:理清依赖与环境搭建
动手编译之前,充分的准备工作能避免后续很多莫名其妙的错误。这一步的核心是搞清楚我们需要什么,以及KOS系统能提供什么。
2.1 明确操作环境与软件版本
首先,确认你的战场。我使用的环境是:
- 操作系统:浪潮信息KOS 5.8,具体内核版本是
4.18.0-372.41.1.kos5.x86_64。这个版本基于稳定的Linux内核,兼容性很好。 - 测试机:一台x86_64架构的虚拟机,配置为4核CPU、8GB内存。对于编译OpenVAS来说,这个配置是足够的,更大的内存和更快的CPU能显著缩短编译时间。
- 目标软件:
- OpenVAS Scanner: 22.7.3版本。这是扫描器的核心组件。
- gvm-libs: 22.7.0版本。这是Greenbone漏洞管理套件的基础库,OpenVAS严重依赖它。
为什么强调版本?因为开源项目的依赖关系有时很微妙,特定版本的组件搭配才能确保编译顺利。我们选择22.7.x这个相对较新且稳定的系列。
2.2 安装基础编译工具与依赖库
KOS使用dnf作为包管理器,和CentOS/RHEL系列操作相似。首先,我们需要把“工具箱”准备好。
# 1. 安装Git,用于拉取源代码
sudo dnf install git -y
# 2. 启用EPEL(Extra Packages for Enterprise Linux)源。
# KOS的部分依赖包在官方源里没有,EPEL源是个重要的补充。
sudo dnf install -y epel-release
sudo dnf makecache
接下来,安装编译OpenVAS及其依赖所需的一大堆开发库。别怕命令长,我们一次性搞定。这些库涵盖了从加密解密(gnutls, libgcrypt)、网络通信(libpcap, libnet)、数据解析(json-glib, libxml2)到进程通信(redis)等各个方面。
sudo dnf install -y cmake gcc-c++ make \
json-glib-devel gnutls-devel \
libpcap-devel libnet-devel libssh-devel \
libxml2-devel libuuid-devel \
gpgme-devel libassuan-devel libksba-devel \
bison-devel libbsd-devel tcl-devel \
redis
这里有个关键点:libgcrypt-devel。我们安装了它,但在后续编译gvm-libs时,CMake脚本可能会找不到它。这是因为KOS中的这个库可能没有提供pkg-config所需的.pc文件。别担心,这个问题我们留到后面专门解决,现在先把能装的都装上。
2.3 配置持久化的环境变量
编译过程中,我们会把一些库安装到/usr/local目录下,这是源码安装的惯例。为了让系统在编译和运行时都能找到这些库,需要设置两个重要的环境变量。
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/local/lib64/:$LD_LIBRARY_PATH
PKG_CONFIG_PATH:告诉pkg-config工具去哪里查找我们手动安装的库的信息文件(.pc文件)。CMake在检查依赖时会用到它。LD_LIBRARY_PATH:告诉系统动态链接器,在运行时除了默认路径,还要去/usr/local/lib64里找共享库(.so文件)。
重要提示:上面这个export命令只在当前终端会话有效。为了避免每次打开新终端或重启后都要重新设置,我强烈建议你把它们写入用户的shell配置文件中。
echo 'export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/lib64/:$LD_LIBRARY_PATH' >> ~/.bashrc
# 使配置立即生效
source ~/.bashrc
完成这步,我们的基础战场就布置好了。接下来,进入真正的编译环节,从最底层的依赖库开始。
3. 攻克核心依赖:解决KOS特有的libgcrypt难题
OpenVAS不是孤立的程序,它站在一堆“巨人”(库)的肩膀上。我们需要按顺序把这些“巨人”搭建好。顺序是:hiredis & paho.mqtt.c -> gvm-libs -> openvas-scanner。
3.1 获取所有必要的源代码
在一个合适的目录(比如~/src)下,我们用Git把需要的源码仓库都克隆下来。
git clone https://github.com/greenbone/openvas-scanner.git
git clone https://github.com/greenbone/gvm-libs.git
git clone https://github.com/redis/hiredis.git
git clone https://github.com/eclipse/paho.mqtt.c.git
克隆完成后,你会得到四个目录。它们的关系是:openvas-scanner(扫描器主程序)依赖gvm-libs(基础库),而gvm-libs又依赖hiredis(Redis客户端库)和paho.mqtt.c(MQTT通信库)。
3.2 编译安装hiredis和paho.mqtt.c
这两个库的编译比较标准,一般不会遇到问题。
编译hiredis:
cd hiredis
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install
cd ../..
使用mkdir build && cd build是一种常见的“out-of-source build”方式,它把编译产生的文件都放在build目录里,保持源码目录的整洁,非常推荐。
编译paho.mqtt.c:
cd paho.mqtt.c
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install
cd ../..
如果一切顺利,这两个库的头文件和共享库就会被安装到/usr/local目录下。你可以用ls /usr/local/lib64/libhiredis*和ls /usr/local/lib64/libpaho*来确认。
3.3 编译安装gvm-libs:直面libgcrypt挑战
这是整个编译过程中最容易卡壳的地方,也是KOS环境下最需要特别注意的一步。
cd gvm-libs
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
执行cmake命令后,你很可能会看到类似下面的错误:
-- Checking for module 'libgcrypt'
-- Package 'libgcrypt', required by 'virtual:world', not found
CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:556 (message):
A required package was not found
问题根源:gvm-libs的CMake脚本使用pkg_check_modules来查找libgcrypt库。这个命令依赖于pkg-config工具和对应的libgcrypt.pc文件。虽然我们通过dnf安装了libgcrypt-devel,但KOS提供的这个包可能没有生成或安装这个.pc文件,导致pkg-config找不到它。
解决方案:我们不需要重新编译libgcrypt,而是修改gvm-libs的CMake脚本,让它换一种方式查找这个库。
- 找到并编辑有问题的CMakeLists.txt文件:
# 在gvm-libs源码目录下 vim ../util/CMakeLists.txt - 定位到大概第43行,你会看到类似这样的一行:
pkg_check_modules (GCRYPT REQUIRED libgcrypt) - 我们将这行注释掉(在行首加
#),并在其下方添加一行新的查找命令:# pkg_check_modules (GCRYPT REQUIRED libgcrypt) # 注释掉原来的pkg-config查找 find_library(GCRYPT libgcrypt) # 使用find_library直接查找库文件find_library是CMake自带的命令,它直接在系统的库路径(如/usr/lib64,/usr/local/lib64)中搜索名为libgcrypt.so的文件,不依赖pkg-config。
保存退出后,清理一下build目录,然后重新运行CMake和编译安装:
# 回到build目录,删除旧的CMake缓存
cd build
rm -rf *
# 重新配置和编译
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install
这次,CMake应该能顺利通过,make和make install也会成功。至此,最关键的依赖库gvm-libs就安装完成了。这个问题的解决是KOS上成功编译OpenVAS的关键,我当初在这里折腾了好几个小时。
4. 编译与安装OpenVAS扫描器主程序
闯过了gvm-libs的关卡,编译OpenVAS扫描器本身就相对轻松了。
# 回到上级目录,进入openvas-scanner
cd ../../openvas-scanner
mkdir build && cd build
# 配置编译
cmake .. -DCMAKE_BUILD_TYPE=Release
# 开始编译(这个过程可能需要一些时间,取决于机器性能)
make
# 安装到系统
sudo make install
编译过程如果没有报错,就大功告成了。为了验证安装是否成功,可以运行:
openvas --version
如果终端打印出了OpenVAS的版本信息(例如OpenVAS 22.7.3),那么恭喜你,扫描器核心程序已经正确安装在你的KOS系统上了。
但是,安装成功只是第一步。要让OpenVAS作为一个完整的漏洞扫描服务运行起来,我们还需要进行一系列的配置,包括初始化数据库、下载漏洞检测规则(NVT)、配置Redis服务以及设置系统服务。这些步骤决定了OpenVAS是“能跑”还是“好用”。
5. 让OpenVAS真正跑起来:服务配置与初始化
编译安装的OpenVAS默认不会像软件包安装那样自动配置好一切。我们需要手动完成服务化部署。
5.1 初始化数据库与同步漏洞规则(NVT)
OpenVAS的强大之处在于它庞大的漏洞检测规则库(Network Vulnerability Tests, NVT)。首次运行前必须同步这个规则库。
-
创建必要的目录并设置权限: OpenVAS运行需要一些特定目录来存放数据、日志和临时文件。
sudo mkdir -p /var/lib/openvas /var/log/gvm /run/gvm sudo chown -R gvm:gvm /var/lib/openvas /var/log/gvm /run/gvm注意:编译安装可能不会自动创建
gvm用户和组。如果chown命令报错说用户不存在,你需要先创建它:sudo groupadd -r gvm sudo useradd -r -s /bin/false -g gvm gvm然后再执行上面的
chown命令。 -
同步NVT规则库: 这是最关键的一步,也是耗时最长的一步(可能需要下载数GB数据)。使用Greenbone社区提供的同步脚本。
sudo greenbone-feed-sync --type nvt这个命令会连接Greenbone的服务器,下载最新的漏洞检测规则。请确保你的网络能够访问相关服务。如果速度慢,可以尝试多运行几次。
提示:除了NVT,完整的Greenbone社区版还包括SCAP(安全配置检查)和CERT(安全公告)数据源。你可以后续用
--type scap和--type cert来同步它们,但NVT是启动扫描所必需的。
5.2 配置与启动Redis服务
OpenVAS使用Redis作为任务队列和缓存后端。我们需要一个专为OpenVAS配置的Redis实例。
-
复制配置文件: 编译安装后,通常会在
/usr/local/etc/openvas或源码的config目录下找到Redis的配置文件模板。假设我们在源码目录下:sudo cp /path/to/openvas-scanner/config/redis-openvas.conf /etc/redis/ sudo chown redis:redis /etc/redis/redis-openvas.conf -
启动Redis服务: KOS通常使用systemd管理服务。我们需要为OpenVAS专用的Redis创建一个服务单元。 首先,创建一个服务文件:
sudo vim /etc/systemd/system/redis-server@openvas.service内容如下:
[Unit] Description=Redis data structure server for OpenVAS (%i) After=network.target [Service] Type=notify User=redis Group=redis ExecStart=/usr/bin/redis-server /etc/redis/redis-%i.conf Restart=always RestartSec=3 [Install] WantedBy=multi-user.target然后启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start redis-server@openvas.service sudo systemctl enable redis-server@openvas.service使用
sudo systemctl status redis-server@openvas.service检查服务是否正常运行。
5.3 配置OpenVAS扫描器并启动
-
生成默认配置(可选但推荐):
sudo openvas -s > /etc/openvas/openvas.conf这会导出当前的默认配置。你可以编辑
/etc/openvas/openvas.conf文件来调整扫描并发数、日志级别、插件路径等高级参数。对于初次使用,默认配置通常足够。 -
以服务方式运行OpenVAS: 同样,我们创建一个systemd服务文件。
sudo vim /etc/systemd/system/openvas-scanner.service内容示例:
[Unit] Description=OpenVAS Scanner Daemon After=network.target redis-server@openvas.service Wants=redis-server@openvas.service [Service] Type=exec User=gvm Group=gvm RuntimeDirectory=gvm RuntimeDirectoryMode=2775 PIDFile=/run/gvm/ospd-openvas.pid ExecStart=/usr/local/sbin/openvas --foreground --unix-socket=/run/gvm/ospd.sock KillMode=process Restart=on-failure RestartSec=3 [Install] WantedBy=multi-user.target注意:
ExecStart中的路径/usr/local/sbin/openvas需要根据你的实际安装位置调整。如果which openvas显示在其他路径,请修改此处。 -
启动并验证服务:
sudo systemctl daemon-reload sudo systemctl start openvas-scanner.service sudo systemctl enable openvas-scanner.service sudo systemctl status openvas-scanner.service查看服务状态,确认是
active (running)。你还可以通过检查日志来确认:sudo tail -f /var/log/gvm/openvas.log如果看到日志中显示NVT加载完成、Redis连接成功等信息,说明OpenVAS扫描器服务已经成功启动并准备就绪了。
6. 实战演练:发起你的第一次漏洞扫描
服务跑起来了,不试试怎么行?OpenVAS提供了多种使用方式,包括命令行工具和Web接口(Greenbone Security Assistant, GSA)。由于我们只编译了扫描器(openvas-scanner),这里主要介绍通过命令行工具omp(OpenVAS Management Protocol)进行快速扫描。要使用完整的Web界面,还需要安装gsa和gvmd组件,那会复杂很多。
6.1 使用omp命令行工具进行扫描
首先,我们需要知道扫描器正在监听的Unix socket路径,通常就是我们在服务文件中指定的/run/gvm/ospd.sock。
-
创建一个简单的扫描目标: 假设我们要扫描内网中IP为
192.168.1.100的一台测试服务器。# 使用omp命令连接扫描器,需要指定socket路径和用户名密码(首次使用需要设置,这里假设用默认admin/admin) # 注意:编译安装的openvas-scanner默认可能没有配置用户,omp管理功能依赖于gvmd。这里演示一个更直接的方法。 # 实际上,对于仅安装了扫描器的情况,更常用的测试方法是使用`openvas`命令本身。更直接的方法是使用
openvas命令行工具自带的扫描功能,但这通常需要更复杂的参数。一个更实用的、用于验证扫描器是否工作的快速测试是: -
通过openvas命令行测试扫描: OpenVAS扫描器可以通过
ospd-openvas工具接收XML格式的扫描任务。但配置起来比较复杂。对于刚部署好的环境,我建议先进行一个简单的本地扫描测试,确保核心功能正常。# 首先,检查扫描器是否在监听 sudo netstat -lnp | grep ospd # 或者查看socket文件是否存在 ls -la /run/gvm/ospd.sock如果一切正常,你可以尝试使用Greenbone社区提供的
gvm-tools(Python库)来与扫描器交互,但这超出了本文快速验证的范围。
6.2 验证安装效果的“笨”办法
对于刚刚从源码编译安装好的环境,一个最直接的验证方法是:检查进程、日志和规则库。
- 检查进程:
sudo systemctl status openvas-scanner.service状态应为active。 - 检查日志:
sudo tail -n 50 /var/log/gvm/openvas.log,查看是否有严重的ERROR报错。正常启动后,日志里会有大量加载NVT规则的信息。 - 检查规则库:
sudo ls -lh /var/lib/openvas/plugins/,这个目录下应该有大量.nasl文件(NVT脚本),数量成千上万,并且日期是最新的。这证明greenbone-feed-sync同步成功了。
如果以上三点都符合,那么你的OpenVAS扫描器就已经在KOS系统上成功部署,并具备了漏洞扫描的基本能力。你可以把它集成到你的自动化安全运维平台中,或者继续部署GSA和GVMd来获得完整的Web管理界面。
7. 避坑指南与性能调优建议
一路走下来,你可能已经遇到了或未来可能会遇到一些问题。这里我总结几个常见的坑和优化点。
编译相关:
- 内存不足:编译
gvm-libs和openvas-scanner,尤其是并行编译(make -j4)时,对内存消耗较大。如果虚拟机内存小于4GB,可能会在编译过程中卡死或报错。建议确保内存充足,或者不使用-j参数进行单线程编译(速度慢但稳)。 - 依赖库版本冲突:如果你系统里之前通过其他方式安装过旧版本的某些库(比如自己编译过
libssh),可能会引发冲突。确保使用KOS官方源或EPEL源中的开发包版本。在编译前,可以用pkg-config --modversion libssh等命令检查关键库的版本。
运行与配置相关:
- Redis连接失败:检查
redis-server@openvas.service是否运行,以及/run/gvm/ospd.sock的权限。确保gvm用户有权限读写该socket文件。 - NVT规则同步失败:通常是网络问题。可以尝试更换网络环境,或者查阅Greenbone社区文档,看看是否有可用的镜像源。同步过程可以中断后继续。
- 扫描速度慢:默认配置可能比较保守。你可以编辑
/etc/openvas/openvas.conf,调整max_hosts(同时扫描的主机数)和max_checks(对每个主机同时进行的插件检查数)参数来提升并发度。注意,增加这些值会提高资源(CPU、内存、网络)消耗。 - 日志文件过大:默认日志级别可能比较详细。在生产环境中,可以调整
/etc/openvas/openvas_log.conf,降低日志级别(如将level从128改为32或16),并配置日志轮转(logrotate)。
最后,安全工具的维护至关重要。定期更新NVT规则库是保持OpenVAS检测有效性的生命线。你可以设置一个cron定时任务,例如每周自动同步一次:
# 编辑root用户的crontab:sudo crontab -e
# 添加一行,例如每周日凌晨3点同步
0 3 * * 0 /usr/local/bin/greenbone-feed-sync --type nvt
从源码在KOS上编译OpenVAS,就像完成了一次精细的手工定制。虽然过程比直接安装二进制包曲折,但你对整个系统的理解会深入得多。当看到自己亲手构建的扫描器稳定运行,并开始为你发现潜在的安全风险时,那种成就感是非常实在的。希望这份详细的指南能帮你少走弯路,顺利在KOS上搭建起属于自己的安全扫描堡垒。如果在实践中遇到新的问题,多查看日志,善用社区资源,安全运维的道路就是这样一步步踩出来的。

228

被折叠的 条评论
为什么被折叠?



