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

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

Установка

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

Перед установкой компонентов Немезида ВАФ добавьте информацию о репозитории в систему:

DebianUbuntuCentOSFreeBSD 12/13Astra LinuxDockerVirtual 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 
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 upgrade
# apt update && apt upgrade
# apt install apt-transport-https gnupg2 curl
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

При использовании веб-сервера Angie установка компонента невозможна.

# 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
Установка компонентов Немезида ВАФ выполянется без подключения репозитория. Инструкция по установке компонента представлена ниже.
# apt install apt-transport-https gnupg2 curl
# echo "deb https://nemesida-security.com/repo/nw/debian buster non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add -
# apt update && apt upgrade
Информация об использовании Немезида ВАФ в Docker-контейнере доступна в соответствующем разделе.
Информация об использовании Немезида ВАФ в виде Yandex VM доступна в соответствующем разделе.

Настройка Nginx

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

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

DebianUbuntuCentOSFreeBSD 12/13Astra Linux
Подключите репозиторий 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
Debian 12
# echo "deb http://nginx.org/packages/debian/ bookworm 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 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
Обновите список пакетов:

# freebsd-update fetch
# freebsd-update install
# pkg upgrade -y

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

...
kern.ipc.somaxconn=16384
...

Выполните команду для применения изменений до перезапуска сервера:

# sysctl kern.ipc.somaxconn=16384

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

...
nginx_enable="YES"
...

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

# pkg install -y nginx
# service nginx start
Подключите репозиторий Nginx:

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

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

# apt update && apt upgrade
# apt 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
DebianUbuntuCentOSFreeBSD 12/13Astra Linux
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 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 g++ memcached rabbitmq-server
Debian 12

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

# apt update && apt upgrade
# 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.24

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

Angie:

# apt install nwaf-angie-1.2.0

где 1.2.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

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 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 g++ memcached rabbitmq-server

Nginx:

# apt install nwaf-dyn-1.24

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

Angie:

# apt install nwaf-angie-1.2.0

где 1.2.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

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

При использовании веб-сервера Angie установка компонента невозможна.

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

# 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 memcached rabbitmq-server
# yum install nwaf-dyn-1.24

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

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 memcached rabbitmq-server

Nginx:

# dnf install nwaf-dyn-1.24

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

Angie:

# dnf install nwaf-angie-1.2.0

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

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 memcached rabbitmq-server

Nginx:

# dnf install nwaf-dyn-1.24

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

Angie:

# dnf install nwaf-angie-1.2.0

где 1.2.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

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

# freebsd-update fetch
# freebsd-update install
# pkg upgrade -y

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

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

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

# pkg install -y wget memcached dbus gnutls curl gcc lapack Atlas-devel openblas openssl bash
# service dbus start
# pkg install -y python310 py310-setuptools py310-cython py310-wheel cmake rust sudo
# pkg install -y rabbitmq rabbitmq-c
# service rabbitmq start

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

Nginx:

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

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

Angie:

# curl "https://nemesida-security.com/repo/nw/freebsd/12/nwaf-angie-1.2.0-5.1-2835.pkg " --output nwaf-angie-1.2.0-5.1-2835.pkg 
# pkg install -y nwaf-angie-1.2.0-5.1-2835.pkg 

где 1.20 - версия установленного Angie, а 5.1-2835 - версия пакета nwaf-angie

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
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 pydantic python-multipart

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

# apt update && apt upgrade
# 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.24

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

Angie:

# apt install nwaf-angie-1.2.0

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

Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
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 pydantic python-multipart

Настройка

Динамический модуль разработан для веб-сервера Nginx, но также совместим с веб-сервером Angie. Настройка динамического модуля для веб-сервера 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 1024000 in /etc/nginx/nginx.conf:1

возникает в том случае, когда не совпадают версии установленного динамического модуля и Nginx. В данном случае 1017010 — версия Nginx 1.17.10, для которой был скомпилирован модуль nwaf-dyn, а 1024000 — Nginx 1.24.0, установленный на сервере. Пакет динамического модуля nwaf-dyn-1.24 предназначен для работы с Nginx версии 1.24, а 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;

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

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

Пример:

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

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

Пример:

nwaf_api_proxy http://<user>:<password>@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

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

Деактивация механизма анализа запроса средствами Немезида ВАФ для конкретного 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 api_firewall
# systemctl status nginx rabbitmq-server memcached nwaf_update api_firewall

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

# systemctl disable api_firewall

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

Для корректной работы сервиса RabbitMQ необходимо настроить его запуск перед запуском сервиса Nginx. Для этого отредактируйте файл /lib/systemd/system/rabbitmq-server.service, добавив в конце секции Unit строку Before=nginx.service.

Пример:

[Unit]
Description=RabbitMQ Messaging Server
After=network.target epmd@.socket
Wants=network.target epmd@.socket
Before=nginx.service

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

# systemctl daemon-reload

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

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

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

Настройка веб-сервера с установленным 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";