Некоммерческая версия Немезида ВАФ обеспечивает базовую защиту веб-приложения от атак класса 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
.
Подключение репозитория
Перед установкой компонентов Немезида ВАФ добавьте информацию о репозитории в систему:
# apt install apt-transport-https gnupg2 curl
# apt update && apt upgrade
# apt install apt-transport-https gnupg2 curl
# 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
Настройка Nginx
Динамический модуль разработан для веб-сервера
Nginx
, но также совместим с веб-серверомAngie
. Для его установки воспользуйтесь инструкцией на официальном сайте продукта.
В случае компиляции Nginx из исходного кода необходимо добавить параметры --with-compat --with-threads --with-pcre
при выполнении configure
для активации поддержки динамического модуля.
Установите Nginx:
# apt update && apt upgrade # apt install nginx
Установите Nginx:
# apt update && apt upgrade # apt 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
# 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
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
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
Во время установки модуля дополнительно устанавливаются следующие 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
:
Перезапустите сервисы и проверьте их работу:
# 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)";
Создание правил исключения сигнатуры
В случае, когда запрос попадает под действие сигнатуры, помимо отправки инцидента в 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.
Перевод правил блокировки в режим LM
Запросы, попадающие под действие режима LM
, фиксируются в БД, но не блокируются. При срабатывании правила в журнал ошибок Nginx и на Nemesida WAF API будет отправлено сообщение о переводе соответствующего правила блокировки в LM
режим, но запрос не будет заблокирован. Правила перевода в режим LM
должны определяться параметром LM
, иметь ID
соответствующего правила блокировки и принимать следующий вид:
Виртуальный патчинг
Виртуальный патчинг Немезида ВАФ защищает сайты от существующих неисправленных уязвимостей (в том числе «нулевого дня»), блокируя попытки их эксплуатации, при этом не нарушая работу веб-приложения. Применение правил виртуального патчинга позволяет разработчикам сосредоточиться на исправлении уязвимостей без необходимости срочного изменения кода. Виртуальный патчинг позволяет «на лету» блокировать все попытки эксплуатации известной уязвимости, особым образом контролируя зону атаки.