Community Edition | Немезида ВАФ

Некоммерческая версия Немезида ВАФ обеспечивает базовую защиту веб-приложения от атак класса OWASP на основе сигнатурного анализа. Немезида ВАФ Комьюнити имеет собственную базу сигнатур, выявляет атаки на веб-приложения при минимальном количестве ложных срабатываний, обновляется из Linux-репозиториев, устанавливается и настраивается за несколько минут.

Немезида ВАФ Комьюнити

Особенности

  • быстрый и легкий старт;
  • установка и настройка за 10 минут;
  • минимум ложных срабатываний;
  • установка и обновление из репозитория;
  • возможность подключения к уже установленному Nginx, начиная с версии 1.16;
  • удобный личный кабинет, возможность интегрировать с SIEM-системами.

Основное ограничение некоммерческой версии Немезида ВАФ затрагивает работу механизмов нормализации данных (например, Base64/HTML Entity/UTF-16 декодирование) и модуля машинного обучения Nemesida AI, который позволяет более точно и с ультра-низким количеством ложных срабатываний выявлять атаки на веб-приложения (включая экплуатацию уязвимостей «нулевого дня»). Также недоступно использование сканера уязвимостей Nemesida WAF Scanner.

Чтобы наглядно понять разницу между сигнатурным анализом и машинным обучением, можно воспользоваться бесплатным инструментом WAF Bypass Tool, суть работы которого заключается в оценке уровня защищенности веб-приложения.

Инструмент отправляет более 2000 запросов с различными полезными нагрузками к веб-приложению, защищенному WAF, и собирает статистику, которую отображает в виде таблицы результатов.


Результат тестирования Немезида ВАФ с применением только сигнатурного анализа (сверху) и с применением машинного обучения (снизу)

В таблицах выше наглядно показано, как применение машинного обучения увеличивает точность выявления атак. Применение только сигнатурного метода выявления атак позволяет заблокировать 46.62% атак, а использование машинного обучения увеличивает этот показатель до 99.66%.

Кроме этого, некоммерческая версия Немезида ВАФ производит модификацию содержимого сообщений об атаках при отправке в Nemesida WAF API:

  • в поле vhost устанавливается значение example.com;
  • в поле referer устанавливается значение Nemesida WAF Community Edition;
  • в непустом поле other_headers устанавливается значение Nemesida WAF Community Edition;
  • в поле WAF ID устанавливается значение COMMUNITYEDITION.

Установка

Настройка веб-сервера

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

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

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

# apt update && apt upgrade
# apt install apt-transport-https gnupg2 curl

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

Debian 11
# echo "deb http://nginx.org/packages/debian/ bullseye nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/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
Debian 12
# echo "deb http://nginx.org/packages/debian/ bookworm nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/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

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

# apt install nginx
Установите пакеты:

# apt update && apt upgrade
# apt install apt-transport-https gnupg2 curl

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

Ubuntu 20.04
# echo "deb http://nginx.org/packages/ubuntu/ focal nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/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
Ubuntu 22.04
# echo "deb http://nginx.org/packages/ubuntu/ jammy nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/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
Ubuntu 24.04
# echo "deb http://nginx.org/packages/ubuntu/ noble nginx" > /etc/apt/sources.list.d/nginx.list
# curl -s https://nginx.org/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

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

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

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

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

# dnf update
# dnf install nginx

Установка компонента

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

В случае проведения мероприятий, направленных на конфигурацию ОС для обеспечения ее безопасности (например, на основе рекомендаций CIS Benchmarks), перед установкой пакета необходимо удалить флаги безопасности rw, nosuid, noexec, nodev для директории /tmp, где хранятся временные файлы, используемые при установке.

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

  • Nginx stable, начиная с 1.16;
  • Nginx mainline, начиная с 1.19;
  • Nginx Plus, начиная с R26.

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

# rm -f /etc/machine-id
# /bin/systemd-machine-id-setup
Автоматическая установкаDebianUbuntuRHELDockerYandex Cloud VM

1. Загрузите скрипт;

2. Запустите скрипт установки командой:

# /bin/bash ./4-filtering-node-deploy.sh 'nwaf_lic_key=%Licence key%' 'api_url=%Nemesida WAF API URL%' 'sys_proxy=%Proxy server address%' 'api_proxy=%Proxy server address%'

где:

  • nwaf_lic_key — лицензионный ключ;
  • api_url — адрес сервера с которого будут производиться обращения компонента Nemesida WAF API после его настройки (например, http://api.example.com:8080/nw-api/);
  • sys_proxy — (Опционально) IP-адрес прокси сервера для доступа компонента к внешним ресурсам (например, http://proxy.example.com:3128);
  • api_proxy — (Опционально) IP-адрес прокси сервера для взаимодействия с Nemesida WAF API (например, http://proxy.example.com:3128).
Подключите репозиторий Немезида ВАФ:

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
Debian 12
# echo "deb https://nemesida-security.com/repo/nw/debian bookworm nwaf" > /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 install python3 python3-venv python3-pip python3-dev python3-setuptools librabbitmq4 libcurl3-gnutls libcurl4-openssl-dev libc6-dev gcc g++ memcached rabbitmq-server

Nginx:

# apt install nwaf-dyn-1.26

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

Angie:

# apt install nwaf-angie-1.7.0

где 1.7.0 — версия установленного Angie.

Во время установки модуля дополнительно устанавливаются следующие 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 jsonref fastapi uvicorn[standard] gunicorn python-multipart pyarrow

Подключите репозиторий Немезида ВАФ и установите пакеты:

Ubuntu 20.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu focal 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 install python3.9 python3.9-venv python3-pip python3.9-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc g++ memcached rabbitmq-server
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 install python3 python3-venv python3-pip python3-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc g++ memcached rabbitmq-server
Ubuntu 24.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu noble nwaf" > /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 install python3 python3-venv python3-pip python3-dev python3-setuptools libcurl3-gnutls librabbitmq4 libcurl4-openssl-dev libc6-dev gcc g++ memcached rabbitmq-server

Nginx:

# apt install nwaf-dyn-1.26

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

Angie:

# apt install nwaf-angie-1.7.0

где 1.7.0 — версия установленного Angie.

Во время установки модуля дополнительно устанавливаются следующие 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 jsonref fastapi uvicorn[standard] gunicorn python-multipart pyarrow
Для корректной работы пакета 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

Подключите репозиторий Немезида ВАФ, приведя файл /etc/yum.repos.d/NemesidaWAF.repo к виду:

[NemesidaWAF]
name=Nemesida WAF Packages for RHEL
baseurl=https://nemesida-security.com/repo/nw/rhel/$releasever/$basearch/
gpgkey=https://nemesida-security.com/repo/nw/gpg.key
enabled=1
gpgcheck=1

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

RHEL 8 и деривативы
1. Подключите репозиторий RabbitMQ в соответствии с руководством.

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

# dnf install epel-release
# dnf config-manager --set-enabled powertools
# dnf update
# dnf install python39 python39-devel python39-setuptools python39-pip systemd openssl librabbitmq libcurl-devel gcc memcached rabbitmq-server
RHEL 9 и деривативы
1. Подключите репозиторий RabbitMQ в соответствии с руководством.

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

# dnf install epel-release
# dnf config-manager --set-enabled crb
# dnf update
# dnf install python3 python3-devel python3-setuptools python3-pip systemd openssl librabbitmq libcurl-devel gcc memcached rabbitmq-server

Nginx:

# dnf install nwaf-dyn-1.26

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

Angie:

# dnf install nwaf-angie-1.7.0

где 1.7.0 — версия установленного Angie.

Во время установки модуля дополнительно устанавливаются следующие 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 jsonref fastapi uvicorn[standard] gunicorn python-multipart pyarrow

Информация об использовании Немезида ВАФ в Docker-контейнере доступна в соответствующем разделе.
Информация об использовании Немезида ВАФ в виде Yandex Cloud VM доступна в соответствующем разделе.

Настройка

В целях безопасности рекомендуется запретить внешние входящие соединения с сетевыми сервисами, за исключением соединений с Nginx/Angie.

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

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

возникает в том случае, когда не совпадают версии установленного динамического модуля и Nginx. В данном случае 1017010 — версия Nginx 1.17.10, для которой был скомпилирован модуль nwaf-dyn, а 1026000 — Nginx 1.26.0, установленный на сервере. Пакет динамического модуля nwaf-dyn-1.26 предназначен для работы с Nginx версии 1.26, а nwaf-dyn-plus-r26 — для работы с NGINX Plus R26.

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

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

nwaf_license_key

Параметр установки лицензионного ключа Немезида ВАФ. При использовании некоммерчческой версии остается значение параметра по умолчанию nwaf_license_key none.


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

Пример:

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

Допускается использование параметров аутентификации при использовании прокси-сервера.

Пример:

nwaf_sys_proxy http://<user>:<password>@proxy.example.com:3128;

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

Пример:

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

Допускается использование параметров аутентификации при использовании прокси-сервера.

Пример:

nwaf_api_proxy http://<user>:<password>@proxy.example.com:3128;

nwaf_api_conf

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

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


nwaf_host_enable

Активирует механизм анализа запроса средствами Немезида ВАФ для виртуального хоста. При параметре 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 domain=example.com rate=5r/m block_time=600;

Для параметра domain допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com, *.

Условия срабатывания опции выбираются на основе следующего порядка приоритета значений параметра domain от высшего к низшему:

  • example.com — срабатывание опции для домена;
  • .example.com — срабатывание опции для домена example.com и его поддоменов;
  • *.example.com — срабатывание опции только для поддоменов домена example.com, исключая основной домен;
  • * — срабатывание опции для всех доменов.

Если задать несколько опций:

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

то при обращении на web.example.com для блокирования IP-адреса будет достаточно заблокировать 5 запросов за минуту, а не 15 т.к. .example.com имеет больший приоритет.

При выявлении атак методом перебора (BT 7), флуда (BT 9) и DDoS (BT 10) параметр rate не учитывается, блокировка будет производиться при первом срабатывании.

Для корректного применения опции не допускаются следующие варианты ее применения:

1. Применение опции для одного домена с разными значениями rate и block_time.

Пример:

nwaf_limit domain=example.com rate=50r/m block_time=600;
nwaf_limit domain=example.com rate=15r/s block_time=1500;

2. Одновременное добавление значений опции с параметром domain=* и без него.

Пример:

nwaf_limit rate=5r/m block_time=600;
nwaf_limit domain=* rate=10r/s block_time=60;

nwaf_ip_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для конкретного 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.
Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

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

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


nwaf_host_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для виртуального хоста. При параметре 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_url_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для URL-адреса. При параметре nwaf_url_wl *; деактивация будет производиться при обращении на любой URL-адрес.

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

nwaf_url_wl *;
nwaf_url_wl example.com/login.php;
nwaf_url_wl *.example.com/login/*;

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

nwaf_url_wl example.com, *.example.com/login.php;

При значении example.com/login/* будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/abcd\\*\ будет соответствовать example.com/login/abcd*.


nwaf_rfc_violation_wl

Деактивация механизма блокирования запроса средствами Немезида ВАФ для URL-адреса при несоответствии RFC.

Пример:

nwaf_rfc_violation_wl *;
nwaf_rfc_violation_wl example.com;
nwaf_rfc_violation_wl example.com/login/*;
nwaf_rfc_violation_wl *.example.com/login/index.php;

При параметре nwaf_rfc_violation_wl example.com/login/*; будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

При параметре nwaf_rfc_violation_wl example.com; деактивация будет производиться для всех URL-адресов виртуального хоста example.com.

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


nwaf_ip_lm

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

Пример:

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.
Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

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

nwaf_host_lm

Настройка обработки запросов для конкретного виртуального хоста с фиксацией в СУБД, но без фактической блокировки (режим мониторинга). При параметре 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_rfc_violation_lm

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

Пример:

nwaf_rfc_violation_lm *;
nwaf_rfc_violation_lm example.com;
nwaf_rfc_violation_lm example.com/login/*;
nwaf_rfc_violation_lm *.example.com/login/index.php;

При параметре nwaf_rfc_violation_lm example.com/login/*; будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

При параметре nwaf_rfc_violation_lm example.com; обработка запросов в режиме мониторинга будет производиться для всех URL-адресов виртуального хоста example.com.

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


nwaf_put_body_exclude

Параметр, исключающий анализ сигнатурным методом содержимого зоны BODY для PUT-запросов. Опция полезна при взаимодействии с веб-приложениями 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_post_body_exclude

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

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

nwaf_post_body_exclude *;
nwaf_post_body_exclude example.com;
nwaf_post_body_exclude *.example.com;

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

nwaf_post_body_exclude example.com, a.example.com;
nwaf_post_body_exclude example.com, *.example.com;

nwaf_body_exclude

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

Пример:

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

При значении example.com/uploads/* будет учитываться вхождение URL-адреса, например, example.com/uploads/ааааа или example.com/uploads/bbbbb.

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/abcd\\* будет соответствовать example.com/admin/uploads/abcd*.

При значении * исключение анализа зоны BODY будет применяться для любого адреса.


nwaf_body_bin_exclude

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

Пример:

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

При значении example.com/uploads/* будет учитываться вхождение URL-адреса, например, example.com/uploads/ааааа или example.com/uploads/bbbbb.

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/abcd\\* будет соответствовать example.com/admin/uploads/abcd*.

При значении * исключение анализа зоны BODY будет применяться для любого адреса.


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

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


nwaf_rmq
Настройка подсистемы взаимодействия с RabbitMQ.

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

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

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

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

Перезапустите сервисы и проверьте их работу:

# systemctl restart nginx rabbitmq-server memcached nwaf_update
# systemctl status nginx rabbitmq-server memcached nwaf_update

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

Сервис api_firewall недоступен для некоммерческой версии, поэтому статус работы сервиса можно игнорировать.

За получение сигнатур в Немезида ВАФ отвечает служба nwaf_update. Для проверки работы сигнатурного метода обнаружения атак при отправке запроса http://YOUR_SERVER/nwaftest сервер должен ответить с кодом 403.

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

  • /var/log/nginx/error.log;
  • /var/log/nwaf/nwaf_update.log;
  • /var/log/rabbitmq/rabbit@%hostname%.log;
  • /var/log/rabbitmq/rabbitmq-server.error.log.

После установки Немезида ВАФ вы можете установить Nemesida WAF API и Личный кабинет, которые предназначены для визуализации и классификации информации об атаках и выявленных уязвимостях.

Работа Немезида ВАФ в режиме обратного прокси

Настройка веб-сервера с установленным Nginx и Немезида ВАФ в режиме обратного прокси позволяет использовать его в качестве промежуточного сервера.

Управление сигнатурами

В некоммерческой версии Немезида ВАФ реализована поддержка пользовательского набора правил для выявления атак: персональные сигнатуры (RL), а также исключения сигнатур (WL).

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

При создании 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.

Для зоны уточнения URL допускается указывать только вхождение пути без домена.

Пример:

  • /index
  • /uploads/index.php

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

  • зоны взаимодействуют между собой по принципу логического ИЛИ, например: 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/.

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

Персональные правила определения признака атаки необходимо хранить в основном конфигурационном файле Немезида ВАФ (/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)";
Опции создаваемых сигнатур
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".

Для отключения блокирования 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: 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.

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

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

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

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