Как стать автором
Обновить
0
Pentestit
Информационная безопасность

Nemesida WAF: Docker-контейнер

Время на прочтение9 мин
Количество просмотров5.7K

Nemesida WAF - комплексная защита сайтов, интернет-магазинов, личных кабинетов, порталов, маркетплейсов, API и других веб-приложений от хакерских атак на основе машинного обучения Nemesida AI. Особенностью Nemesida WAF является высокая точность выявления атак при минимальном количестве ложных срабатываний. Наличие сканера уязвимостей, модулей машинного обучения, виртуального патчинга и масштабируемость позволяет обеспечивать безопасность веб-приложений как на этапе разработки, так и при полноценном использовании. Поставляется в виде:

Сегодня мы рассмотрим установку и настройку Nemesida WAF из Docker-образа.

Docker - программное обеспечение для автоматизации развертывания и управления приложениями в средах с поддержкой контейнеризации. В свою очередь, контейнер - это запакованное, вместе со своим окружением и зависимостями, приложение, которое можно без особых усилий развернуть и запустить на готовом сервере и при этом не переживать за установку дополнительных зависимостей.

Устанавливаем Docker

Работа с Docker-контейнерами начинается с установки Docker'а. Для примера установка будет производиться на сервер с Debian 10.

Добавим информацию о репозитории и GPG ключ:

# echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Обновим список пакетов, установим зависимости и пакет Docker:

# apt update
# apt install apt-transport-https ca-certificates curl gnupg lsb-release
# apt install docker-ce docker-ce-cli containerd.io

После окончания установки можно производить развертывание контейнера с Nemesida WAF.

Разворачиваем контейнер с Nemesida WAF

Динамический модуль Nemesida WAF и Nemesida AI

Динамический модуль Nemesida WAF предназначен для выявления и блокировки запросов, содержащих "полезную" нагрузку. Но помимо этого в Nemesida WAF реализована защита от атак методом перебора и DDoS, которые, как правило, не блокируются средствами WAF, ведь изначально отправляют к веб-приложению легитимные запросы. Однако, это тоже является серьезной угрозой для веб-приложения. Так по статистике компании Acunetix за 2019-2020 год среди проанализированных веб-приложений у 28% отсутствует защита от перебора пароля и у 1% используются пароли по умолчанию. К тому же, 11% веб-приложений уязвимы для DDoS атак. Эти, и не только, аномалии выявляются и блокируются модулем Nemesida AI - модулем машинного обучения, позволяющим увеличить точность выявления атак. В Nemesida AI используются классические алгоритмы машинного обучения, не требующие, в отличие от нейронных сетей, больших вычислительных мощностей. Таким образом, при относительно невысоком требовании к аппаратной части сервера (до 32 Гб ОЗУ) достигается оптимальное время обработки запросов (что напрямую влияет на время ответа веб-приложения), а количество ложных срабатываний составляет 0.01%.

К примеру:

http://example.com/?cmd=; cat /etc/passwd

Такой запрос будет заблокирован средствами сигнатурного анализа. Но если видоизменить запрос, например:

http://example.com/?cmd=; cat+/e?c/pa??wd

Уже не будет попадать под какую-нибудь сигнатуру и будет рассматриваться как легитимный запрос. Но с помощью модуля машинного обучения Nemesida AI MLC подобные аномалии и выявляются. Более подробно про обход WAF можно прочитать в статье.

Загружаем образ c динамическим модулем Nemesida WAF и Nemesida AI:

# docker pull nemesida/nwaf-dyn-1.18
В процессе развертывания Docker-контейнеров может возникать ошибка
ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Ошибка связана с использованием прокси-сервера в системе. Однако Docker не использует системный прокси-сервер и ему нужно указать его отдельно. Для этого нужно создать файл /etc/systemd/system/docker.service.d/http-proxy.conf с содержимым:

[Service]
Environment="HTTP_PROXY=http://<proxy_address:port>"
"HTTPS_PROXY=http://<proxy_address:port>"

И перезапустить сервис:

# systemctl daemon-reload
# systemctl restart docker

Для будущих конфигурационных файлов создаем директории и файл для первого запуска first_launch:

# mkdir /opt/nwaf/waf-config
# touch /opt/nwaf/waf-config/first-launch

Запускаем контейнер:

# iptables -t filter -N DOCKER
# docker run --rm -d -v /opt/nwaf/waf-config:/nginx.configs -p 80:80 nemesida/nwaf-dyn-1.18

После первого запуска контейнер автоматически завершит работу, создав необходимый набор конфигурационных файлов в соответствующей директории.

Настройка модулей

После развертывания контейнера необходимо задать некоторые настройки в файлах /opt/nwaf/waf-config/nwaf/conf/global/nwaf.conf:

  • nwaf_license_key - лицензионный ключ. Запросить 14-дневную пробную версию можно тут;

  • nwaf_api_conf - настройка взаимодействия с модулем Nemesida WAF API (заполнятся после развертывания контейнера Nemesida WAF API+Cabinet);

  • sys_proxy - конфигурация системного прокси-сервера (если используется);

/etc/nginx/nwaf/mla.conf:

  • st_enable - отправка спорных запросов на сервер Nemesida WAF Signtest для последующей обработки;

  • st_uri - URI сервера Nemesida WAF Signtest для обработки результатов работы Nemesida AI.

/opt/nwaf/waf-config/mlc/mlc.conf:

  • nwaf_license_key - лицензионный ключ;

  • vhosts_list - список виртуальных хостов, для которых модуль машинного обучения Nemesida AI MLC будет создавать поведенческие модели;

  • api_uri, api_proxy - конфигурация взаимодействия с модулем Nemesida WAF API;

  • sys_proxy - конфигурация системного прокси-сервера (если используется);

  • st_enable - отправка спорных запросов, получаемых от модуля Nemesida WAF, на сервер Nemesida WAF Signtest для последующей обработки;

  • st_uri - URI сервера Nemesida WAF Signtest для отправки спорных запросов.

После внесения изменений запускаем контейнер.

Nemesida WAF API и Личный кабинет Nemesida WAF

Nemesida WAF API предназначен для взаимодействия всех модулей Nemesida WAF. В личном кабинете Nemesida WAF отображается информация о заблокированных запросах к защищаемому веб-приложению.

Загружаем образ c модулем Nemesida WAF API и Личный кабинет Nemesida WAF:

# docker pull nemesida/nwaf-api-cabinet

Для будущих конфигурационных файлов создаем директории и внутри директории с конфигурацией файл для первого запуска first_launch:

# mkdir /opt/nwaf/api-cab-config
# mkdir /opt/nwaf/api-cab-base
# touch /opt/nwaf/api-cab-config/first-launch

Запускаем контейнер с образом Nemesida WAF API и Личным кабинетом Nemesida WAF:

# iptables -t filter -N DOCKER
# docker run --rm -d -v /opt/nwaf/api-cab-config:/nwaf-api -v /opt/nwaf/api-cab-base:/var/lib/postgresql -p 8080:8080 -p 8090:80 nemesida/nwaf-api-cabinet

где:

  • --run - удаление контейнера после завершения работы;

  • -d - запуск контейнера в фоновом режиме;

  • -v /opt/nwaf/api-cab-config:/nwaf-api - монтируем каталог с конфигурационными файлами внутри контейнера;

  • -v /opt/nwaf/api-cab-base:/var/lib/postgresql - монтируем каталог с базой данных внутри контейнера;

  • -p 8080:8080 - проброс порта контейнера 8080 (правый) на внешний порт сервера 8080 (левый);

  • -p 8090:80 - проброс порта контейнера 8090 на внешний порт сервера 80.

Для директории /opt/nwaf/api-cab-config устанавливаем права на чтение:

# chmod -R 0555 /opt/nwaf/api-cab-config

Получим ID контейнера выполнив команду:

# docker ps -a

Выполняем миграцию и создаем учетную запись администратора:

# docker exec -ti /ID контейнера/ bash -c "bash /opt/migrate.sh"

Для внесения изменений в конфигурацию модулей необходимо остановить контейнер командой:

# docker stop /ID контейнера/

и отредактировать конфигурационные файлы модулей /opt/nwaf/api-cab-config/settings_api.py:

Настройка модуля Nemesida WAF API
  • HTTP_PROXY_CONF - адрес прокси-сервера (если используется).

и /opt/nwaf/api-cab-config/settings_cabinet.py:

Настройка модуля Личный кабинет Nemesida WAF
  • PROXY - адрес прокси-сервера (если используется).

После внесения изменений перезапускаем контейнер.

# iptables -t filter -N DOCKER
# docker run --rm -d -v /opt/nwaf/api-cab-config:/nwaf-api -v /opt/nwaf/api-cab-base:/var/lib/postgresql -p 8080:8080 -p 8090:80 nemesida/nwaf-api-cabinet

Nemesida WAF Signtest

Nemesida WAF Signtest предназначен для обработки спорных запросов.

Загружаем образ c модулем Nemesida WAF Signtest:

# docker pull nemesida/nwaf-st

Для будущих конфигурационных файлов создаем директории и внутри директории с конфигурацией файл для первого запуска first_launch:

# mkdir /opt/nwaf/nwaf-signtest-config
# mkdir /opt/nwaf/nwaf-signtest-base
# touch /opt/nwaf/api-signtest-config/first-launch

Запускаем контейнер с образом Nemesida WAF Signtest:

# iptables -t filter -N DOCKER
# docker run --rm -d -v /opt/nwaf/nwaf-signtest-config:/nwaf-signtest -v /opt/nwaf/nwaf-signtest-base:/var/lib/postgresql -p 8081:8088 -p 82:80 nemesida/nwaf-st

где:

  • --run - удаление контейнера после завершения работы;

  • -d - запуск контейнера в фоновом режиме;

  • -v /opt/nwaf/nwaf-signtest-config:/nwaf-signtest - монтируем каталог с конфигурационными файлами внутри контейнера;

  • -v /opt/nwaf/nwaf-signtest-config:/nwaf-signtest - монтируем каталог с базой данных внутри контейнера;

  • -p 8081:8088 - проброс порта контейнера 8088 на внешний порт сервера 8081;

  • -p 82:80 - проброс порта контейнера 80 на внешний порт сервера 82.

Для директории /opt/nwaf/nwaf-signtest-config устанавливаем права на чтение:

# chmod -R 0555 /opt/nwaf/nwaf-signtest-config

Получим ID контейнера выполнив команду:

# docker ps -a

Выполняем миграцию и создаем учетную запись администратора:

# docker exec -ti /ID контейнера/ bash -c "bash /opt/migrate.sh"

Для внесения изменений в конфигурацию модуля необходимо остановить контейнер командой:

# docker stop /ID контейнера/

и отредактировать конфигурационный файл модуля /opt/nwaf/nwaf-signtest-config/settings_signtest.py:

Настройка модуля Nemesida WAF Signtest
  • HTTP_PROXY - адрес прокси-сервера ( если используется).

После внесения изменений перезапускаем контейнер.

# iptables -t filter -N DOCKER
# docker run --rm -d -v /opt/nwaf/nwaf-signtest-config:/nwaf-signtest -v /opt/nwaf/nwaf-signtest-base:/var/lib/postgresql -p 8081:8088 -p 82:80 nemesida/nwaf-st

Учимся пользоваться

После развертывания контейнеров с Nemesida WAF может потребоваться дополнительная проверка, что все работает так как нужно. Для этого можно заглядывать в сами контейнеры:

# docker ps -a
# docker exec -ti /ID контейнера/ bash -c "/bin/bash"

После выполнения попадем в консоль контейнера, где можем проверить логи, конфигурацию и работу модулей в целом. Если требуется доработка или исправление конфигурации, то необходимо каждый раз останавливать контейнер, вносить изменения и запускать контейнер заново.

Если все работает корректно, то после запуска контейнеров атаки на веб-приложение будут блокироваться с записью в лог Nginx

и отображаться в личном кабинете:

Личный кабинет

В личном кабинете Nemesida WAF есть два основных раздела для работы: Summary и Attacks. И неосновные разделы, где можно произвести настройку учетной записи пользователя, сгенерировать отчет по заблокированным запросам, посмотреть результат работы модуля Nemesida WAF Scanner и тд.

Summary

Отображает статистическую информацию по атакам:

  • количество атак (сегодня/последние сутки/неделя/месяц);

  • атаки по типам (заблокированные сигнатурным анализом, модулем машинного обучения Nemesida AI MLC, brute-force, DDoS и тд);

  • сводка по IP-адресам, осуществляющим атаки.

Attacks

Отображает заблокированные запросы. При клике на атаку развернется окно с описанием, где:

  • указан пейлоад, который привел к блокировке запроса;

  • чем было заблокировано (сигнатурный анализ, модуль машинного обучения и т.д.);

  • прочая информация о запросе.

Если запрос был заблокирован сигнатурным анализом, то при клике на идентификатор сигнатуры (Rule ID) развернется окно с детальной информацией и инструкцией для создания правила исключения сигнатуры.

Справа находятся 2 кнопки "R" (Recheck) и "U" (Unlock). Recheck отвечает за проверку пейлоада модулем Nemesida WAF Scanner, а Unlock - за разблокировку запроса, который, по мнению администратора, был ошибочно заблокирован.

Если атак на веб-приложение много, то навигация по ним может быть затруднительной. Для этого существуют различные фильтры, с помощью которых можно производить поиск интересующих атак. Например, для разделов Summary и Attacks доступны следующие фильтры:

  • h - виртуальный хост, доменное имя;

  • t - тип атаки (SQLi, XSS, RCE, LFI, MLA, DDoS, MLC и т.д.);

  • ip - IP-адрес атакующего;

  • group_id - идентификатор группы запросов, определенных Nemesida AI MLC как brute-force или DDoS-атака;

  • recheck - статус выполнения операции recheck (processed, confirmed, not confirmed);

  • rule - идентификатор сигнатуры;

  • mz - зона выявления уязвимости (URL, ARGS, BODY, HEADERS и т.д.).

Пример:

Мы хотим найти все заблокированные запросы, исключив из выборки IP-адрес атакующего 189.11.53.158:

ip:!189.11.53.158

Теперь необходимо отсортировать все запросы, которые были заблокированы с идентификатором сигнатуры 1087:

rule:1087

Фильтры можно комбинировать для более точного поиска. Например, нам необходимо отсортировать запросы с атаками типа SQLi, исключив из выборки те из них, в которых IP-адрес атакующего 189.11.53.158:

t:SQLi and ip:!189.11.53.158

Полноценно ознакомиться с работой Личного кабинета Nemesida WAF можно на демонстрационном стенде (логин: demo@pentestit.ru, пароль: pentestit).

Заключение

Docker является отличным решением в тех случаях, когда необходимо протестировать возможности того или иного продукта, без его полноценного внедрения в инфраструктуру компании. Ознакомиться с подробной инструкцией по развертыванию Docker-образов Nemesida WAF можно в нашей документации.

Теги:
Хабы:
Всего голосов 7: ↑7 и ↓0+7
Комментарии0

Публикации

Информация

Сайт
www.pentestit.ru
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия

Истории