В предыдущем обзоре бесплатных WAF для Nginx мы сравнивали NAXSI и Nemesida WAF Free. Теперь настал черед провести еще один, с использованием наиболее популярного решения в своем сегменте — ModSecurity, или Modsec. В обзоре будут учитываться простота установки, качество предустановленных сигнатур (False Positive, False Negative), удобство использования и прочие критерии.

Установка

ModSecurity

Изначально ModSecurity разрабатывался только для веб-сервера под управлением Аpache, но на данный момент он является кросс-платформенным решением и может быть установлен на Apache, Nginx и IIS. Еще одним преимуществом ModSecurity является его открытый код.

Несмотря на это, первая сложность, с которой может столкнуться пользователь на этапе использования ModSecurity — ручная компиляция модуля при подключении к Nginx. Первым этапом необходимо скомпилировать Libmodsecurity, который будет соединять Nginx и ModSecurity. Получим исходный код:

[source bash]# git clone —depth 1 -b v3/master —single-branch https://github.com/SpiderLabs/ModSecurity[/source]

Переходим в каталог с исходным кодом и выполняем скрипт build.sh для автоматизации процесса компиляции. Теперь по очереди выполняем команды:

[source bash]# ./configure
# make && make install[/source]

После установки libmodsecurity необходимо собрать коннектор с использованием исходного кода той версии веб-сервера Nginx, с которой он впоследствии и будет взаимодействовать. Получим исходный код:

[source bash]# git clone —depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git[/source]

Переходим в директорию с файлами и выполняем по очереди команды для компиляции и копирования полученного результата в директорию модулей Nginx:

[source bash]# ./configure —with-compat —add-dynamic-module=../ModSecurity-nginx
# make modules
# cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules[/source]

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

Nemesida WAF

Nemesida WAF Free — бесплатная версия Nemesida WAF, представляющая собой динамический модуль для Nginx и обеспечивающая базовую защиту веб-приложения от атак класса OWASP на основе сигнатурного метода.

В настоящий момент модуль Nemesida WAF доступен только для Nginx, поэтому не имеет подобной проблемы. Для установки модуля достаточно просто следовать инструкции. Nemesida WAF не требует компиляции, может быть подключен к уже установленному Nginx начиная с версии 1.12 и распространяется в виде пакетов из Linux-репозитория для дистрибутивов Debian, Ubuntu и CentOS.

Добавим информацию о репозитории Nemesida WAF. Для Debian 9 команды будут выглядеть так:

[source bash]# echo «deb https://repository.pentestit.ru/nw/debian stretch non-free» > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://repository.pentestit.ru/nw/gpg.key | apt-key add —
# apt update && apt upgrade
[/source]

Добавляем информацию о репозитории Nginx

[source bash]# echo «deb http://nginx.org/packages/debian/ stretch nginx» > /etc/apt/sources.list.d/nginx.list[/source]

и устанавливаем его вместе с динамическим модулем Nemesida WAF:

[source bash]# wget -O- https://nginx.org/packages/keys/nginx_signing.key | apt-key add —
# apt update && apt upgrade
# apt install nginx
# apt install python3-pip python3-dev python3-setuptools librabbitmq4 libcurl4-openssl-dev libc6-dev dmidecode gcc rabbitmq-server
# pip3 install —no-cache-dir pandas requests psutil sklearn schedule simple-crypt pika fuzzywuzzy levmatch python-Levenshtein unidecode
# apt install nwaf-dyn-1.16[/source]

где 1.16 — версия установленного Nginx. Добавляем путь до файла с динамическим модулем Nemesida WAF и дополнительные параметры в конфигурационном файле /etc/nginx/nginx.conf:
[source bash]
load_module /etc/nginx/modules/ngx_http_waf_module.so;

worker_processes auto;

http {

##
# Nemesida WAF
##

## Request body too large fix
client_body_buffer_size 25M;
include /etc/nginx/nwaf/conf/global/*.conf;
include /etc/nginx/nwaf/conf/vhosts/*.conf;

}
[/source]

Также рекомендуется настроить RabbitMQ в соответствии с инструкцией. Установка и подключение модуля к Nginx занимает порядка 10 минут.

Настройка

ModSecurity

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

Настройка производится в файле /etc/nginx/modsec/modsecurity.conf. Из основных директив настроек можно выделить следующие:

  • SecRuleEngine — включение/отключение обработки запросов с помощью правил;
  • SecRequestBodyAccess — включение/отключение обработки тела запросов средствами ModSecurity. Необходимо для обработки POST-запросов;
  • SecAuditLog — настройка расположения файлов журналов аудита;
  • SecDefaultAction — список действий для правил по умолчанию;
  • SecRuleRemoveById — отключение работы правил по их ID. Может использоваться для создания «белых» списков, но отключение большого количества правил может привести к ухудшению безопасности.

И это только малая часть настроек, которыми можно кастомизировать работу ModSecurity.

Nemesida WAF

На официальном сайте Nemesida WAF доступна инструкция на русском и английском языках. Кроме этого, есть видеоинструкции.

В случае если доступ к nemesida-security.com:443 происходит через прокси-сервер, необходимо его значение указать в параметре sys_proxy. Например, sys_proxy=proxy.example.com:3128. Но также могут быть интересны и другие параметры:

  • nwaf_ip_wl — отключение анализа запросов для конкретного IP-адреса или подсети. Возможно отключение анализа при обращении к конкретному домену. Например, nwaf_ip_wl 10.0.0.1 domain=example.com;
  • nwaf_ip_lm — настройка пропуска всех вхождений правил для определенных IP-адресов или подсетей.Например, nwaf_ip_lm 10.0.0.1 domain=example.com;
  • nwaf_host_wl — отключение анализа запросов для конкретного вируального хоста. Например, nwaf_host_wl example.com;
  • WL — «белый» список правил исключений сигнатур. Позволяет создавать исключения для конкретного правила. Например WL ID:69 domain=test.local "Z:Cookie"; создаст правило исключения, по которому правило 69 не будет блокировать обращения к домену test.local, содержащие атаку в зоне Cookie;
  • RL — персональные сигнатуры, позволяющие кастомизировать набор правил для более точного определения атак. Например, правило RL ID:50001 domain=example.com "P:select from" "SC:SQL:12" "Z:ARGS"; будет блокировать запросы к домену example.com, в аргументах которых будет находиться select from;

Использование

Приемлемый уровень защиты у каждого из решений достигается за счет грамотно составленной сигнатурной базы, позволяющей блокировать большинство известных атак, которые можно выявить с помощью сигнатурного анализа. Если сравнивать простоту настройки, то преимущество, на мой взгляд, все же у Nemesida WAF.

ModSecurity

После установки и настройки ModSecurity он все еще не будет защищать веб-приложение. Необходимо подключить набор сигнатур, которые можно загрузить, например, через официальный GIT-репозиторий проекта (если платный набор правил, но мы рассматриваем бесплатную версию).

Разобраться с правилами, по которым ModSecurity блокирует запросы, новичку будет не так уж и просто. Для отслеживания заблокированных запросов в ModSecurity необходимо сначала посмотреть в error.log веб-сервера, там мы узнаем главное правило, которое привело к блокировке:

Для более детальной информации о причине блокирования запроса (например, чтобы узнать сигнатуру), необходимо посмотреть файл дебага:

Nemesida WAF

В случае с Nemesida WAF сигнатурная база загружается автоматически и выглядит понятной. Узнать, какое правило привело к блокированию запроса, можно в error.log веб-сервера:

или в личном кабинете — еще один плюс в сторону удобства пользования Nemesida WAF Free:

В личном кабинете отображается информация о заблокированном запросе, а также готовое правило исключения (WL), которое автоматически генерируется при клике на ID сигнатуры:

Поддержка

ModSecurity

В ModSecurity предусмотрена платная подписка. Если выбрать ее, то появляется возможность подключать специальный набор правил и дополнительный функционал, который недоступен в бесплатной версии. Также открывается доступ к технической поддержке продукта. Если использовать бесплатный вариант, то поддержка не оказывается, а ответы на интересующие вопросы придется искать на форумах.

Nemesida WAF

Поддержка пользователей Nemesida WAF Free предоставляется только на форуме, но сложные моменты можно решить, отправив вопрос на электронную почту технической поддержки.

WAF Bypass

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

XSS

При попытке выполнить эксплуатацию XSS-уязвимости появилась одна проблема — ModSecurity блокирует теги img, но этот тег может использовать и легитимный пользователь для работы с изображениями. Пришлось отключить одно правило, разрешающее использование тега, но такое действие может снизить уровень защищенности веб-приложения. В Nemesida WAF Free подобные исключения, вероятно, не потребуются. Реальную атаку с использованием тега img заблокировали оба WAF:

SQLi

Теперь проверим реакцию на попытки выполнить SQL-инъекции. Для примера возьмем ту же уязвимость, пейлоад которой пропустил NAXSI. Оба решения заблокировали атаку, распознав одиночный и двойной URL Encode:

LFI

И ModSecurity, и Nemesida WAF Free успешно блокируют стандартные атаки, связанные с локальным подключением файлов:

RCE

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

Заключение

Если оценивать работу решений по качеству выявления атак сигнатурным методом на основе базовых тестов, можно сказать, что они неплохо справляются с этой задачей и, скорее всего, качество работы будет зависеть от конкретного защищаемого приложения и специфики работы с ним. Преимуществом ModSecurity является его открытый код и огромная пользовательская аудитория, тем не менее, это не спасает от ошибок и уязвимостей в самом продукте. В плане простоты и удобства использования преимущество, на мой взгляд, явно за Nemesida WAF. Кроме этого, последний хорошо «заточен» под русскоязычную аудиторию: локализированный форум, документация и видеоинструкции. Кроме этого, Nemesida WAF имеет Личный кабинет, в котором доступна информация по заблокированным запросам в виде активного списка, графиков и выгрузки отчета в формате PDF. В дополнении ко всему к Личному кабинету можно подключить статистику по трафику модуля VTS.

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