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)有几个明显短板:
- 单例部署(单个扫描器)时的扫描效率十分低下。为当面对海量资产时,单例部署往往力不从心。
- 安装极为复杂,可能是史上安装起来最麻烦的扫描器。
- 规则数量庞大,更新速度慢。
- 中文资料少。
- 使用docker镜像会避免安装过程,但是目前看到的gvm docker镜像版本过低,扫描性能与最新版天差地别。
- 与其他设备集成时,需通过GMP协议远程调度下发扫描任务并拉取结果。然而最新GMP调度的实现几乎没有。
GVM-Docker项目是个非常优秀的项目,给我提供了很多指导性的思路,但是该项目更新规则耗时过长,且多节点部署时有严重bug。因此,这段时间在该项目基础上,研究了一套基于Docker集群和最新版GVM的分布式系统漏扫。
主要实现:
- NVT、SCAP、CERT规则库打包(20201126)
- 最新版 GVM Docker镜像(v20.8.0)
- 最新版 GVM Scanner Docker镜像(v20.8.0)
- 单GVM – 多Scanner 分布式部署
- 与其他工具集成,远程调度。
项目地址:
https://github.com/jweny/Distributed_Docker_Openvas
0x02 架构
从GOS 4开始,GVM开始支持ssh。在集群中部署单个GVM节点,以及众多Scanner节点,并将所有Scanner的ssh公钥添加到GVM中,即可通过ssh socket建立GVM与远程Scanner OSPd之间的连接。
- GVM节点:负责资产配置、扫描配置、任务创建与下发(任务可以使用轮询等调度方式下发到每个Scanner节点);
- Scanner节点:负责接收并解析GVM分配的任务、漏扫、结果回传;
- 配置与调度:GVM的web端(9392端口)手动配置;GMP协议调度(服务端在9390端口)
0x03 GVM部署
测试环境:192.168.102.137 CentOS7
3.1 准备工作
- docker禁用ipv6。
-
先下载项目中规则库。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 id
和 Public 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。
发表评论
您还未登录,请先登录。
登录