当前位置: 首页 > 工具软件 > gvm > 使用案例 >

在Ubuntu 18.04上用源码安装GVM 20.08

袁鸿畴
2023-12-01

写在前面

OpenVAS是为数不多的开源漏洞扫描工具之一。如果不是最好的,那也一定是前三名。后来,改名为GVM,并且以发行的年月作为版本号。到文章发表时,最新版是GVM 20.08,发行于2020年8月。
以前,使用过OpenVAS 7。后来,升级成OpenVAS 9。不得不说的是,这个升级过程非常痛苦。最近,官方声称OpenVAS 9到2020年底也要停服了。一不做,二不休。干脆升级到最新版GVM 20.08。天不随人愿,根本找不到现成的安装包。只能自己从源码开始安装。这个安装过程更是痛苦。为了让小伙伴们少受痛苦,我就把这个安装过程记录在这里。如果顺利的话,只要一段一段地拷贝并执行,就一定能安装成功。
顺便强调一句:非必须,不要从源码开始安装。尽量使用官方的安装包。

准备活动

  1. 简单起见,如果以前安装过旧版本的OpenVAS,就先把它们全部删除,以绝后患。
  2. 需要安装的模块非常多。有些是有先后关系的,有些又没有什么先后关系。总之,安装顺序很重要。
  3. 安装过程中要频繁切换三个用户账号:登录用户、root、gvm。方便起见,可以分别打开三个终端,分别粘贴并执行。在下面的命令中,我将尽可能标识清楚执行的账号。
  4. 如果已经安装了Apache、Tomcat、Nginx等web服务,先将它们停掉或彻底删除。否则,安装过程可能会受阻。毕竟,让它们与GVM协调工作不是本教程的内容。

Ready? Go!

安装依赖包

# user/root
sudo apt-get install node-gyp
sudo apt-get install build-essential cmake gnutls-bin pkg-config glib2.0 libgnutls28-dev libssh-dev libssl-dev redis-server libhiredis-dev libxml2-dev doxygen libldap2-dev libgcrypt-dev libpcap-dev libgpgme-dev libradcli-dev graphviz bison libksba-dev libical-dev libpq-dev postgresql postgresql-contrib postgresql-server-dev-all libopenvas9-dev heimdal-dev libpopt-dev xmltoman gcc-mingw-w64 nmap libmicrohttpd-dev nodejs xsltproc python3-virtualenv python3-paramiko python3-lxml python3-defusedxml python3-pip python3-psutil virtualenv libpthread-stubs0-dev
sudo apt-get install npm
sudo npm install -g yarn --prefix /usr/
sudo apt-get install libssh-dev

给gvm用户创建编译和运行环境

# root
echo 'export PATH="$PATH:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin"' | sudo tee -a /etc/profile.d/gvm.sh &&\
sudo chmod 0755 /etc/profile.d/gvm.sh &&\
source /etc/profile.d/gvm.sh &&\
sudo bash -c 'cat << EOF > /etc/ld.so.conf.d/gvm.conf
# gmv libs location
/opt/gvm/lib
EOF'

创建gvm用户

# user/root
sudo mkdir /opt/gvm &&\
sudo adduser gvm --disabled-password --home /opt/gvm/ --no-create-home --gecos '' &&\
sudo usermod -aG redis gvm  &&\
sudo chown gvm:gvm /opt/gvm/ && \
sudo su - gvm

创建源文件目录

# gvm
mkdir src &&\
cd src &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH

下载源文件

# gvm
git clone -b gvm-libs-20.08 --single-branch  https://github.com/greenbone/gvm-libs.git &&\
git clone -b openvas-20.08 --single-branch https://github.com/greenbone/openvas.git &&\
git clone -b gvmd-20.08 --single-branch https://github.com/greenbone/gvmd.git &&\
git clone -b master --single-branch https://github.com/greenbone/openvas-smb.git &&\
git clone -b gsa-20.08 --single-branch https://github.com/greenbone/gsa.git &&\
git clone -b ospd-openvas-20.08 --single-branch  https://github.com/greenbone/ospd-openvas.git &&\
git clone -b ospd-20.08 --single-branch https://github.com/greenbone/ospd.git

编译并安装GVM基础库

# gvm
cd gvm-libs &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH &&\
mkdir build &&\
cd build ;\
cmake -DCMAKE_INSTALL_PREFIX=/opt/gvm .. &&\
make &&\
make doc &&\
make install &&\
cd /opt/gvm/src

编译并安装OpenVAS-SMB

# gvm
cd openvas-smb &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH &&\
mkdir build &&\
cd build/ ;\
cmake -DCMAKE_INSTALL_PREFIX=/opt/gvm .. &&\
make &&\
make install &&\
cd /opt/gvm/src

编译并安装OpenVAS扫描器

编译前,先安装一些基础模块。

# user/root
sudo apt-get install nettle-bin
sudo apt-get install libunistring2 libunistring

wget https://ftp.gnu.org/gnu/nettle/nettle-3.6.tar.gz
tar xzvf nettle-3.6.tar.gz
cd nettle-3.6
./configure
make
sudo make install

wget https://www.gnupg.org/ftp/gcrypt/gnutls/v3.6/gnutls-3.6.15.tar.xz
sudo apt install xz-utils
tar -xf gnutls-3.6.15.tar.xz
cd gnutls-3.6.15
./configure
make
sudo make install

编译并安装OpenVAS

# gvm
cd openvas &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH &&\
mkdir build &&\
cd build/ ;\
cmake -DCMAKE_INSTALL_PREFIX=/opt/gvm .. &&\
make &&\
make doc &&\
make install &&\
cd /opt/gvm/src

安装并设置Redis服务

# root
export LC_ALL="C" &&\
ldconfig &&\
cp /etc/redis/redis.conf /etc/redis/redis.orig &&\
cp /opt/gvm/src/openvas/config/redis-openvas.conf /etc/redis/ &&\
chown redis:redis /etc/redis/redis-openvas.conf &&\
echo "db_address = /run/redis-openvas/redis.sock" > /opt/gvm/etc/openvas/openvas.conf &&\
systemctl enable redis-server@openvas.service &&\
systemctl start redis-server@openvas.service

系统微调。

# root
sysctl -w net.core.somaxconn=1024 &&\
sysctl vm.overcommit_memory=1 &&\

echo "net.core.somaxconn=1024"  >> /etc/sysctl.conf &&\
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf

系统微调。禁用THP。

# root
cat << EOF > /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target
EOF

微调后,重启服务。

# root
systemctl daemon-reload &&\
systemctl start disable-thp &&\
systemctl enable disable-thp &&\
systemctl restart redis-server

配置sudoer

使用下面的命令打开sudoer的编辑器。

# root
visudo

把下面的内容编辑或添加进去。保存并退出。

### Add secure path
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/gvm/sbin"

### Allow the user running ospd-openvas, to launch openvas with root permissions
gvm ALL = NOPASSWD: /opt/gvm/sbin/openvas
gvm ALL = NOPASSWD: /opt/gvm/sbin/gsad

编译并安装GVM

先安装依赖模块。

# user/root
sudo apt-get install libssh-gcrypt-4 libssh-gcrypt-dev

编译并安装GVM

# gvm
cd /opt/gvm/src &&\
cd gvmd &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH &&\
mkdir build &&\
cd build/ &&\
cmake -DCMAKE_INSTALL_PREFIX=/opt/gvm .. &&\
make &&\
make doc &&\
make install &&\
cd /opt/gvm/src

下载NVT

这个下载过程比较漫长,取决于网络状态。至少也需要以小时计算。为了节约时间,我的做法是把旧的文件直接拷贝过来。

# gvm
greenbone-nvt-sync
openvas -u

配置数据库

# user/root
sudo -u postgres bash
export LC_ALL="C"
createuser -DRS gvm
createdb -O gvm gvmd

psql gvmd
create role dba with superuser noinherit;
grant dba to gvm;
create extension "uuid-ossp";
create extension "pgcrypto";
exit
exit

安装证书

# gvm
gvm-manage-certs -a

创建管理员并设置密码

# gvm
gvmd --create-user=admin --password=admin

获取上面创建的管理员的详细信息。

# gvm
gvmd --get-users --verbose
# admin dffd45de-be63-45b4-87b3-68b1bea07b1a

将上面获取的信息粘贴到下面的命令中并执行。这一步非常重要。很多人在运行时出问题,跟这一步有很大关系。

# gvm
gvmd --modify-setting 78eceaec-3385-11ea-b237-28d24461215b --value dffd45de-be63-45b4-87b3-68b1bea07b1a

同步数据

这一步运行时间会比较长。与网络状态有关,要以小时计算。

# gvm
greenbone-feed-sync --type GVMD_DATA 
greenbone-feed-sync --type SCAP 
greenbone-feed-sync --type CERT

编译并安装GSA

首先,安装Python。

# user/root
sudo apt-get install python3.8 python3.8-dev

再安装nodejs。

# user/root
sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install nodejs

编译并安装GSA。

# gvm
cd /opt/gvm/src/gsa &&\
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH &&\
mkdir build &&\
cd build/ &&\
cmake -DCMAKE_INSTALL_PREFIX=/opt/gvm .. &&\
make &&\
make doc &&\
make install &&\
touch /opt/gvm/var/log/gvm/gsad.log &&\
cd /opt/gvm/src

安装并设置OSPD

创建虚拟环境。

# gvm
cd /opt/gvm/src 
export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH 
virtualenv --python python3.8  /opt/gvm/bin/ospd-scanner/ 
source /opt/gvm/bin/ospd-scanner/bin/activate

安装OSPD。

# gvm
mkdir /opt/gvm/var/run/ospd/ &&\
cd ospd &&\
pip3 install . &&\
cd /opt/gvm/src

安装OSPD-OpenVAS。

# gvm
cd ospd-openvas &&\
pip3 install . &&\
cd /opt/gvm/src

创建启动脚本

创建gvmd启动脚本。

# root
cat << EOF > /etc/systemd/system/gvmd.service
[Unit]
Description=Open Vulnerability Assessment System Manager Daemon
Documentation=man:gvmd(8) https://www.greenbone.net
Wants=postgresql.service ospd-openvas.service
After=postgresql.service ospd-openvas.service

[Service]
Type=forking
User=gvm
Group=gvm
PIDFile=/opt/gvm/var/run/gvmd.pid
WorkingDirectory=/opt/gvm
ExecStart=/opt/gvm/sbin/gvmd --osp-vt-update=/opt/gvm/var/run/ospd.sock
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=on-failure
RestartSec=2min
KillMode=process
KillSignal=SIGINT
GuessMainPID=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

创建gsad启动脚本。

# root
cat << EOF > /etc/systemd/system/gsad.service
[Unit]
Description=Greenbone Security Assistant (gsad)
Documentation=man:gsad(8) https://www.greenbone.net
After=network.target
Wants=gvmd.service


[Service]
Type=forking
PIDFile=/opt/gvm/var/run/gsad.pid
WorkingDirectory=/opt/gvm
ExecStart=/opt/gvm/sbin/gsad --drop-privileges=gvm
Restart=on-failure
RestartSec=2min
KillMode=process
KillSignal=SIGINT
GuessMainPID=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

创建ospd-openvas启动脚本。

# root
cat << EOF > /etc/systemd/system/ospd-openvas.service 
[Unit]
Description=Job that runs the ospd-openvas daemon
Documentation=man:gvm
After=network.target redis-server@openvas.service
Wants=redis-server@openvas.service

[Service]
Environment=PATH=/opt/gvm/bin/ospd-scanner/bin:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Type=forking
User=gvm
Group=gvm
WorkingDirectory=/opt/gvm
PIDFile=/opt/gvm/var/run/ospd-openvas.pid
ExecStart=/opt/gvm/bin/ospd-scanner/bin/python /opt/gvm/bin/ospd-scanner/bin/ospd-openvas --pid-file /opt/gvm/var/run/ospd-openvas.pid --unix-socket=/opt/gvm/var/run/ospd.sock --log-file /opt/gvm/var/log/gvm/ospd-scanner.log --lock-file-dir /opt/gvm/var/run/ospd/
Restart=on-failure
RestartSec=2min
KillMode=process
KillSignal=SIGINT
GuessMainPID=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

重新启动前面创建的服务。

# root
systemctl daemon-reload &&\
systemctl enable gvmd &&\
systemctl enable gsad &&\
systemctl enable ospd-openvas &&\
systemctl start gvmd &&\
systemctl start gsad &&\
systemctl start ospd-openvas

查看服务的状态,看看是否工作正常。

# root
systemctl status gvmd
systemctl status gsad
systemctl status ospd-openvas

设置默认扫描器

# gvm
gvmd --get-scanners --verbose
# 08b69003-5fc2-4037-a479-93b440211c74  OpenVAS  /var/run/ospd/ospd.sock  0  OpenVAS Default
# 6acd0832-df90-11e4-b9d5-28d24461215b  CVE    0  CVE

修改默认扫描器的参数。

# gvm
gvmd --modify-scanner=08b69003-5fc2-4037-a479-93b440211c74 --scanner-host=/opt/gvm/var/run/ospd.sock

测试

在本机上启动浏览器,在地址栏内输入:http://localhost,或在别的机器上启动浏览器,在地址栏内输入:http://192.168.xx.xx,你应该能看到绿色的登录界面。
恭喜你!成功了!!
使用和微调就看你自己的了。

后记

  1. 现在的GVM越来越难用了。开发者怎么想的?真想放弃这些老用户吗?(这句等于白说,我打赌,开发者看不懂中文。)
  2. 编译过程中可能会遇到很多失败信息。最多的可能是依赖包的缺失。安装依赖包时,注意版本号,最好是安装与所需相同的版本号。并不是越新越好。如果所需依赖包版本号已经找不到了,就安装一个比所需依赖包版本高一点的版本,然后尝试再次编译。再次编译之前记得删除已经存在的build目录。
    rm -rf build
  3. 有时编译需要的依赖库与已经安装的依赖库版本不一致,为了让编译能顺利通过,需要手动做些工作。比如:编译需要xx.so.3,可是机器上安装的却是xx.so.4。你需要做的工作就是创建一个软连接。
    ln -s xx.so.4 xx.so.3
  4. 同步数据的过程很容易多次失败。不过没有关系,只需要重复执行就可以了。已经下载的部分不会重复下载。这样就失败一次,重复一次,直至最后全部同步成功。
  5. 重建数据的过程是自动进行的。如果你愿意,也可以用下面的命令手动重建。
    gvmd --rebuild
    gvmd --rebuild-scap
 类似资料: