基于Docker集群的分布式OpenVAS(GVM)

 

作者:jweny@360 云安全

0x01 写在前面

OpenVAS(Open Vulnerability Assessment System,开放式漏洞评估系统) 是一套优秀的、开源的漏洞检测工具。Openvas可以不断从NVT、SCAP、CERT更新漏洞库,针对已知的漏洞,远程检测资产中存在的安全问题。OpenVAS从版本10开始,OpenVAS被改名为GVM(Greenbone Vulnerability Management),本文使用的是最新版的GVM v20.8.0,因此不再出现“OpenVAS”字样,统一叫GVM。

GVM是专业扫描操作系统漏洞的利器,当然,被扫描的操作系统安装了Web服务,OpenVAS也会去扫描Web漏洞。其优点突出:性能良好、扩展性强、规则库完备、接入点灵活,以及最重要的——免费。但是我在搭建OpenVAS的过程中,发现OpenVAS(GVM)有几个明显短板:

  1. 单例部署(单个扫描器)时的扫描效率十分低下。为当面对海量资产时,单例部署往往力不从心。
  2. 安装极为复杂,可能是史上安装起来最麻烦的扫描器。
  3. 规则数量庞大,更新速度慢。
  4. 中文资料少。
  5. 使用docker镜像会避免安装过程,但是目前看到的gvm docker镜像版本过低,扫描性能与最新版天差地别。
  6. 与其他设备集成时,需通过GMP协议远程调度下发扫描任务并拉取结果。然而最新GMP调度的实现几乎没有。

GVM-Docker项目是个非常优秀的项目,给我提供了很多指导性的思路,但是该项目更新规则耗时过长,且多节点部署时有严重bug。因此,这段时间在该项目基础上,研究了一套基于Docker集群和最新版GVM的分布式系统漏扫。

主要实现:

  1. NVT、SCAP、CERT规则库打包(20201126)
  2. 最新版 GVM Docker镜像(v20.8.0)
  3. 最新版 GVM Scanner Docker镜像(v20.8.0)
  4. 单GVM – 多Scanner 分布式部署
  5. 与其他工具集成,远程调度。

项目地址:

https://github.com/jweny/Distributed_Docker_Openvas

 

0x02 架构

从GOS 4开始,GVM开始支持ssh。在集群中部署单个GVM节点,以及众多Scanner节点,并将所有Scanner的ssh公钥添加到GVM中,即可通过ssh socket建立GVM与远程Scanner OSPd之间的连接。

  1. GVM节点:负责资产配置、扫描配置、任务创建与下发(任务可以使用轮询等调度方式下发到每个Scanner节点);
  2. Scanner节点:负责接收并解析GVM分配的任务、漏扫、结果回传;
  3. 配置与调度:GVM的web端(9392端口)手动配置;GMP协议调度(服务端在9390端口)

 

0x03 GVM部署

测试环境:192.168.102.137 CentOS7

3.1 准备工作

  1. docker禁用ipv6
  2. 先下载项目中规则库。plugins为NVT规则,cert-data为CERT规则,scap-data为SCAP规则。将三个文件夹copy至宿主机的 /var/lib/docker/volumu/gvm-data/_data/ 下。

3.2 构建镜像

# 自建镜像
git clone https://github.com/jweny/Distributed_Docker_Openvas.git
cd gvm-docker-20.08
docker build -t jweny/gvm-docker-20.08 .

# 也可以直接使用打包好的镜像
docker pull jweny/gvm-docker-20.08

3.2 启动镜像

参数 含义 默认值
-e USERNAME 用户名 admin
-e PASSWORD 密码 admin
-e DB_PASSWORD PostgreSql 密码 随机生成,用户名gvm
-e HTTPS 是否启用https true
-e SSHD 是否启用ssh 如果启用远程扫描器必须将其置为true 默认值:false
-e TZ 时区 UTC
# 后面要部署多个scanner 这里SSHD必须设置为true
docker run -d -p 2222:22 -p 5432:5432 -p 9392:9392 -p 6379:6379 -p 9390:9390 -e TZ="Asia/Shanghai" -e SSHD="true" -e DB_PASSWORD="dbpassword" -e PASSWORD="strongpassword" --volume gvm-data:/data --name gvm jweny/gvm-docker-20.08

docker start gvm

检查是否启动成功:

docker logs -f gvm

如果看到下图则启动成功:

这个报错忽略。产生原因是没有启动gvm服务前创建scap。

gvm启动后会自动从scap文件中加载。

启动后,容器端口使用情况如下。GVM宿主机防火墙请允许

远程Scanner访问映射后的端口(9392、9390、2222)。此时即可访问web界面https://192.168.102.137:9392/,当查看web端的规则库时提示没有SCAP数据库的错误时不用担心,因为初次启动时GVM服务端将解析规则库文件并创建数据库,该过程需要几分钟时间。

服务名称 端口
web 9392
ssh 22
postgresql 5432
redis 6379
gmp server 9390

 

0x04 Scanner部署

测试环境:192.168.102.138 CentOS7

4.1 准备工作

将下载好的plugins文件夹copy至宿主机/var/lib/docker/volumu/scanner/_data/

4.2 构建镜像

# 自建镜像
git clone https://github.com/jweny/Distributed_Docker_Openvas.git
cd scanner-docker-20.08
docker build -t jweny/gvm-scanner-docker-20.08 .

# 使用打包好的镜像
docker pull jweny/gvm-scanner-docker-20.08

4.3 启动镜像

参数 含义
-e MASTER_ADDRESS GVM IP/域名
-e MASTER_PORT GVM ssh 端口
docker run -d --volume scanner:/data -e MASTER_ADDRESS=192.168.102.137 -e MASTER_PORT=2222 --name scanner jweny/gvm-scanner-docker-20.08
docker start scanner

检查是否启动成功:

docker logs -f scanner

如果看到下图则启动成功:

4.4 GVM中注册Scanner

记录上一步中的 Scanner idPublic key,然后GVM中注册Scanner(添加Scanner公钥)。

docker exec -it gvm /add-scanner.sh
// 输入
// scanner Name:Scanner名称,任意命名
// scanner id
// scanner 公钥

4.5 检测Scanner是否注册成功的方法

进入 gvm 容器,切换至 gvm 用户,获取Scanner列表。确认新增的Scanner是否正常连接,如果返回Scanner版本说明没有异常。

 

0x05 扫描配置

配置项解释: https://docs.greenbone.net/GSM-Manual/gos-4/en/glossary.html

配置详情说明: https://docs.greenbone.net/GSM-Manual/gos-4/en/performance.html#scan-performance

从web端一次性导入多个资产/从文件导入资产时的格式如下,不符合格式会提示导入失败。

// 逗号分隔, 且逗号后面要有个空格
192.168.102.1, 192.168.102.2, 192.168.102.3,

 

0x06 基于GMP远程调度

如果想与其他安全设备或安全工具集成,需要基于GMP协议远程调度。因此需要构建一个GMP客户端,自定义调度算法,将任务下发到Scanner集群,然后定时去取结果。

这里提供一个Demo使用Demo前,要手动在web端自己配置一个config

调度流程图:

注意:单个扫描任务创建时要分配Scanner且无法修改,这个是比较大的缺陷,想要修改只能删除重新创建。一种最基础的轮询策略,在创建任务时,将任务平均分配到每一个scanner。

 

0x07 参考链接

  1. https://github.com/Secure-Compliance-Solutions-LLC/GVM-Docker
  2. https://docs.greenbone.net
  3. https://github.com/filewalkwithme/go-gmp
(完)