Начиная с 8-ой версии в OpenVAS улучшили поддержку Master-Slave взаимодействия сканеров. Теперь распределять задачи и балансировать нагрузку стало гораздо проще. В связи с этим в американской компании NopSec решили сделать PoC кластера для сканирования на наличие уязвимостей. Цель была в том, чтобы навести порядок в сканирующей инфраструктуре и раскатывать новые версии сканера без задержек. Плюс посмотреть как Docker впишется в продакшн, разработку, тестирование систем и во все существующие процессы. Были подготовлены 2 docker-контейнера с OpenVAS настроенным как master и как slave.
Архитектура
На каждом Docker-контейнере запускаются процессы openvas manager и scanner, а также PostgreSQL и Redis для поддержки openvas manager.
Сборка Docker-контейнера
Сам Dockerfile и сопутствующие скрипты для сборки лежат здесь: https://github.com/wcollani/openvas-8-docker
Каждый Dockerfile устанавливает все необходисые зависимости, для того что бы собрать компоненты OpenVAS из исходников, затем собирает и устанавливает их. Также производится необходимая настройка Redis и PostgreSQL. Это прописано в скрипте setup.sh.
Подразумевается, что каждый раз, когда нам понадобится обновить OpenVAS нужно собрать новую версию контейнера и запушить её в продакшн.
Скрипт startup.sh запускает все процессы в контейнере и выводит логи (tail -f /usr/local/var/log/openvas/*), чтобы мы могли понять, если что-то пошло не так.
Рабочий процесс
1. Запускаем master. Открытый порт 9390 для OpenVAS manager и 443 для OpenVAS GUI (для отладки использовался, так-то можно использовать omp-cli или через API работать)
# cd master-manager
# docker build -t openvas-manager .
# docker run -d -p 9390:9390 -p 443:443 openvas-manager
2. Запускаем slave.
# cd slave-scanner
# docker build -t slave-scanner .
# docker run -d -p 9390 slave-scanner
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05bca6ddc558 openvas-manager "/bin/bash /openvas/s" About an hour ago Up About an hour 0.0.0.0:443->443/tcp, 0.0.0.0:9390->9390/tcp, 9391-9392/tcp condescending_kilby
2e952b9c3b2b slave-scanner "/bin/bash /openvas/s" About an hour ago Up About an hour 443/tcp, 9391-9392/tcp, 0.0.0.0:32768->9390/tcp compassionate_blackwell
Логика кластеризации
Принимаем два показателя. Сколько IP-адресов хотим сканировать одним slave-ом и сколько вообще IP-адресов хотим сканировать.
number_of_IPs_per_slave = X
number_of_IPs_to_scan = Y
Если number_of_IPs_to_scan > number_of_IPs_per_slave:
- разделить IP-адреса между Z slave-ами
- поднять Z slave-контейнеров
- зарегистрировать кажый slave-контейнер в master-е
- создать цели для сканирования
- создать задание на сканирование на каждом slave
- запустить задания
- получить результаты, когда сканирование завершится
- разрегистрировать каждый slave-контейнер в master-е
- удалить каждый slave-контейнер
Задачи на будущее
До продакшена NopSec осталось сделать следующее:
1. Развернуть все это в облаке AWS и интегрировать с EC2 Container Service.
2. Оптимизация Dockerfile.
3. Сделать общий контейнер для slave и master.
Оригинал статьи: https://www.nopsec.com/news-and-resources/blog/2015/12/1/docker-based-openvas-scanning-cluster-improve-scope-scalability/ (для России может быть заблокирован, используйте анонимайзеры ;-))