KOS系统下OpenVAS从源码编译到实战扫描的全流程指南

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脚本,让它换一种方式查找这个库。

  1. 找到并编辑有问题的CMakeLists.txt文件:
    # 在gvm-libs源码目录下
    vim ../util/CMakeLists.txt
    
  2. 定位到大概第43行,你会看到类似这样的一行:
    pkg_check_modules (GCRYPT REQUIRED libgcrypt)
    
  3. 我们将这行注释掉(在行首加#),并在其下方添加一行新的查找命令:
    # 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应该能顺利通过,makemake 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)。首次运行前必须同步这个规则库。

  1. 创建必要的目录并设置权限: 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命令。

  2. 同步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实例。

  1. 复制配置文件: 编译安装后,通常会在/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
    
  2. 启动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扫描器并启动

  1. 生成默认配置(可选但推荐):

    sudo openvas -s > /etc/openvas/openvas.conf
    

    这会导出当前的默认配置。你可以编辑/etc/openvas/openvas.conf文件来调整扫描并发数、日志级别、插件路径等高级参数。对于初次使用,默认配置通常足够。

  2. 以服务方式运行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显示在其他路径,请修改此处。

  3. 启动并验证服务

    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界面,还需要安装gsagvmd组件,那会复杂很多。

6.1 使用omp命令行工具进行扫描

首先,我们需要知道扫描器正在监听的Unix socket路径,通常就是我们在服务文件中指定的/run/gvm/ospd.sock

  1. 创建一个简单的扫描目标: 假设我们要扫描内网中IP为192.168.1.100的一台测试服务器。

    # 使用omp命令连接扫描器,需要指定socket路径和用户名密码(首次使用需要设置,这里假设用默认admin/admin)
    # 注意:编译安装的openvas-scanner默认可能没有配置用户,omp管理功能依赖于gvmd。这里演示一个更直接的方法。
    # 实际上,对于仅安装了扫描器的情况,更常用的测试方法是使用`openvas`命令本身。
    

    更直接的方法是使用openvas命令行工具自带的扫描功能,但这通常需要更复杂的参数。一个更实用的、用于验证扫描器是否工作的快速测试是:

  2. 通过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-libsopenvas-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上搭建起属于自己的安全扫描堡垒。如果在实践中遇到新的问题,多查看日志,善用社区资源,安全运维的道路就是这样一步步踩出来的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值