# OpenVAS 打包记

- `docker pull dustise/openvas`
- `git clone https://github.com/fleeto/docker-openvas.git`

上回书说到的 OpenVAS，其中的安装过程用的居然不是 Docker，其主要原因有：

- 第一，安装使用都不熟悉，直接上手第三方比较容易跑偏，官网靠谱一点（现在我知道了，官网也有不靠谱的）。
- 第二，因为上面的原因，Docker Hub 上的 `mikesplain/openvas-docker` 不得要领，尤其是客户端连接这部分。（后来知道他的强制更新高估了天朝的网络条件）。
- 第三，我喜新厌旧，不想用老旧的 8 版本。
- 第四，多语言支持，在上述 Docker Hub 版本上删节了。

但是作为一个容器云鼓吹者，不弄个顺手的封装的确是不合适的，所以花了些时间，重新来了一次，中间波折蛮多，不过也多了些容器封装方面的经验，就此记录下来。

## OpenVAS 组件

- openvassd：OpenVAS Scanner，扫描器，会根据本地漏洞库对任务目标进行扫描，是扫描任务的执行者。
- openvasmd：OpenVAS Manager，管理服务，任务和各种漏洞库的管理。
- gsad：Greenbone Security Assistent，他不是 Open VAS 的产品，在这里用作 Web 端，和 OpenVAS Manager 协同工作。
- omp: 命令行客户端。

## 基础镜像的选择

基于尺寸考虑，个人一般是首选 Alpine Linux。对于普通的 Java、PHP 应用，以及相对成熟的被 APK 支持的软件都会使用这个。

需要编译的东西一般就比较烦了，Alpine 的一些基础包跟主流世界不太一样，一般尝试失败的话，会选择 Ubuntu/Debian 或者 CentOS 之类。最先尝试的是 CentOS，但因为库版本的问题导致编译起来问题多多，最后无奈回到 Ubuntu。

## 守护进程问题

一般来说，各种服务都以后台运行，然而在容器环境下，需要挂在前台保持容器的运行，所以单进程的服务我们一般都会强制其以前台运行，多进程的服务，通常会使用 SupervisorD 来完成各个服务的启动和运行、维持等操作。

## 调试过程

一般来说我会准备一个脚本用于构建镜像。

- 首先用交互模式启动基础镜像，例如 `docker run -it --rm ubuntu bash`，其中可以添加环境变量等设置。
- 可以利用 `docker cp` 命令传输文件到运行中的容器。
- 之后的过程和平时的编译安装并无不同，configure/cmake 等查找缺失的库，尽可能用 apt/yum/apk 进行依赖库的安装。
- 因为要使用 OMP，所以我们需要调整 OpenVAS Manager 的启动参数，要求其暴露端口。
- 另外，OpenVAS 提供了配置检查功能，openvas-check-setup，其中对设置会有很多建议，逐条完善即可，窃以为，这是对这个不愉快的安装过程的最大安慰。
- 每一步都记录到前面提到的 prepare.sh 脚本之中
- 能正常运行之后，取出脚本，编写 Dockerfile。
- 打包测试。

## 坑

### gnupg 的问题

OpenVAS Manager 首次运行会需要利用 gnupg 来生成 Key，但是在容器环境下，随机数设备受宿主系统保护，会导致启动过程挂起，因此这里用了个土办法，生成好之后直接植入进去。

### Manager 的 Scanner Socket 参数

在 Scanner 指定了不同的 Sock 位置之后，Manager 做出相应的变更进行启动，部分操作仍然会走向缺省配置，推测是其中有一些硬编码，只是推测，并没有深入调查。

### SQLite 3 

这一软件是 gsad 的一个非常硬的依赖，但是在他的编译过程中并无需求，具体症状就是 Greenbone 有两个同步进程闪退，无法执行，需要用 --selftest 运行才找到问题所在。

### 更新过程

> 一定要有互联网连接。

更新过程第一是非常漫长，时间长度需要看网络条件和某伟大基础网络设施的心情。

接下来 Scanner 和 Manager 都需要进行相应的更新，才能正常工作。

最后，写了一个 update.all.sh 来完成这一工作。
