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

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

DebianUbuntuCentOSDockerVirtual Appliance
# apt install apt-transport-https gnupg2
Debian 9
# echo "deb https://nemesida-security.com/repo/nw/debian stretch non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
Debian 10
# echo "deb https://nemesida-security.com/repo/nw/debian buster non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
Debian 11
# echo "deb https://nemesida-security.com/repo/nw/debian bullseye 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
# apt install apt-transport-https gnupg2
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
Информация об использовании Nemesida WAF в Docker-контейнере доступна в соответствующем разделе.
Информация об использовании Nemesida WAF в виде Virtual Appliance (виртуальный диск для KVM/VMware/VirtualBox) и Yandex VM доступна в соответствующем разделе.

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

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

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

Установка

DebianUbuntuCentOS

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

# rm -f /etc/machine-id
# /bin/systemd-machine-id-setup
Debian 9
Подключите репозиторий Nginx:

# echo "deb http://nginx.org/packages/debian/ stretch nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -

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

# apt update && apt upgrade
# apt install nginx python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc rabbitmq-server libmaxminddb0 g++ memcached
Debian 10
Подключите репозиторий Nginx:

# 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 -

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

# apt update && apt upgrade
# apt install nginx python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc rabbitmq-server libmaxminddb0 g++ memcached
Debian 11
Подключите репозиторий Nginx:

# echo "deb http://nginx.org/packages/debian/ bullseye nginx" > /etc/apt/sources.list.d/nginx.list
# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add -

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

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

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

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

# rm -f /etc/machine-id
# /bin/systemd-machine-id-setup
Ubuntu 18.04
Подключите репозиторий Nginx:

# 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 -

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

# apt update && apt upgrade
# apt install nginx python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc rabbitmq-server libmaxminddb0 g++ memcached
Ubuntu 20.04
Подключите репозиторий Nginx:

# 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 -

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

# apt update && apt upgrade
# apt install nginx python3 python3-venv python3-pip python3-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc rabbitmq-server libmaxminddb0 g++ memcached
Ubuntu 22.04
Подключите репозиторий Nginx:

# 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 

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

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

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

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

# rm -f /etc/machine-id
# /bin/systemd-machine-id-setup

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

Подключите репозиторий 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 python36 python36-devel python36-setuptools python36-pip openssl librabbitmq libcurl-devel rabbitmq-server gcc libmaxminddb memcached
# yum install nwaf-dyn-1.18

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

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

# dnf install dnf-utils

Добавьте репозиторий 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 rabbitmq-server

Проверьте корректность работы сервиса:

# systemctl enable rabbitmq-server
# service rabbitmq-server restart
# service rabbitmq-server status

Добавьте репозиторий 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 python39 python39-devel python39-setuptools python39-pip openssl librabbitmq libcurl-devel gcc libmaxminddb memcached
# dnf install nwaf-dyn-1.18

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

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

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

Для директории nwaf/conf/db необходимо предоставить разрешение на запись/чтение для пользователя, от имени которого запущен Nginx.

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

После установки модуля необходимо произвести первичную настройку, указав следующие параметры:

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

[Nemesida WAF]
Секция, отвечающая за общие настройки динамического модуля Nemesida WAF. Для настройки модуля внесите необходимые изменения в основной конфигурационный файл /etc/nginx/nwaf/conf/global/nwaf.conf.
nwaf_license_key

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

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

nwaf_sys_proxy
Параметр определяет адрес прокси-сервера для обращения к nw-auth-extra.nemesida-security.com:443 (проверка лицензионного ключа) и nemesida-security.com:443 (получение сигнатур, загрузка списка виртуальных хостов и загрузка поведенческих моделей).

Пример:

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

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

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

Пример:

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 AI MLA]
Секция, отвечающая за общие настройки модуля Nemesida AI MLA. Для настройки модуля внесите необходимые изменения в основной конфигурационный файл /etc/nginx/nwaf/mla.conf.
st_enable
Отправка спорных запросов на сервер Nemesida WAF Signtest для последующей обработки.

Спорные запросы определяются следующим образом:
— если сигнатурный анализ определил запрос как нелегитимный, а модуль Nemesida AI MLA определил как легитимный;
— если сигнатурный анализ определил запрос как легитимный, а модуль Nemesida AI MLA определил как нелегитимный.

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

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

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

# 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.

Настройка

Функционал облачного управления настройками включен по умолчанию, но его можно отключить, направив запрос на электронную почту.

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

Для корректной работы модуля рекомендуем разрешить обращения к портам: 80 (Nginx), 5101 (Nemesida AI MLA), 8080 (Nemesida WAF API), 5672 (RabbitMQ), 11211 (Memecache).

Управление настройками с помощью облачного веб-приложения и облачного API

Информация о настройке динамического модуля c использованием облачного веб-приложения и облачного API доступна в соответствующих разделах.

Управление настройками с использованием конфигурационных файлов

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

Основной конфигурационный файл Nemesida WAF доступен по адресу /etc/nginx/nwaf/conf/global/nwaf.conf. Файл /etc/nginx/nwaf/conf/global/nwaf-example.conf содержит полный перечень доступных параметров.

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

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

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

nwaf_sys_proxy
Параметр определяет адрес прокси-сервера для обращения к nw-auth-extra.nemesida-security.com:443 (проверка лицензионного ключа) и nemesida-security.com:443 (получение сигнатур, загрузка списка виртуальных хостов и загрузка поведенческих моделей).

Пример:

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

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

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

Пример:

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 передаваться не будут.

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_limit

Устанавливает лимит заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate, IP-адрес будет заблокирован на время (в секундах), указанное в block_time.

Пример:

nwaf_limit rate=5r/m block_time=600;

Для установки лимита заблокированных запросов для конкретного домена необходимо привести параметр к виду: nwaf_limit rate=... block_time=... domain=...;

Пример:

nwaf_limit rate=5r/m block_time=600 domain=example.com;

Для параметра domain допускается использовать строгое соответствие и wildcard-значения: *, example.com, .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_sync_ban_ip_key*

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

Пример:

nwaf_sync_ban_ip_key 1234567890abcdef;
nwaf_sync_ban_ip_host*

Параметр определяет URL для получения списка заблокированных IP-адресов и период его опроса. Период опроса должен быть идентичен на всех синхронизируемых экземплярах Nemesida WAF.

Пример:

nwaf_sync_ban_ip_host srv1.example.com/ban_ip_sync_path 15;
nwaf_sync_ban_ip_host srv2.example.com/ban_ip_sync_path 15;

После завершения настроек необходимо определить путь с установленным параметром nwaf_ban_ip_sync on; в файле виртуального хоста в секции location для получения списка заблокированных адресов, например:

location /ban_ip_sync_path {
         ...
         nwaf_ban_ip_sync on;
         ...
}

В целях безопасности рекомендуется ограничить обращения к URL с установленным параметром nwaf_ban_ip_sync on; списком разрешенных IP-адресов.

Для IP-адресов с остаточным временем блокировки менее 60 секунд синхронизация не проводится.

nwaf_mla*

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

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

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

nwaf_mla_host_lm*

Параметр, активирующий режим LM (IDS) для запросов, определенных модулем Nemesida AI MLA как нелегитимные.

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

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

nwaf_mla_host_lm *;
nwaf_mla_host_lm example.com;
nwaf_mla_host_lm *.example.com;

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

nwaf_mla_host_lm example.com, a.example.com;
nwaf_mla_host_lm example.com, *.example.com;
nwaf_rmq_host_exclude*

Параметр, исключающий отправку некоторых запросов на сервер RabbitMQ (очередь nwaf).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос не передается в очередь nwaf, и, соотвественно, не обрабатывается модулем Nemesida AI MLC (не анализируется на предмет аномалий и атак методом перебора, не участвует при построении поведенческих моделей).

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

nwaf_rmq_host_exclude *;
nwaf_rmq_host_exclude example.com;
nwaf_rmq_host_exclude *.example.com;

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

nwaf_rmq_host_exclude example.com, a.example.com;
nwaf_rmq_host_exclude example.com, *.example.com;
nwaf_ai_extra_host_lm*

Параметр, активирующий режим LM (IDS) для запросов, определенных модулем Nemesida AI MLC как нелегитимные.

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

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

nwaf_ai_extra_host_lm *;
nwaf_ai_extra_host_lm example.com;
nwaf_ai_extra_host_lm *.example.com;

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

nwaf_ai_extra_host_lm example.com, a.example.com;
nwaf_ai_extra_host_lm example.com, *.example.com;
nwaf_ai_extra_host_wl*

Параметр, активирующий режим WL для запросов, определенных модулем Nemesida AI MLC как нелегитимные.

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос не фиксируется в СУБД и не блокируется.

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

nwaf_ai_extra_host_wl *;
nwaf_ai_extra_host_wl example.com;
nwaf_ai_extra_host_wl *.example.com;

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

nwaf_ai_extra_host_wl example.com, a.example.com;
nwaf_ai_extra_host_wl example.com, *.example.com;
nwaf_bf_detect_host_lm*

Параметр, активирующий режим LM для запросов, определенных модулем Nemesida AI MLC как атаки методом перебора (BT 7) или флуд (BT 9).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

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

nwaf_bf_detect_host_lm *;
nwaf_bf_detect_host_lm .example.com;
nwaf_bf_detect_host_lm *.example.com;

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

nwaf_bf_detect_host_lm example.com, example.org;
nwaf_ddos_detect_host_lm*

Параметр, активирующий режим LM для запросов, определенных модулем Nemesida AI MLC как DDoS-атаки (BT 10).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

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

nwaf_ddos_detect_host_lm *;
nwaf_ddos_detect_host_lm .example.com;
nwaf_ddos_detect_host_lm *.example.com;

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

nwaf_ddos_detect_host_lm example.com, example.org;
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_ip_wl

Деактивация механизма анализа запроса средствами Nemesida WAF для конкретного IP-адреса или подсети.

Пример:

nwaf_ip_wl x.x.x.x;

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

Пример:

nwaf_ip_wl domain=example.com 127.0.0.1, 192.168.61.0/24, 192.168.61.1-192.168.61.255;

Для снижения количества ложных срабатываний рекомендуется указывать статический IP-адрес пользователей (администраторов, контент-менеджеров, редакторов) в параметре nwaf_ip_wl. Запросы, попадающие под действие параметра не будут блокироваться, передаваться в RabbitMQ, и, как результат, анализироваться модулем Nemesida AI. При использовании параметра будьте предельно осторожны.

Допускается использование IPv6 и IPv4-адресов.

nwaf_host_wl

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

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

nwaf_host_wl *;
nwaf_host_wl example.com;
nwaf_host_wl *.example.com;

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

nwaf_host_wl example.com, a.example.com;
nwaf_host_wl example.com, *.example.com;
nwaf_ip_lm

Настройка обработки запросов для конкретного IP-адреса или подсети с фиксацией в СУБД, но без фактической блокировки (режим IDS).

Пример:

nwaf_ip_lm x.x.x.x;

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

Пример:

nwaf_ip_lm domain=example.com 127.0.0.1, 192.168.61.0/24, 192.168.61.1-192.168.61.255;

Допускается использование IPv6 и IPv4-адресов.

nwaf_host_lm

Настройка обработки запросов для конкретного виртуального хоста с фиксацией в СУБД, но без фактичсекой блокировки (режим IDS). При параметре nwaf_host_lm *; пропуск будет производиться для всех виртуальных хостов.

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

nwaf_host_lm *;
nwaf_host_lm example.com;
nwaf_host_lm *.example.com;

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

nwaf_host_lm example.com, a.example.com;
nwaf_host_lm example.com, *.example.com;
nwaf_put_body_exclude

Параметр, исключающий анализ сигнатурным методом содержимого зоны BODY для PUT-запросов, а также отправку содержимого зоны в модули Nemesida AI MLA и Nemesida AI MLC. Опция полезна при взаимодействии с веб-приложениями ownCloud или аналогичными, позволяющими клиенту производить загрузку файла на сервер по протоколу HTTP.

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

nwaf_put_body_exclude *;
nwaf_put_body_exclude example.com;
nwaf_put_body_exclude *.example.com;

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

nwaf_put_body_exclude example.com, a.example.com;
nwaf_put_body_exclude example.com, *.example.com;
nwaf_body_exclude

Параметр, исключающий анализ сигнатурным методом зоны BODY, а также отправку её содержимого в модули Nemesida AI MLA и Nemesida AI MLC. Опция полезна, если нет возможности изменить значение параметра client_body_buffer_size в файле /etc/nginx/nginx.conf.

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

nwaf_body_exclude *;
nwaf_body_exclude example.com/uploads.php;
nwaf_body_exclude example.com/uploads;

При применении параметра учитывается точное совпадение пути (vhost/path).

Например, при значении: example.com/uploads исключение анализа зоны BODY будет применяться для запросов к example.com/uploads, но для example.com/uploads.php и example.com/uploads/index.php параметр применен не будет. При значении * исключение анализа зоны BODY будет применяться для любого адреса.

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";

* Не используется в Nemesida WAF Free.
** Активируется в настройках виртуального хоста.

Особенности режима LM
Запрос, попадающий под действие параметров nwaf_ip_lm, nwaf_host_lm или LM и имеющий BT 0 (статус обработки запроса), не блокируется, но добавляется в обучающую выборку.

Запрос, попадающий под действие сигнатуры со score (цифровым показателем значимости), равным 12, в режиме LM будет передаваться в модуль Nemesida WAF API, а также в другие подсистемы анализа запросов, кроме мордуля Nemesida AI MLA. Для передачи запроса в модуль Nemesida AI MLA суммарный показатель score для запроса должен превышать значение параметра mla_score. Показатели сигнатур со score равным 12 не суммируются.

Если запрос со score, равным 12, не попадает под действие режима LM, то будет произведена блокировка запроса сигнатурным анализом с передачей в модуль Nemesida WAF API, но без обработки другими подсистемами анализа запросов.

Nemesida AI MLA

Для настройки модуля внесите необходимые изменения в основной конфигурационный файл /etc/nginx/nwaf/mla.conf.

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

tcp_socket
Адрес подключения к модулю Nemesida AI MLA.
debug
Активация/деактивация режима отладки.
st_enable
Отправка спорных запросов на сервер Nemesida WAF Signtest для последующей обработки.

Спорные запросы определяются следующим образом:
— если сигнатурный анализ определил запрос как нелегитимный, а модуль Nemesida AI MLA определил как легитимный;
— если сигнатурный анализ определил запрос как легитимный, а модуль Nemesida AI MLA определил как нелегитимный.

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

Модуль Nemesida AI MLA загружает модели в соответствии со списком, полученным из модуля Nemesida AI MLC (параметр vhosts_list файла mlc.conf).

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

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

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

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

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

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

location / {
    mirror /mirror;
    ...
}

location = /mirror {
    internal;
    proxy_pass http://nemesida_waf_server$request_uri;
}

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

2. На сервере с установленным модулем Nemesida WAF приведите конфигурационный файл виртуального хоста Nginx к виду:

server {
        listen  80;
        index   index.html;
        root    /var/www/html;
        try_files $uri $uri/ /index.html;
}

3. На сервере с установленным модулем Nemesida WAF создайте директорию /var/www/html и разместите в ней пустой файл index.html.

4. На сервере с установленным модулем Nemesida WAF приведите файл /etc/nginx/nwaf/conf/global/nwaf.conf к виду:

...
nwaf_limit rate=5r/m block_time=0;
...

5. Для получения информации от основного веб-сервера об исходном 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.

6. После внесения изменений необходимо перезапустить 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://192.168.0.1;
        }
}

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

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

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

В Nemesida WAF и Nemesida WAF Free реализован функционал поддержки пользовательского набора правил для выявления атак: сигнатур (RL), а также их исключений (WL).

Создание правил исключения можно выполнить также при помощи облачного веб-приложения и облачного API.

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

Зоны и уточнения

При создании RL или WL правил могут быть использованы специальные параметры:

  • зоны: URL, ARGS, BODY, HEADERS, Cookie, User-Agent, Content-Type и т. д.;
  • условия применения правила (уточнение зоны, конкретизация): $URL, $ARGS, $BODY, $HEADERS, $Cookie, $User-Agent и т. д.

Использование зон и уточнений позволяет максимально конкретизировать создаваемое правило. Уточнения задаются путем добавления префикса $ (например: "Z:...|$URL:...").

Пример использования правила с зоной и уточнением: WL ... "Z:ARGS|$URL:/123"; — правило сработает, если зоной вхождения правила RL будет зона ARGS и URL содержит вхождение /123.

Несколько параметров (зоны, уточнения) в одном правиле должны разделяться символом |, при этом будет использоваться следующий принцип взаимодействия:

  • зоны взаимодействуют между собой по принципу логического ИЛИ, например: Z:URL|ARGS;
  • зоны взаимодействуют с уточнениями по принципу логического И, например: Z:URL|$ARGS:123;
  • уточнения взаимодействуют между собой по принципу логического И, например: Z:...|$ARGS:123|$BODY:123".

При использовании в уточнении | в качестве обычного символа необходимо произвести его одиночное экранирование. Например: $URL:abc\|d — поиск вхождения abc|d.

Регулярные выражения в уточнениях

При уточнении допускается использование регулярных выражений. Для этого необходимо к уточнению добавить постфикс _X (например: "Z:...|$URL_X:\w+").

Для использования в правиле операторов регулярных выражений (/, |, ., *, ?, !, {, }, [, ], (, ), ^, $, :, \ и т. д.) в качестве обычных символов необходимо производить их двойное экранирование.

Пример:

  • $BODY_X:block\\|page – поиск вхождения block|page;
  • $BODY_X:data=\\(block-\\\a\\\-in-the-main\\) – поиск вхождения data=(block-\a\-in-the-main);
  • $ACCEPT_X:image\\/webp\\\\\* – поиск вхождения image/webp\* в заголовке Accept.

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

Пример:
Правило WL ... "Z:...|$URL_X:/(a\\|b)/"; будет применяться к URL, который содержит /a/ или /b/.

Создание персональных сигнатур

Персональные правила определения признака атаки необходимо хранить в основном конфигурационном файле Nemesida WAF (/etc/nginx/nwaf/conf/global/nwaf.conf). Они должны определяться параметром RL, иметь ID в диапазоне от 50000 до 99999 и принимать следующий вид:

RL ID:50000 "P:select from" "SC:SQL:12" "Z:ARGS";
RL ID:50001 domain=example.com "P:select from" "SC:SQL:12" "Z:ARGS";
RL ID:50002 domain=.example.com "P:select from" "SC:SQL:12" "Z:ARGS";
RL ID:50003 domain=*.example.com "P:select from" "SC:SQL:12" "Z:ARGS";
RL ID:50004 "PX:select\s+from" "SC:SQL:12" "Z:ARGS|$URL:/admin";
RL ID:50005 "P:select from" "SC:SQL:12" "Z:ARGS|$URL_X:/(admin\\|dev)";

Для сигнатур в области зоны допускается использование значения MLA для принудительной отправки запроса в Nemesida AI MLA, попадающего под действие созданной сигнатуры запроса, если score < 12 (по умолчанию в Nemesida AI MLA направляются запросы со score равным или превышающим значение параметра mla_score).

Примеры сигнатур для принудительной отправки в Nemesida AI MLA

Запрос, содержащий вхождение select from в любой из четырех зон, будет направлен в Nemesida AI MLA:

RL ID:50005 "P:select from" "SC:SQL:1" "Z:MLA";

Запрос, содержащий вхождение select from в зоне ARGS, будет направлен в Nemesida AI MLA:

RL ID:50006 "P:select from" "SC:SQL:1" "Z:ARGS|MLA";
Опции создаваемых сигнатур
ID
Уникальный идентификатор правила. Для создания собственных правил доступен диапазон от 50000 до 99999. Обязательный параметр.
domain
Установка принадлежности правила к домену. Для опции domain допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.
P/PX
Опция, определяющая шаблон вхождения сигнатуры (опция P используется для обозначения простого вхождения, опция PX — регулярного выражения). Обязательный параметр.
SC
Установка тега правила (Injection, XSS, UWA, Scanner, Evasion, Other или другого) и цифрового показателя значимости (score, от 1 до 12). Обязательный параметр.

Запросы, попадающие под действие правил со значением показателя, равным 12, блокируются без отправки в другие подсистемы анализа. Более подробная информация доступна в соответствующем разделе. Суммирование цифровых показателей для принятия решения производится в каждой отдельной зоне по идентичным тегам.

Z

Зона применения правила. Для применения сигнатуры ко всем зонам используйте пустой параметр "Z:". Обязательный параметр.

Для применения сигнатуры к нескольким зонам используйте разделитель: "Z:URL|BODY".

Для принудительной отправки запроса в модуль Nemesida AI MLA используйте значение MLA в зоне применения правил ("Z:MLA"), при этом цифровой показатель значимости (SC) должен быть менее 12.

Для отключения отправки запроса в модуль Nemesida AI MLA используйте значение NoMLA в зоне применения правил ("Z:NoMLA").

Для отключения блокирования IP-адреса из-за вхождения сигнатуры, имеющей score = 12, используйте значение NoBan в зоне применения правил (“Z:NoBan”). Вхождение сигнатуры с такой зоной не уменьшает счетчик nwaf_limit, то есть не приводит к блокированию IP-адреса.

Для конкретизации зоны можно использовать дополнительные опции. Для "Z:ARGS|$URL:/templates" правило сработает только в зоне ARGS с параметром /templates в URL.

Для сигнатур в области зоны допускается использование значения NoAPI для отключения отправки сообщения в Nemesida WAF API, попадающего под действие созданной сигнатуры запроса, если score = 12. Для всех срабатываний этой сигнатуры не будет производиться отправка сообщения на Nemesida WAF API, но будет производиться блокировка и запись в файл журнала.
Для сигнатур с другим score данное значение игнорируется.

RL ID:50001 "P:select from" "SC:SQL:12" "Z:ARGS|URL|BODY|NoAPI";

Для сигнатур в области зоны допускается использование значения LM для включения режима LM, попадающего под действие созданной сигнатуры запроса, если score = 12. Для всех срабатываний этой сигнатуры не будет производиться блокировка сообщения на Nemesida WAF API, но будет производиться отправка и запись в файл журнала.
Для сигнатур с другим score данное значение игнорируется.

RL ID:50002 "P:select from" "SC:SQL:12" "Z:ARGS|URL|BODY|LM";

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

Создание правил исключения сигнатуры

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

Nemesida WAF: the request ххх contains a rule id 1 in zone HEADERS, ...

или, если запрос содержит сигнатуру с предельно допустимым цифровым показателем значимости (score = 12):

Nemesida WAF: the request ххх blocked by rule id 1 in zone HEADERS, ...

где:

  • 1 — ID сигнатуры атаки;
  • HEADERS — зона вхождения сигнатуры.

Для вывода абсолютно всех вхождений сигнатур в запросе (при наличии вхождений), в том числе тех вхождений, которые не привели к последующему блокированию запроса, активируйте параметр nwaf_log_mr_all; в файле nwaf.conf.

Информация о составе текущего набора сигнатур доступна на странице rlinfo.nemesida-security.com.

Примеры создания правил исключения сигнатуры атаки

WL ID:1 "Z:"; — при таких параметрах вхождение сигнатуры с идентификатором 1 будет исключено из всех зон для всех виртуальных хостов.

WL ID:1 "Z:ARGS|HEADERS"; — при таких параметрах вхождение сигнатуры с идентификатором 1 будет исключено из зон ARGS и HEADERS для всех виртуальных хостов.

WL ID:1 "Z:ARGS|Cookie"; — при таких параметрах вхождение сигнатуры с идентификатором 1 будет исключено из зоны ARGS и Cookie для всех виртуальных хостов.

WL ID:1 domain=.example.com "Z:URL"; — при таких параметрах вхождение сигнатуры с идентификатором 1 будет исключено из зоны URL для виртуального хоста example.com и его поддоменов.

WL ID:1 domain=example.com "Z:URL|$URL:/index/index.php"; — при таких параметрах вхождение сигнатуры с идентификатором 1 будет исключено из зоны URL для виртуального хоста example.com для URI http://example.com/index/index.php.

WL ID:* domain=example.com "Z:ARGS"; — при таких параметрах зона ARGS всех запросов к виртуальному хосту example.com будет исключена из обработки сигнатурным анализом.

WL ID:* domain=example.com "Z:$URL:/test"; — при таких параметрах все обращения к example.com/test будут исключены из обработки сигнатурным анализом.

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

Перевод правил блокировки в режим LM

Запросы, попадающие под действие режима LM, фиксируются в БД, но не блокируются. При срабатывании правила в журнал ошибок Nginx и на Nemesida WAF API будет отправлено сообщение о переводе соответствующего правила блокировки в LM режим, но запрос не будет заблокирован. Правила перевода в режим LM должны определяться параметром LM, иметь ID соответствующего правила блокировки и принимать следующий вид:

Примеры создания правил перевода в режим LM
LM ID:1 "Z:URL"; — при таких параметрах запросы с вхождением сигнатуры с идентификатором 1 в зоне URL будут переведены в режим LM;

LM ID:50001 "Z:URL"; — при таких параметрах запросы с вхождением персональной сигнатуры с идентификатором 50001 в зоне URL будут переведены в режим LM;

LM ID:50002 domain=example.com "Z:URL"; — при таких параметрах запросы с вхождением персональной сигнатуры с идентификатором 50002 в зоне URL будут переведены в режим LM для виртуального хоста example.com;

LM ID:50003 domain=*.example.com "Z:ARGS"; — при таких параметрах запросы с вхождением персональной сигнатуры с идентификатором 50003 в зоне ARGS будут переведены в режим LM для всех поддоменов виртуального хоста example.com, исключая основной домен;

LM ID:50004 domain=example.com "Z:BODY|$URL:/edit" — при таких параметрах запросы для виртуального хоста example.com будут переведены в режим LM, если вхождение персональной сигнатуры с идентификатором 50004 произойдет в зоне BODY и зона URL содержит /edit;

LM ID:50005 domain=example.com "Z:BODY|$URL_X:^/edit" — при таких параметрах запросы для виртуального хоста example.com будут переведены в режим LM, если вхождение персональной сигнатуры с идентификатором 50005 произойдет в зоне BODY и зона URL начинается с /edit;

LM ID:50006 domain=*.example.com "Z:BODY|$ARGS:test=123" — при таких параметрах запросы для всех поддоменов виртуального хоста example.com, исключая основной домен, будут переведены в режим LM, если вхождение персональной сигнатуры с идентификатором 50006 произойдет в зоне BODY и зона ARGS содержит /edit.

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

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

В Nemesida WAF используется два источника генерации виртуальных патчей: автоматически, модулем Nemesida AI, и вручную, путем создания правил сигнатур.

Пример использования
В веб-приложении example.com выявлена уязвимость внедрения SQL, используя GET-параметр id. В качестве аргументов параметр должен принимать только числовые значения, а значит, для блокирования попыток эксплуатации необходимо ограничить использование других символов. Для этого создадим персональную сигнатуру, которая на основе регулярного выражения:

RL ID:50001 domain=example.com "PX:id=[^\d+]" "Z:ARGS";

Статусы обработки запроса (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.

Для событий 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.