Руководство по установке, первичной настройке и эксплуатации динамического модуля Nemesida WAF для Nginx и агента машинного обучения Nemesida AI MLA, предназначенных для выявления и блокирования аномалий, с использованием сигнатурного анализа и поведенческих моделей, а также для анализа запросов на соответствие их схеме в формате OpenAPI и Swagger.

Установка
Перед установкой компонентов Nemesida WAF добавьте информацию о репозитории в систему:

DebianUbuntuCentOSDockerVirtual Appliance
# apt install apt-transport-https gnupg2 curl
Debian 10
# echo "deb https://nemesida-security.com/repo/nw/debian buster non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add -
# apt update && apt upgrade
Debian 11
# echo "deb https://nemesida-security.com/repo/nw/debian bullseye non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update && apt upgrade
# apt install apt-transport-https gnupg2 curl
Ubuntu 18.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu bionic non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add -
# apt update && apt upgrade
Ubuntu 20.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu focal non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add -
# apt update && apt upgrade
Ubuntu 22.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu jammy non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg 
# apt update && apt upgrade
CentOS 7
# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-7-1-6.noarch.rpm
# yum update
# yum install epel-release
CentOS 8 Stream
# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-8-1-6.noarch.rpm
# dnf update
# dnf install epel-release
CentOS 9 Stream
# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-9-1-6.noarch.rpm
# dnf update
# dnf install epel-release
Информация об использовании Nemesida WAF в Docker-контейнере доступна в соответствующем разделе.
Информация об использовании Nemesida WAF в виде Virtual Appliance (виртуальный диск для KVM/VMware/VirtualBox) и Yandex VM доступна в соответствующем разделе.

Настройка Nginx

В случае компиляции Nginx из исходного кода необходимо добавить параметры --with-compat --with-threads при выполнении configure для активации поддержки динамического модуля.

DebianUbuntuCentOSFreeBSD 12/13
Подключите репозиторий Nginx:

Debian 10
# echo "deb http://nginx.org/packages/debian/ buster nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -
Debian 11
# echo "deb http://nginx.org/packages/debian/ bullseye nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/packages/keys/nginx_signing.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg

Установите Nginx:

# apt update && apt upgrade
# apt install nginx
Подключите репозиторий Nginx:

Ubuntu 18.04
# echo "deb http://nginx.org/packages/ubuntu/ bionic nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -
Ubuntu 20.04
# echo "deb http://nginx.org/packages/ubuntu/ focal nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -
Ubuntu 22.04
# echo "deb http://nginx.org/packages/ubuntu/ jammy nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/packages/keys/nginx_signing.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg 

Установите Nginx:

# apt update && apt upgrade
# apt install nginx
CentOS 7
Подключите репозиторий Nginx:

# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Установите пакеты:

# yum update
# yum install nginx
CentOS 8 Stream
Подключите репозиторий Nginx, приведя файл /etc/yum.repos.d/nginx.repo к виду:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Установите пакеты:

# dnf update
# dnf install nginx
CentOS 9 Stream
Подключите репозиторий Nginx, приведя файл /etc/yum.repos.d/nginx.repo к виду:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Установите пакеты:

# dnf update
# dnf install nginx
Обновите список пакетов:

# portsnap fetch extract

Приведите файл /etc/rc.conf к виду:

...
dbus_enable="YES"
nginx_enable="YES"
...

Установите пакет:

# pkg install -y nginx
# service nginx start

Динамический модуль Nemesida WAF доступен для:

  • Nginx stable, начиная с 1.12;
  • Nginx mainline, начиная с 1.15;
  • Nginx Plus, начиная с R16.

Установка

Установите идентификатор операционной системы:

# rm -f /etc/machine-id
# /bin/systemd-machine-id-setup
DebianUbuntuCentOSFreeBSD 12/13
Debian 10

Установите пакеты:

# apt update && apt upgrade
# apt install python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc libmaxminddb0 g++ memcached rabbitmq-server
Debian 11

Установите пакеты:

# apt update && apt upgrade
# apt install python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc libmaxminddb0 g++ memcached rabbitmq-server
# apt install nwaf-dyn-1.22

где 1.22 - версия установленного Nginx. Например, пакет динамического модуля nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-rX (где Х - номер релиза, начиная с R16) - для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r16).

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil sklearn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate

Ubuntu 18.04
Установите пакеты:

# apt update && apt upgrade
# apt install python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc libmaxminddb0 g++ memcached rabbitmq-server
Ubuntu 20.04
Установите пакеты:

# apt update && apt upgrade
# apt install python3 python3-venv python3-pip python3-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc libmaxminddb0 g++ memcached rabbitmq-server
Ubuntu 22.04
Установите пакеты:

# apt update && apt upgrade
# apt install python3 python3-venv python3-pip python3-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc libmaxminddb0 g++ memcached rabbitmq-server
# apt install nwaf-dyn-1.22

где 1.22 - версия установленного Nginx. Например, nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-rX (где Х - номер релиза, начиная с R16) - для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r16).

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil sklearn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate

Произведите настройку политики 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
CentOS 7
Разрешите прямое подключение к nemesida-security.com:443.

Установите пакеты:

# yum update
# yum install python36 python36-devel python36-setuptools python36-pip systemd openssl librabbitmq libcurl-devel gcc libmaxminddb memcached rabbitmq-server
# yum install nwaf-dyn-1.22

где 1.22 — версия установленного Nginx. Например, пакет динамического модуля nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-rX (где Х — номер релиза, начиная с R16) — для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r16).

CentOS 8 Stream
Подключите репозиторий RabbitMQ, приведя файл /etc/yum.repos.d/RabbitMQ.repo к виду:

[rabbitmq_erlang]
name = rabbitmq_erlang
baseurl = https://packagecloud.io/rabbitmq/erlang/el/8/$basearch
repo_gpgcheck = 0
gpgcheck = 0
enabled = 1

[rabbitmq_server]
name = rabbitmq_server
baseurl = https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/$basearch
repo_gpgcheck = 0
gpgcheck = 0
enabled = 1

Установите пакеты:

# dnf update
# dnf install dnf-utils
# dnf install python39 python39-devel python39-setuptools python39-pip systemd openssl librabbitmq libcurl-devel gcc libmaxminddb memcached rabbitmq-server
# dnf install nwaf-dyn-1.22

где 1.22 — версия установленного Nginx. Например, пакет динамического модуля nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-rX (где Х — номер релиза, начиная с R16) — для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r16).

CentOS 9 Stream
Установите пакеты:

# dnf update
# dnf install dnf-utils
# dnf install centos-release-rabbitmq-38
# dnf install python3 python3-devel python3-setuptools python3-pip systemd openssl librabbitmq libcurl-devel gcc libmaxminddb memcached rabbitmq-server
# dnf install nwaf-dyn-1.22

где 1.22 — версия установленного Nginx. Например, пакет динамического модуля nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-rX (где Х — номер релиза, начиная с R16) — для работы с последней версией Nginx Plus (пример: nwaf-dyn-plus-r16).

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil sklearn schedule simple-crypt fuzzywuzzy levmatch python-Levenshtein unidecode fsspec func_timeout url-normalize netaddr pymemcache logutils openapi-schema-validator strict-rfc3339 rfc3339-validator isodate

Обновите список пакетов:

# portsnap fetch extract

Приведите файл /etc/rc.conf к виду:

...
dbus_enable="YES"
rabbitmq_enable="YES"
...

Установите пакеты:

# pkg install -y wget memcached libmaxminddb 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.22-5.1-1568.pkg" --output nwaf-dyn-1.22-5.1-1568.pkg
# pkg install -y nwaf-dyn-1.22-5.1-1568.pkg

где 1.22 - версия установленного Nginx, а 5.1-1568 - версия пакета nwaf-dyn

Добавьте путь до файла с динамическим модулем 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 1022000 in /etc/nginx/nginx.conf:1

возникает в том случае, когда не совпадают версии установленного динамического модуля Nemesida WAF и Nginx. В данном случае 1017010 - версия Nginx 1.17.10, для которой был скомпилирован модуль nwaf-dyn, а 1022000 - Nginx 1.22.0, установленный на сервере. Пакет динамического модуля nwaf-dyn-1.22 предназначен для работы с Nginx версии 1.22, а nwaf-dyn-plus-r22 - для работы с NGINX Plus R22.

Первичная настройка

После установки модуля необходимо произвести первичную настройку, указав следующие параметры в файле /etc/nginx/nwaf/conf/global/nwaf.conf:

Параметры nwaf.conf
Параметр по умолчанию
Описание параметра
nwaf_license_key

Параметр установки лицензионного ключа ПО Nemesida WAF. Ключ также используется модулем Nemesida AI, если модуль размещен на том же сервере. Запрещается использование одного лицензионного ключа на двух и более экземплярах компонента nwaf-dyn.

При указанном недействительном лицензионном ключе (в том числе при значении по умолчанию nwaf_license_key none), Nemesida WAF продолжит работу с функционалом Nemesida WAF Community Edition.

nwaf_sys_proxy
Параметр задает адрес прокси-сервера для обращения к внешним ресурсам (проверка лицензионного ключа, получение сигнатур и т.д.).

Пример:

nwaf_sys_proxy http://proxy.example.com:3128;

Для CentOS 7 допускается использование прокси-сервера только по схеме HTTP.

nwaf_api_proxy
Параметр задает адрес прокси-сервера для обращения к Nemesida WAF API.

Пример:

nwaf_api_proxy http://proxy.example.com:3128;

Для CentOS 7 допускается использование прокси-сервера только по схеме HTTP.

nwaf_api_conf

Адрес сервера Nemesida WAF API для отправки информации о выявленных аномалиях.

host — параметр задает адрес сервера Nemesida WAF API для отправки информации об атаках, результатах работы Nemesida WAF Scanner и Nemesida AI. С опцией host=none данные на Nemesida WAF API передаваться не будут.

Если модуль Nemesida WAF API еще не настроен, то параметры nwaf_api_conf, nwaf_api_proxy можно указать позднее.

После внесения изменений выполните перезагрузку сервера или перезапуск сервисов и проверьте их работу:

# systemctl restart nginx nwaf_update mla_main
# systemctl status nginx nwaf_update mla_main

За получение набора сигнатур (/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.

Дополнительная настройка

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

Параметры nwaf.conf
Параметр по умолчанию
Описание параметра
nwaf_host_enable

Активирует механизм анализа запроса средствами Nemesida WAF для виртуального хоста. При параметре nwaf_host_enable *; анализ будет производиться для всех виртуальных хостов.

Пример использования одного значения:

nwaf_host_enable *;
nwaf_host_enable example.com;
nwaf_host_enable *.example.com;

Пример использования нескольких значений:

nwaf_host_enable example.com, a.example.com;
nwaf_host_enable example.com, *.example.com;
nwaf_ban_captcha_host*

Параметр, активирующий для виртуальных хостов механизм разблокирования IP-адреса с использованием капчи для запросов, определенных модулем Nemesida AI MLC как ВТ 7, BT 9 или BT 10. Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример:

nwaf_ban_captcha_host *;
nwaf_ban_captcha_host example.com;
nwaf_ban_captcha_host *.example.com;

Более подробная информация о функционале доступна в соответствующем разделе.

nwaf_ban_captcha_path
nwaf_ban_captcha_url

Параметр, определяющий расположение страницы с капчей.

Пример:

nwaf_ban_captcha_path /captcha_path;

Для указания URL произвольной страницы с капчей в Интернете используется параметр nwaf_ban_captcha_url.

Пример:

nwaf_ban_captcha_url http://example.com/captcha_path;

Параметр имеет приоритет над nwaf_ban_captcha_path при их одновременном использовании.

Для корректной работы механизма разблокировки необходимо для определенного URL-адреса активировать параметр nwaf_captcha_unban. Использование одного экземпляра Nemesida WAF для защиты и веб-приложения, и страницы с капчей приведет к некорректной работе механизма разблокировки.

nwaf_ban_captcha_token

Секретный токен, который используется механизмом удаления IP-адреса из списка заблокированных при использовании капчи.

В качестве значения параметра принимается произвольная последовательность символов.

Пример:

nwaf_ban_captcha_token 01b307acba4f54f55aafc33bb06bbbf6ca803e9a;

После применения параметра его необходимо указать и в веб-приложении с капчей.

nwaf_mla

Настройки взаимодействия с модулем Nemesida AI MLA, где mla_score — опция порогового значения, при достижении которого решение о блокировке запроса передается в модуль Nemesida AI MLA.

Сигнатуры с пороговым значением, равным 12, блокируются без отправки в модуль Nemesida AI MLA.

В коммерческой версии Nemesida WAF параметр необходим для управления работой Nginx с помощью динамического модуля Nemesida WAF.

nwaf_rmq

Настройка подсистемы взаимодействия с RabbitMQ. Запросы, поступающие в динамический модуль Nemesida WAF, отправляются на хранение в локальный сервис RabbitMQ, откуда их забирает, для последующей обработки, модуль Nemesida AI MLC. Процесс получения данных модулем Nemesida AI MLC рекомендуется выполнять с использованием защищенного соединения.

Для этого внесите изменения в конфигурационный файл /etc/nginx/nginx.conf или /etc/rabbitmq/rabbitmq.conf на каждом сервере с установленным динамическим модулем.

Пример конфигурации для nginx.conf:

...
stream {
        server {
                listen 5673 ssl;
                proxy_pass 127.0.0.1:5672;
                ssl_certificate /etc/nginx/SSL/crt/example.ru.crt;
                ssl_certificate_key /etc/nginx/SSL/private/example.ru.key;
       }
}
...

Параметр listen 5673 ssl; задает порт, на котором сервер будет принимать запросы при защищенном соединении.

В целях безопасности рекомендуется разрешить доступ к серверу только с IP-адресов сервера, где установлен модуль Nemesida AI MLC, а используемые для защищенного соединения сертификаты должны быть доверенными для них.

nwaf_clamav

Активация механизма отправки тела POST и PUT-запросов в модуль ClamAV.

Для передачи только файлового содержимого из тела запроса с Content-Type: multipart/form-data используется опция FILE_ONLY.

Передача файлового содержимого тела PUT-запроса производится независимо от значения FILE_ONLY.

nwaf_clamav_wl

Настройка списка исключения блокировки для содержимого тела запроса или загружаемого файла по MD5-сумме (MD5-сумма содержится в журнале error.log Nginx).

Пример заблокированного запроса:
Nemesida WAF: blocked by ClamAV, stream: Eicar-Test-Signature FOUND, md5: 44d88612fea8a8f36de82e1278a-bb02f, ...

Пример правила исключения:

nwaf_clamav_wl 44d88612fea8a8f36de82e1278a-bb02f;
nwaf_geoip_db_path
Параметр, определяющий расположение файла с базой GeoIP2. Используется механизмом расширенных блокировок.

Пример:

nwaf_geoip_db_path /opt/geoip/GeoLite2-City.mmdb;

Файл доступен для загрузки на официальном сайте (база City). После распаковки архива файл с расширением .mmdb необходимо поместить в соответствующий каталог и предоставить веб-серверу Nginx доступ на чтение.

nwaf_log_mr_all
Активация параметра записи информации обо всех вхождениях правил блокировки (сигнатур атаки) в журнале ошибок работы Nginx. По умолчанию параметр деактивирован (закомментирован). При деактивированном параметре в журнал ошибок работы Nginx производится запись только сигнатуры, которая привела к блокированию запроса или к фиксации сигнатуры без последующего блокирования (в режиме LM).

При параметре nwaf_log_mr_all domain=example.com; запись зафиксированных вхождений будет производиться только для конкретного домена.
Для опции domain допускается использовать строгое соответствие и wildcard-значения: example.com, .example.com и *.example.com.

nwaf_captcha_unban*

Активация/деактивация механизма разблокировки IP-адреса с помощью капчи.

Пример:

nwaf_captcha_unban on;
nwaf_check_bot_name

Параметр служит для определения роботов поисковых систем. Заблокированные запросы, попадающие под действие параметра, не увеличивают значение счетчика rate и не могут привести к блокировке IP-адреса. Первое значение параметра определяется в зоне User-Agent. Второе значение параметра определяет имя хоста, полученное путем обратного преобразования IP-адреса. Если второе значение не задано, то оно считается равным первому.

Пример:

nwaf_check_bot_name "example.com" "example.net";
nwaf_check_bot_name "example.com";
nwaf_check_bot_name "bingbot" "msn.com";
nwaf_check_bot_name "yandex.ru";

* Активируется в настройках виртуального хоста.

Управление настройками с помощью веб-приложения и API
Для управления настройками настройками динамического модуля Nemesida WAF используйте один из методов, доступных для вашего тарифа:

LightBusinessEnterprise

Для настройки используйте облачное веб-приложение.

Для настройки используйте облачное веб-приложение и облачный API.

Для настройки используйте локальное веб-приложение и локальный API.

Настройки, производимые с помощью веб-приложения и обращений API (настройки, правила исключения (WL), расширенные правила блокировки (ERL), список IP-адресов для блокировки (BL) и список URL-адресов, отправляемых в модуль Nemesida AI MLA на анализ соответствия запроса его схеме в формате OpenAPI), хранятся в файлах директории /etc/nginx/nwaf/conf/global/db. Изменение содержимого файлов производится модулем Nemesida AI MLA, но Nginx также необходимо предоставить доступ на чтение к этой директории.

Работа Nemesida WAF в пассивном режиме
Для функционирования Nemesida WAF в пассивном режиме необходимо настроить дублирование трафика с основного веб-сервера (через который производятся обращения к веб-приложению) на сервер с установленным Nemesida WAF. Для этого внесите необходимые изменения в конфигурационные файлы на каждом из серверов:

1. На основном сервере (без установленного модуля Nemesida WAF) настройте зеркалирование трафика согласно руководству установленного веб-сервера (Nginx, Apache2, Microsoft IIS и прочие).

Пример настройки Nginx для зеркалирования трафика

В случае использования веб-сервера Nginx внесите необходимые изменения в файл виртуального хоста:

upstream mirror_upstream {
        server nemesida_waf_server:port;
        server 127.0.0.1:88 backup;

}

server {
        listen  127.0.0.1:88 default_server;
        return 200 "Response code: 200";
        add_header Content-Type text/plain;
        access_log off;
}
server {
        ...
        location / {
                mirror /mirror;
                root /var/www/html;
                proxy_pass      http://mirror_upstream;
                include         proxy_params;
        }

        location = /mirror {
                   internal;
                   proxy_pass http://mirror_upstream$request_uri;
                   proxy_connect_timeout 10s;
                   proxy_send_timeout 10s;
                   proxy_read_timeout 15s;
    }

}

nemesida_waf_server — адрес сервера с установленным модулем Nemesida WAF, на который будет передаваться дублированный трафик.

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 на каждом из серверов.

Работа Nemesida WAF в режиме обратного прокси

Для использования веб-сервера с установленным Nginx и Nemesida WAF в качестве промежуточного сервера необходимо создать соответствующий файл виртуального хоста (например, /etc/nginx/conf.d/example.com.conf).

Пример файла виртуального хоста
server {
        server_name  site.example.com;
        listen 80;

        location / {
                proxy_pass http://x.x.x.x;
        }
}

где x.x.x.x — адрес конечного (целевого) сервера с веб-приложением.

Более подробная информация доступна на странице официальной документации Nginx.

Управление сигнатурами и виртуальный патчинг

Для создания правил исключения (WL) и блокировки (ERL) воспользуйтесь облачным, локальным веб-приложением или API.

Виртуальный патчинг

Виртуальный патчинг Nemesida WAF защищает сайты от существующих неисправленных уязвимостей (в том числе «нулевого дня»), блокируя попытки их эксплуатации, при этом не нарушая работу веб-приложения. Применение правил виртуального патчинга позволяет разработчикам сосредоточиться на исправлении уязвимостей без необходимости срочного изменения кода. Виртуальный патчинг позволяет «на лету» блокировать все попытки эксплуатации известной уязвимости, особым образом контролируя зону атаки.

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

Статусы обработки запроса (BT)

Каждому запросу, поступающему на анализ в модуль Nemesida WAF, присваивается идентификатор блокировки (BT — blocking type). Идентификатор может присваиваться независимо от того, был ли заблокирован запрос.

В сводной таблице представлены типы идентификаторов и соответствующий им статус обработки запросов.

0 Запрос не был заблокирован.
1 Запрос заблокирован сигнатурным методом, при этом запрос не содержал ни одной сигнатуры со score = 12.
2 Запрос заблокирован сигнатурным методом, при этом в запросе содержалась сигнатура, имеющая score = 12.
3 Запрос заблокирован модулем Nemesida AI MLA.
4 Запрос заблокирован модулем ClamAV.
5 Запрос заблокирован вследствие внутренней ошибки.
6 Запрос заблокирован вследствие превышения лимита заблокированных запросов с одного IP-адреса.
7 Запрос определен как попытка перебора (brute-force) и заблокирован модулем Nemesida AI MLC.
8 Запрос заблокирован модулем Nemesida AI MLC (дополнительный анализ трафика всех незаблокированных модулем Nemesida WAF запросов) и управляется параметром ai_extra в файле mlc.conf.
9 Запрос определен как попытка флуда (flood) и заблокирован модулем Nemesida AI MLC.
10 Запрос определен как атака «отказ в обслуживании» и заблокирован модулем Nemesida AI MLC.
14 Формат запроса не соответствует заданной схеме.

Для событий BT 1, 2, 3, 4, 8 параметр nwaf_limit файла nwaf.conf позволяет регулировать допустимое количество заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate, IP-адрес будет заблокирован на время (в секундах), указанное в block_time.

Для событий BT 7, 9, 10 блокирование IP-адреса источника запросов будет происходить после первого заблокированного запроса, независимо от значения параметра rate в nwaf_limit.

Дополнительные заголовки Nginx

Дополнительный заголовок $nwaf_block_type

Nemesida WAF позволяет использовать специальный заголовок, определяющий результат обработки запроса. Для его активации необходимо добавить параметр 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

Nemesida WAF позволяет использовать специальный заголовок, определяющий результат блокировки запроса по стране с помощью функционала расширенного правила блокировки запросов. Для его активации необходимо добавить параметр 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.

Разблокирование IP-адреса с использованием капчи
При выявлении подозрительной активности Nemesida WAF позволяет заблокировать IP-адрес источника запросов на определенное время (длительность блокировки регулируется опцией 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;
             ...
    }
    ...
}

Также необходимо настроить веб-приложение с капчей. С подробной инструкцией по интеграции Nemesida WAF 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
После установки пакета Nemesida WAF функционал взаимодействия с ПО ClamAV по умолчанию выключен, поскольку в редких случаях может являться источником ложных срабатываний некоторых запросов к веб-приложению (в зависимости от текущего состояния базы сигнатурного анализа ClamAV). Используйте данный функционал по своему усмотрению.

Для активации антивирусной защиты установите ПО ClamAV на сервер с настроенным ПО Nemesida WAF, если это не было сделано ранее.

Пример установки для 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.