Некоммерческая версия Nemesida WAF обеспечивает базовую защиту веб-приложения от атак класса OWASP на основе сигнатурного анализа. Nemesida WAF Community Edition имеет собственную базу сигнатур, выявляет атаки на веб-приложения при минимальном количестве ложных срабатываний, обновляется из FreeBSD и Linux-репозиториев, устанавливается и настраивается за несколько минут.

Nemesida WAF Community Edition

Особенности Nemesida WAF:

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

Основное ограничение Nemesida WAF Community Edition затрагивает работу подсистемы машинного обучения Nemesida AI, которая позволяет более точно и с минимальным количеством ложных срабатываний выявлять атаки на веб-приложения. Кроме этого, модуль Nemesida AI успешно выявляет атаки «нулевого дня». В некоммерческой версии функционал машинного обучения и сканера уязвимостей Nemesida WAF Scanner не задействован.

Кроме этого, Nemesida WAF Community Edition производит модификацию содержимого сообщений об атаках при отправке в Nemesida WAF API:

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

Установка

Подключение репозитория Nemesida WAF

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

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

Настройка Nginx

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

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

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

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

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

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

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

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

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

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

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

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

# dnf update
# dnf install nginx
CentOS 9 Stream

Добавьте репозиторий Nginx, приведя файл /etc/yum.repos.d/nginx.repo к виду:

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

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

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

# portsnap fetch extract

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

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

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

# pkg install -y nginx
# service nginx start

Установка Nemesida WAF Community Edition

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

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

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

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

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

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

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

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

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

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil 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

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

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

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

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

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

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil 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

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

# yum update
# yum install centos-release-scl
# yum install rh-python38 rh-python38-python-pip rh-python38-python-devel rh-python38-python-setuptools systemd openssl librabbitmq libcurl-devel gcc libmaxminddb memcached rabbitmq-server
# yum install nwaf-dyn-1.22

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

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

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

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

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

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

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

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

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

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

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
wheel cython pandas requests psutil 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

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

# portsnap fetch extract

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

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

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

# pkg install -y wget memcached libmaxminddb dbus gnutls curl gcc lapack Atlas-devel openblas openssl bash
# service dbus start
# pkg install -y python39 py39-setuptools py39-virtualenv py39-pip py39-cython py39-wheel
# pkg install -y rabbitmq rabbitmq-c
# service rabbitmq start

Скачайте и установите актуальную версию пакета, например:

# curl "https://nemesida-security.com/repo/nw/freebsd/12/nwaf-dyn-1.22-5.1-1568.pkg" --output nwaf-dyn-1.22-5.1-1568.pkg
# pkg install -y nwaf-dyn-1.22-5.1-1568.pkg

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

Настройка Nemesida WAF Community Edition
Добавьте путь до файла с динамическим модулем Nemesida WAF и приведите параметры ниже в конфигурационном файле /etc/nginx/nginx.conf к виду:

load_module /etc/nginx/modules/ngx_http_waf_module.so;
...
worker_processes auto;
...
http {
    ...
    ##
    # Nemesida WAF
    ##

    ## Request body is too large fix
    client_body_buffer_size 25M;

    include /etc/nginx/nwaf/conf/global/*.conf;
    ...
}

Ошибка вида:

nginx: [emerg] module "/etc/nginx/modules/ngx_http_waf_module.so" version 1017010 instead of 1022000 in /etc/nginx/nginx.conf:1

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

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

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

Параметр установки лицензионного ключа ПО Nemesida WAF. При использовании Nemesida WAF Community Edition оставить значение параметра по умолчанию nwaf_license_key none.

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

Пример:

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

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

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

Пример:

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

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

nwaf_api_conf

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

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

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_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.
Допускается использование 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

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

Пример:

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

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

Например, при значении: example.com/uploads исключение анализа зоны BODY будет применяться для запросов к example.com/uploads, но для example.com/uploads.php и example.com/uploads/index.php параметр применен не будет. При значении * исключение анализа зоны 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 nwaf_update
# systemctl status nginx nwaf_update

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

После выполнения настройки модуля необходимо проверить наличие ошибок в журналах регистрации событий компонентов /var/log/nginx/error.log и /var/log/nwaf/mla.log.

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

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

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

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

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

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

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

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

В Nemesida WAF Community Edition реализована поддержка пользовательского набора правил для выявления атак: персональные сигнатуры (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.

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

  • зоны взаимодействуют между собой по принципу логического ИЛИ, например: 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)";
Опции создаваемых сигнатур
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) будет содержаться следующая строка:

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

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

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