作为安全行业从业者,一定会有一款适合自己的扫描器,在众多开源扫描器中,相信有很多人会选择openvas,绿骨头组织的这款产品因其性能卓越,扩展性强,接入点、接入方式灵活等众多优点,至今已经成为了企业的安全解决方案之一。
这款扫描器有一个非常优秀的功能点,即以GMP协议为支撑,平台支持灵活任务下发。因此这个功能是一定要尝试的,试想当你想对一批目标进行定时扫描或者常规扫描时,你只需要简单的配置,通过web界面或者cli脚本,将任务下发给你的scanner-slave集群,然后坐等收集扫描结果,是不是很爽!
但最近在配置openvas的主从服务器时,遇到了一些BUG甚是头疼,磕了很久终于解决,于是记录下来,以防有同道中人掉坑里。
一、名词扫盲
在配置扫描器的时候,海量的教程,海量的词汇经常让我头晕晕的,比如Openvasmd、gvmd、openvassd、gasd、OMP、GMP等等,首先我们来过一遍这些名词。
Master配置
- 第一步:登录到GSA上,进入 Configuration-> Credentials
第二步:然后进入Configuration-> Scanner
Type一定要选GMP Scanner.Credential选刚刚创建的test.
第三步:创建任务
第四步:
任务创建之后需要在master上给相应的scanner配置slave的cacert.pem
slave上cert默认路径在/var/lib/gvm/CA/cacert.pem
此处需要把slave上的cacert.pem复制到master上.
1 | gvmd --get-scanners //查找test的uuid |
此处配置完成master后,最好重启一下gvmd以及gsad.原因后面会说.
接下来配置Slave.
Slave配置
第一步,创建一个非admin的账号
1 | gvmd --create-user=test --new-password=test --role=Admin |
第二步:保证gvmd监听在TCP-port上,而不是Unix socket,这一步笔者在实验的时候错了许多次,总结出几个要注意的点.首先执行:
1 | service gvmd stop |
其次执行:
1 | gvmd --listen=0.0.0.0 --port=9391 |
确保gsad正常运行的前提下,gvmd监听9391端口:
1 | netstat -anop | grep gvmd |
期间打开log,跟进报错:
1 | tail -f /var/log/gvm/gvmd.log |
启动task
点击启动task,此处可能会遇到如下几个问题:
问题一:
1 | failed to connect xxxx port 9391. |
解决方案:确保slave上的9391端口开放,确保防火墙能通过.
问题二:(master)slave_connect failed | (slave)read_from_client_tls
该问题广泛出现在Greenbone 开源社区,github issue,同样的配置不见得能解决同样的问题,因此笔者进行了深入的分析和研究。
1 | tail -f /var/log/gvm/gvmd-master: |
1 | tail -f /var/log/gvm/gvm-slave: |
1.笔者首先抓了master上的包,发现有向slave的9391端口发的包, slave的9391端口也有返回包,排除了网络不可达的问题.
2.笔者通过查阅各种资料,确保cacert没有搞错,路径没有搞错
3.经历一天的排除+尝试,一遍遍确认自己配置是正确的前提下,笔者终于找到了找到了一个可能的原因,即当执行
1 | gvmd --modify-scanner="uuid" --scanner-ca-pub=/path/to/cacert.pem |
之后,gvmd并不能立即加载该证书,并且即使按照上面步骤执行也会重复出现上述报错.
此处需要在配置完证书之后,重启一下gvmd使其加载证书,重启task即可在两边的log中发现如下log,且GSA上也终于从requested变成了running.
1 | Status of task test6 has changed to Running |
2.2 ssh
从GOS 4开始,SSH是默认的连接类型,可通过GVM建立管理守护进程之间的连接。 GMP协议通过SSH隧道传输并转发到gvmd / openvasmd,目前笔者还没有测试过.
2.3 Unix Domain Socket
Unix Domain Socket是Greenbone Source Edition中gvmd的默认类型。 但只可以使用
在与进程相同的主机上运行client-tools时。
gvmd/openvasmd提供的Unix Domain Socket的从GVM 9中的openvasmd.sock更改为GVM 10中的gvmd.sock。
在GOS 4代里sock路径一般为/run/openvas/openvasmd.sock.
在GOS 5代里sock路径一般为/run/gvm/gvmd.sock.
基于OSPd的扫描器也可以通过Unix Domain Socket访问。
举个例子,笔者的实验环境为:
1 | rpm -qa | grep gvm |
默认启动的gvmd使用的是Unix Domain Socket,如下:
1 | netstat -ano |grep gvmd |
三、总结
1.官方文档永远是最好的教程,其次是开源社区.
2.Debug时要有自己的主线+思考,不是盲目地遇到 一个问题就去查,别人的前置环境和自己的不一样会让自己掉进去,越陷越深。
附一份官方参考文档:https://readthedocs.org/projects/gvm-tools/downloads/pdf/latest/