Руководство по установке, первичной настройке и эксплуатации фильтрующей ноды, включающей динамический модуль для Nginx и агент машинного обучения Nemesida AI MLA, предназначенной для выявления и блокирования аномалий, с использованием сигнатурного анализа и поведенческих моделей, а также для анализа запросов на соответствие их схеме в формате OpenAPI и Swagger.
# apt install apt-transport-https gnupg2 curl
# apt install apt-transport-https gnupg2 curl
Настройка Nginx
В случае компиляции Nginx из исходного кода необходимо добавить параметры --with-compat --with-threads --with-pcre
при выполнении configure
для активации поддержки динамического модуля.
Установите Nginx:
# apt update && apt upgrade # apt install nginx
Установите Nginx:
# apt update && apt upgrade # apt install nginx
# freebsd-update fetch # freebsd-update install # pkg upgrade -y
Приведите файл /etc/sysctl.conf
к виду:
... kern.ipc.somaxconn=16384 ...
Выполните команду для применения изменений до перезапуска сервера:
# sysctl kern.ipc.somaxconn=16384
Приведите файл /etc/rc.conf
к виду:
... nginx_enable="YES" ...
Установите пакет:
# pkg install -y nginx # service nginx start
Динамический модуль доступен для:
- Nginx stable, начиная с
1.12
; - Nginx mainline, начиная с
1.15
; - Nginx Plus, начиная с
R25
.
Установка
Установите идентификатор операционной системы:
# rm -f /etc/machine-id # /bin/systemd-machine-id-setup
# apt install nwaf-dyn-1.24
где 1.24 - версия установленного Nginx. Например, пакет динамического модуля nwaf-dyn-1.24 предназначен для работы с Nginx версии 1.24, а nwaf-dyn-plus-rX (где Х - номер релиза, начиная с R25) - для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r25).
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil scikit-learn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate
# apt install nwaf-dyn-1.24
где 1.24 - версия установленного Nginx. Например, nwaf-dyn-1.24 предназначен для работы с Nginx версии 1.24, а nwaf-dyn-plus-rX (где Х - номер релиза, начиная с R25) - для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r25).
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil scikit-learn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate
Для корректной работы пакета openapi-schema-validator
необходимо предоставить прямой доступ к json-schema.org:443
.
Произведите настройку политики SELinux или деактивируйте ее командой:
# setenforce 0
после чего приведите файл /etc/selinux/config
к виду:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil scikit-learn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate
Обновите список пакетов:
# freebsd-update fetch # freebsd-update install # pkg upgrade -y
Приведите файл /etc/rc.conf
к виду:
... dbus_enable="YES" rabbitmq_enable="YES" ...
Установите пакеты:
# pkg install -y wget memcached dbus gnutls curl gcc lapack Atlas-devel openblas openssl bash # service dbus start # pkg install -y python39 py39-setuptools py39-virtualenv py39-pip py39-cython py39-wheel # pkg install -y rabbitmq rabbitmq-c # service rabbitmq start
Скачайте и установите актуальную версию пакета, например:
# curl "https://nemesida-security.com/repo/nw/freebsd/12/nwaf-dyn-1.24-5.1-1568.pkg" --output nwaf-dyn-1.24-5.1-1568.pkg # pkg install -y nwaf-dyn-1.24-5.1-1568.pkg
где 1.24
- версия установленного Nginx, а 5.1-1568
- версия пакета nwaf-dyn
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil scikit-learn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate
Добавьте путь до файла с динамическим модулем Nemesida WAF и приведите параметры ниже в конфигурационном файле /etc/nginx/nginx.conf
к виду:
load_module /etc/nginx/modules/ngx_http_waf_module.so; ... worker_processes auto; ... http { ... ## # Nemesida WAF ## ## Request body is too large fix client_body_buffer_size 25M; include /etc/nginx/nwaf/conf/global/*.conf; ... }
Ошибка вида ¶:
nginx: [emerg] module "/etc/nginx/modules/ngx_http_waf_module.so" version 1017010 instead of 1024000 in /etc/nginx/nginx.conf:1
возникает в том случае, когда не совпадают версии установленного динамического модуля Nemesida WAF и Nginx. В данном случае 1017010
- версия Nginx 1.17.10, для которой был скомпилирован модуль nwaf-dyn, а 1024000
- Nginx 1.24.0, установленный на сервере. Пакет динамического модуля nwaf-dyn-1.24 предназначен для работы с Nginx версии 1.24, а nwaf-dyn-plus-r25 - для работы с NGINX Plus R25.
Первичная настройка
После установки модуля необходимо произвести первичную настройку, указав следующие параметры в файле /etc/nginx/nwaf/conf/global/nwaf.conf
:
После внесения изменений выполните перезагрузку сервера или перезапуск сервисов и проверьте их работу:
# systemctl restart nginx nwaf_update mla_main rabbitmq-server memcached # systemctl status nginx nwaf_update mla_main rabbitmq-server memcached
За получение набора сигнатур (/etc/nginx/nwaf/rules.bin
) для динамического модуля Nemesida WAF отвечает служба nwaf_update
. Для проверки работы сигнатурного метода обнаружения атак при отправке запроса http://YOUR_SERVER/nwaftest
сервер должен вернуть код ответа 403
.
Модуль Nemesida WAF обрабатывает только транслированный до конечного приложения запрос. В случае, если настройки Nginx препятствуют трансляции обращений (возвращая, к примеру, код ответа
301
или403
), обработка подобных запросов модулем Nemesida WAF производиться не будет.
В случае изменения набора сигнатур на сервере nemesida-security.com
служба nwaf_update
автоматически обновит файл rules.bin
. Если в период обновления набора сигнатур на сервере служба nwaf_update
деактивирована, загрузка новой версии набора сигнатур произойдет сразу после запуска службы nwaf_update
.
Для корректной работы сервиса RabbitMQ необходимо настроить его запуск перед запуском сервиса Nginx. Для этого отредактируйте файл /lib/systemd/system/rabbitmq-server.service
, добавив в конце секции Unit
строку Before=nginx.service
.
Пример:
[Unit] Description=RabbitMQ Messaging Server After=network.target epmd@.socket Wants=network.target epmd@.socket Before=nginx.service
После внесения изменений примените их, выполнив команду:
# systemctl daemon-reload
После выполнения первичной настройки модуля необходимо проверить наличие ошибок в журналах регистрации событий компонентов /var/log/nginx/error.log
и /var/log/nwaf/mla.log
.
Дополнительная настройка
Конфигурационный файл динамического модуля Nemesida WAF дополнительно содержит расширенный перечень доступных параметров, настройка которых невозможна с помощью Личного кабинета или API.
При настройке фильтрующей ноды дополнительно может понадобиться внесение изменений в файл /etc/nginx/nwaf/mla.conf
:
После внесения изменений выполните перезагрузку сервера или перезапуск сервисов и проверьте их работу:
# systemctl restart nginx nwaf_update mla_main rabbitmq-server memcached # systemctl status nginx nwaf_update mla_main rabbitmq-server memcached
Дополнительная информация
Для коррректной работы динамического модуля и Nemesida AI MLA, на фильтрующей ноде располагаются следующие файлы и директории:
/etc/nginx/nwaf/conf/global/nwaf.conf
- файл конфигурации динамического модуля, позволяющий выполнить первичную настройку компонента;/etc/nginx/nwaf/rules.bin
- набор сигнатур для корректной работы сигнатурного метода анализа запросов;/etc/nginx/nwaf/conf/global/db/
- директория, которая содержит файлы с настройками динамического модуля, устанавливаемые через Личный кабинет или Nemesida WAF API (например,settings.db
содержит основные настройки динамического модуля);/etc/nginx/nwaf/conf/openapi/
- директория, которая содержит применяемые Nemesida AI MLA спецификации, в формате.json
, необходимые для корректной работы API Firewall;/etc/nginx/nwaf/ml/
- директория, которая содержит все применяемые модулем Nemesida AI MLA поведенческие модели (файлы.ml
), а также запросы (файлmt.json
), экспортированные через Личный кабинет;/etc/nginx/nwaf/conf/nginx
- директория, которая содержит параметры конфигурации веб-сервера Nginx, в формате.conf
, задаваемые с помощью Немезида ВАФ.
Настройки, производимые с помощью веб-приложения и обращений API (настройки, правила исключения (WL
), расширенные правила блокировки (ERL
), список IP-адресов для блокировки (BL
) и список URL-адресов, отправляемых в модуль Nemesida AI MLA на анализ соответствия запроса его схеме в формате OpenAPI), хранятся в файлах директории /etc/nginx/nwaf/conf/global/db
. Изменение содержимого файлов производится модулем Nemesida AI MLA, но Nginx также необходимо предоставить доступ на чтение к этой директории.
1. На основном сервере (без установленного модуля Nemesida WAF) настройте зеркалирование трафика согласно руководству установленного веб-сервера (Nginx, Apache2, Microsoft IIS и прочие).
2. На сервере с установленным модулем Nemesida WAF приведите конфигурационный файл виртуального хоста Nginx к виду:
server { ... location / { proxy_pass http://127.0.0.1:86/; } } server { listen 86; index index.html; root /var/www/html; location / { return 200; add_header Content-Type text/plain; } }
3. На сервере с установленным модулем Nemesida WAF приведите файл /etc/nginx/nwaf/conf/global/nwaf.conf
к виду:
... nwaf_limit rate=5r/m block_time=0; ...
4. Для получения информации от основного веб-сервера об исходном IP-адресе клиента, на сервере с установленным модулем Nemesida WAF приведите файл /etc/nginx/nginx.conf
к виду:
server { ... set_real_ip_from x.x.x.x; real_ip_header X-Real-IP; real_ip_recursive on; }
x.x.x.x
— адрес основного веб-сервера, дублирующего трафик на сервер с установленным модулем Nemesida WAF. Исходный IP-адрес клиента передается основным веб-сервером в заголовке X-Real-IP
.
Для использования функционала Nginx должен содержать модуль ngx_http_realip_module
. Nginx, установленный из официального репозитория, содержит указанный модуль по умолчанию.
Более подробная информация доступна на странице официальной документации Nginx.
5. После внесения изменений необходимо перезапустить Nginx на каждом из серверов.
Для создания правил исключения (WL
) и блокировки (ERL
) воспользуйтесь Личным кабинетом или API.
Виртуальный патчинг ¶
Виртуальный патчинг Немезида ВАФ защищает сайты от существующих неисправленных уязвимостей (в том числе «нулевого дня»), блокируя попытки их эксплуатации, при этом не нарушая работу веб-приложения. Применение правил виртуального патчинга позволяет разработчикам сосредоточиться на исправлении уязвимостей без необходимости срочного изменения кода. Виртуальный патчинг позволяет «на лету» блокировать все попытки эксплуатации известной уязвимости, особым образом контролируя зону атаки.
В Немезида ВАФ используется два источника генерации виртуальных патчей: автоматически, модулем Nemesida AI, и вручную, созданием расширенного правила блокировки (ERL
) с помощью Личного кабинета или вызова API.
Каждому запросу, поступающему на анализ в модуль Nemesida WAF, присваивается идентификатор блокировки (BT — blocking type). Идентификатор может присваиваться независимо от того, был ли заблокирован запрос.
В сводной таблице представлены типы идентификаторов и соответствующий им статус обработки запросов.
0 | Запрос не был заблокирован. |
1 | Запрос заблокирован сигнатурным методом, при этом запрос не содержал ни одной сигнатуры со score = 12.
|
2 | Запрос заблокирован сигнатурным методом, при этом в запросе содержалась сигнатура, имеющая score = 12, или расширенным правилом блокирования (ERL).
|
3 | Запрос заблокирован модулем машинного обучения Nemesida AI MLA на основе поведенческого анализа. |
4 | Запрос заблокирован модулем ClamAV. |
5 | Запрос заблокирован вследствие внутренней ошибки. |
6 | Запрос заблокирован вследствие превышения лимита заблокированных запросов с одного IP-адреса. |
7 | Запрос определен как попытка перебора (brute-force) и заблокирован модулем Nemesida AI MLC. |
8 | Запрос заблокирован модулем машинного обучения Nemesida AI MLC на основе поведенческого анализа. |
9 | Запрос определен как попытка флуда (flood) и заблокирован модулем Nemesida AI MLC. |
10 | Запрос определен как атака «отказ в обслуживании» и заблокирован модулем Nemesida AI MLC. |
14 | Формат запроса не соответствует спецификации OpenAPI. |
16 | Запрос был отправлен с IP-адреса, находящегося в списке «Заблокированные IP». |
Для событий BT 1, 2, 3, 4, 8 параметр nwaf_limit
файла nwaf.conf
позволяет регулировать допустимое количество заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate
, IP-адрес будет заблокирован на время (в секундах), указанное в block_time
.
Для событий BT 7, 9, 10 блокирование IP-адреса источника запросов будет происходить после первого заблокированного запроса, независимо от значения параметра rate
в nwaf_limit
.
Дополнительный заголовок $nwaf_block_type
Немезида ВАФ позволяет использовать специальный заголовок, определяющий результат обработки запроса. Для его активации необходимо добавить параметр add_header nemesidawaf-bt $nwaf_block_type always;
в область http
, server
или location
конфигурационного файла nginx
.
Пример использования заголовка
- Установите заголовок в область
server
:server { ... add_header nemesidawaf-bt $nwaf_block_type always; ... }
и перезапустите
nginx
. - Выполните запрос:
curl -i localhost/nwaftest
В ответе сервера в заголовке nemesidawaf-bt
будет содержаться информация о статусе обработки запроса:
HTTP/1.1 403 Forbidden Server: nginx/1.16.1 Date: Wed, 12 Feb 2020 19:05:26 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive nemesidawaf-bt: 2 ...
В данном случае статус равен 2
. Это означает, что запрос был заблокирован в связи с вхождением сигнатуры атаки со score
, равным 12
(nwaftest
). Более подробная информация о статусе обработки запроса доступна в соответствующем разделе. Такой заголовок может быть полезен при генерации кастомизированной страницы ответа сервера (например, в случае блокирования запроса).
Дополнительный заголовок $nwaf_cc
Немезида ВАФ позволяет использовать специальный заголовок, определяющий результат блокировки запроса по стране с помощью функционала расширенного правила блокировки запросов. Для его активации необходимо добавить параметр add_header nemesidawaf-cc $nwaf_cc always;
в область http
, server
или location
конфигурационного файла nginx
.
Пример использования заголовка
- Установите заголовок в область
server
:server { ... add_header nemesidawaf-cc $nwaf_cc always; ... }
и перезапустите
nginx
. - Выполните запрос:
curl -i example.com
В ответе сервера в заголовке nemesidawaf-cc
будет содержаться информация о статусе блокировки:
HTTP/1.1 403 Forbidden Server: nginx/1.16.1 Date: Wed, 12 Feb 2020 19:05:26 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive nemesidawaf-cc: 1 ...
В данном случае статус равен 1
. Это означает, что запрос был заблокирован по полю country
. Если правило составлено с использованием дополнительных полей, например, body
или headers
, то при блокировке заголовок применяться не будет. Исключениями являются поля vhost
и url
.
nwaf_limit
в конфигурационном файле nwaf.conf
). Используя функционал капчи, пользователь может разблокировать собственный IP-адрес, если он был определен как источник атак методом перебора (BT 7), флуда (BT 9) или атак «отказ в обслуживании» (BT 10).
Для корректной работы механизма разблокировки IP-адреса необходимо активировать параметр nwaf_captcha_unban
, добавив его в файле виртуального хоста в секцию server
для определенного URL
-адреса. Пример активации параметра nwaf_captcha_unban
:
server { listen 80; server_name example.com; location /captcha_ip_unban_path { ... nwaf_captcha_unban on; ... } ... }
Также необходимо настроить веб-приложение с капчей. С подробной инструкцией по интеграции Немезида ВАФ c функционалом reCAPTCHA можно ознакомиться по ссылке.
После активации параметра nwaf_captcha_unban on;
и перезапуска Nginx функционал разблокировки IP-адреса становится доступным для целевого URL
-адреса с установленной опцией nwaf_captcha_unban
.
Пример:
example.com/captcha_ip_unban_path
.
При правильном ответе веб-приложение с капчей направляет запрос delete_banned_ip
в модуль Nemesida WAF для разблокировки IP-адреса. После этого пользователь будет переадресован на исходную страницу.
В целях безопасности рекомендуется разрешить обращения на
URL
-адрес сервера с установленным динамическим модулем Nemesida WAF и активированным параметром разблокировки IP-адресаnwaf_captcha_unban
только с IP-адреса сервера с капчей.
Для активации антивирусной защиты установите ПО ClamAV на сервер с настроенным ПО Немезида ВАФ, если это не было сделано ранее.
Пример установки для Debian 10:
# apt install clamav-daemon
Включение функционала взаимодействия с ПО ClamAV осуществляется путем активации параметра nwaf_clamav
в файле /etc/nginx/nwaf/conf/global/nwaf.conf
и приведения файла /etc/clamav/clamd.conf
к виду:
... TCPSocket 3310 TCPAddr 127.0.0.1 ...
После внесения изменений необходимо перезапустить Nginx.