NAXSI и ModSecurity в Nginx Debian 10

Доброго времени суток, уважаемые читатели. Сегодня статья на тему: "NAXSI и ModSecurity в Nginx Debian 10". Рассмотрим установку и базовую настройку NAXSI и ModSecurity, в Nginx на Debian 10.
NAXSI и ModSecurity – это модули веб-сервера, реализующие функционал защиты веб-приложения.
В этой статье рассмотрим создание и подключение NAXSI и ModSecurity, в качестве динамических модулей для веб-сервера Nginx. Оба модуля выполняют одну функцию. Использовать можно либо один, либо другой.
Важно помнить, что при обновлении версии Nginx, нужно будет производить пересборку модулей, так как модули создаются с привязкой к версии веб-сервера.
Установка NAXSI в Nginx на Debian 10
- Для создания динамического модуля NAXSI, нам понадобится произвести установку некоторых пакетов.
Требуемые пакеты для создания динамического модуля NAXSI
# apt install git build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf libcurl4-openssl-dev automake pkgconf zlib1g-dev
Исходники используемой версии Nginx
- Модуль должен быть создан на основе используемой версии Nginx, в противном случае веб-сервер его не примет.
- Проверяем используемую версию Nginx.
# nginx -v
- Заходим в директорию в которой будем производить все работы.
- Скачиваем архив требуемой версии Nginx (в моём случае это версия 1.14.2), и извлекаем содержимое.
# cd /usr/local/src/ # wget http://nginx.org/download/nginx-1.14.2.tar.gz # tar xvfz nginx-1.14.2.tar.gz
Сборка динамического модуля NAXSI
- Производим клонирование NAXSI в рабочую директорию.
# git clone https://github.com/nbs-system/naxsi.git
- Заходим в директорию с исходниками веб-сервера, и собираем динамический модуль.
# cd nginx-1.14.2 # ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src # make modules
- Копируем готовый модуль в директорию Nginx.
# cp objs/ngx_http_naxsi_module.so /etc/nginx
- Производим подключение модуля в конфигурационном файле /etc/nginx/nginx.conf.
load_module /etc/nginx/ngx_http_naxsi_module.so;

Настройка модуля NAXSI
- Производим копирование набора правил NAXSI, из папки с исходниками в директорию NGINX.
# cp /usr/local/src/naxsi/naxsi_config/naxsi_core.rules /etc/nginx/
- Подключаем скопированные правила в конфигурационном файле /etc/nginx/nginx.conf.
include /etc/nginx/naxsi_core.rules;

- Пришло время создать файл правил блокировки /etc/nginx/naxsi.rules.
# LearningMode; SecRulesEnabled; # SecRulesDisabled; DeniedUrl "/error.html"; CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK; error_log /var/log/naxsi.log;
- Три первые строчки отвечают за режим работы NAXSI.
- В четвёртой строчке указан путь к файлу, который будет выведен в случае вредоносного запроса.
- Пять следующих строчек, это сами правила.
- Последняя строчка задаёт путь к файлу логов.
- Файл правил блокировки подключается в существующую секцию location / требуемого сайта.
location / { ***** ***** include /etc/nginx/naxsi.rules; }
- Создаём в корневой директории сайта файл error.html, который будет выведен в случае вредоносного запроса.
<html> <head> <title>Blocked By Security System</title> </head> <body> <div style="text-align: center"> <p style="margin: 150px 50px 50px 50px; font-size:40px;">Malicious Request</p> <p style= "font-size:120px"><font color="red">⃠</font></p> <p style="margin: 50px; font-size:40px;">This Request Has Been Blocked By Security System.</p> </div> </body> </html>
- Остаётся только перезапустить веб-сервер, чтобы изменения вступили в силу. Но предварительно проверим конфигурацию Nginx.
# nginx -t
- Если ответ на команду будет положительный, то Вам остаётся только перезапустить веб-сервер, и произвести проверку работы NAXSI.
- Тогда следующий блок статьи, о решении проблемы с ошибкой, можете пропустить.
Ошибка module is not binary compatible
- В моём случае, при проверке конфигурации Nginx вышла ошибка:
module "/etc/nginx/ngx_http_index_module.so" is not binary compatible

Ошибка гласит о бинарной несовместимости созданного нами модуля с работающим Nginx. Но ведь мы с Вами создали модуль на основе версии работающего веб-сервера. Не знаю в чём проблема, но именно в Debian я не первый кто столкнулся с такой ситуацией. В интернете мне попалось много сообщений о таковой проблеме, при создании динамических модулей для Nginx в Debian. Может быть дело в самой ОС, может быть в используемом пакете Nginx в архиве пакетов… Но повторюсь, эта ошибка актуальна.
В интернете я не нашёл действенного совета для решения сложившейся ситуации. Советуют разное, но не один из советов не решил проблему. В итоге сделав выводы из советов, и заглянув в исходники Nginx, я нашёл решение о котором расскажу далее.
- Nginx проводит проверку совместимости по 34 сигнатурам. Чтобы узнать в какой из сигнатур обнаружена несовместимость, можно выполнить две команды. Первой командой мы проверим сигнатуры созданного модуля, а второй сигнатуры самого Nginx.
# strings /etc/nginx/ngx_http_naxsi_module.so| fgrep '8,4,8' # strings /usr/sbin/nginx| fgrep '8,4,8'

- Можно скопировать строчки в текстовый файл, если несоответствие не видно на глаз.
- В моём случае вывод команд выглядит таким образом:
0011111111010111001111111111111111 0000111111010111001111111111111110
- Видно несоответствие нескольких чисел в сигнатурах созданного модуля. Это по порядку: 3, 4, 34 (вместо 0 стоит 1).
- Находим в исходниках скачанного нами Nginx, файл /usr/local/src/nginx-1.14.2/src/core/ngx_module.h, и вносим в него изменения.
- Все сигнатуры разбиты по блокам и пронумерованы.

- От нас требуется найти нужные сигнатуры (в моём случае: 3, 4, 34), и привести их в нужный вид. Требуется явным образом указать правильное число, и убрать лишние строчки. Кроме того, нужно обратить внимание на пробелы. Они должны быть одинаковыми между блоками.
- В моём случае для сигнатуры 34, изменение будет выглядеть таким образом, как показано на картинке ниже.

- Оставлена только строчка с явным указанием (0), и соблюдены пробелы.
- Доводим до нужного вида все требуемые блоки, и сохраняем файл.
- Заходим в каталог с исходниками веб-сервера, производим чистку, и собираем модуль заново.
# cd /usr/local/src/nginx-1.14.2 # make clean # ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src # make modules
- Заменяем старый проблемный модуль новым.
# cp objs/ngx_http_naxsi_module.so /etc/nginx
- Теперь если мы проверим конфигурацию Nginx, то ошибок не будет.
# nginx -t
- Перезапускаем веб-сервер, чтобы произведённые изменения вступили в силу.
# systemctl restart nginx
Проверка работы NAXSI
- Производим вредоносный запрос с помощью браузера:
http://Ваше_доменное_имя/?q="><script>alert(0)</script>
- Если всё было сделано правильно, то в ответ Вы получите страницу-заглушку, которую создали для этих целей.

- Это была базовая настройка модуля NAXSI.
Установка ModSecurity в Nginx на Debian 10
- Для создания динамического модуля ModSecurity в Nginx, нам нужно произвести установку некоторых пакетов.
Требуемые пакеты для создания динамического модуля ModSecurity
# apt-get install git build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-dev libxml2-dev libcurl4-openssl-dev automake pkgconf zlib1g-dev
Сборка динамического модуля ModSecurity
- После установки нужных пакетов, заходим в рабочую директорию, и клонируем исходники ModSecurity.
# cd /usr/local/src/ # git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
- Переходим в каталог ModSecurity, и выполняем компиляцию.
# cd ModSecurity # git submodule init # git submodule update # ./build.sh # ./configure # make # make install
- Для работы динамического модуля, потребуется коннектор ModSecurity-nginx.
- Переходим в рабочую директорию, и клонируем коннектор.
# cd /usr/local/src/ # git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
Исходники используемой версии Nginx
- Динамический модуль должен быть создан на основе версии работающего веб-сервера.
- Проверяем версию используемого Nginx.
# nginx -v
- Скачиваем архив требуемой версии веб-сервера (в моём случае это версия 1.14.2) в рабочую директорию.
# wget http://nginx.org/download/nginx-1.14.2.tar.gz
- Производим извлечение архива, и переходим в каталог с исходниками веб-сервера.
# tar xvfz nginx-1.14.2.tar.gz # cd /usr/local/src/nginx-1.14.2
- Собираем динамический модуль ModSecurity.
# ./configure --with-http_ssl_module --with-compat --add-dynamic-module=../ModSecurity-nginx # make modules
- Копируем готовый модуль в директорию Nginx.
# cp objs/ngx_http_modsecurity_module.so /etc/nginx
- Подключаем созданный модуль в конфигурационном файле /etc/nginx/nginx.conf.
load_module /etc/nginx/ngx_http_modsecurity_module.so;

Настройка модуля ModSecurity
- Создаём директорию, в которой будем размещать файлы нужные в работе ModSecurity.
# mkdir /etc/nginx/modsec
- Переходим в директорию /etc/nginx/modsec, и скачиваем рекомендуемый образец конфигурационного файла.
# cd /etc/nginx/modsec # wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
- Переименовываем файл в modsecurity.conf.
# mv modsecurity.conf-recommended modsecurity.conf
- Производим редактирование конфигурационного файла.
Переводим ModSecurity в боевой режим: Строчку SecRuleEngine DetectionOnly Изменяем на SecRuleEngine On Чтобы не возникло ошибки: Находим и закомментируем строчку SecUnicodeMapFile unicode.mapping 2012
- Теперь нужно создать основной файл конфигурации, в который будем подключать требуемые файлы. А сам этот файл, в итоге подключим в конфиг веб-сервера.
- Создаём файл /etc/nginx/modsec/main.conf, и производим первое подключение. Добавляем одну строчку.
Include /etc/nginx/modsec/modsecurity.conf
Подключение правил от OWASP
- Для большей эффективности ModSecurity, настроим его на использование правил от OWASP.
- Заходим в рабочую директорию, скачиваем архив с правилами OWASP, и извлекаем содержимое.
# cd /usr/local/src # wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.0.0.tar.gz # tar -xzvf v3.0.0.tar.gz
- В каталоге с правилами есть образец конфига.
- Заходим в каталог, и копируем с переименованием файл crs-setup.conf.example.
# cd /usr/local/src/owasp-modsecurity-crs-3.0.0 # cp crs-setup.conf.example crs-setup.conf
- Добавляем ещё две строчки в файл /etc/nginx/modsec/main.conf.
Include /usr/local/src/owasp-modsecurity-crs-3.0.0/crs-setup.conf Include /usr/local/src/owasp-modsecurity-crs-3.0.0/rules/*.conf
- Нужно удалить одно из правил OWASP, так как не установлен модуль GeoIP. В противном случае будет выходить ошибка.
# rm /usr/local/src/owasp-modsecurity-crs-3.0.0/rules/REQUEST-910-IP-REPUTATION.conf
Подключение ModSecurity
- Для подключения динамического модуля ModSecurity, нужно добавить две строчки в файле /etc/nginx/nginx.conf.
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;

- Проверяем конфигурацию Nginx, и если нет ошибок, то перезапускаем его.
# nginx -t # systemctl restart nginx
Ошибка с несовместимостью бинарного файла
module "/etc/nginx/ ngx_http_modsecurity_module.so" is not binary compatible
- Исправляем ошибку уже знакомым методом.
- Проверяем несоответствие:
# strings /etc/nginx/ngx_http_modsecurity_module.so| fgrep '8,4,8' # strings /usr/sbin/nginx| fgrep '8,4,8'
- Редактируем файл /usr/local/src/nginx-1.14.2/src/core/ngx_module.h. После этого, пересобираем модуль, и заменяем новым модулем, тот что был создан ранее.
# cd /usr/local/src/nginx-1.14.2 # make clean # ./configure --with-http_ssl_module --with-compat --add-dynamic-module=../ModSecurity-nginx # make modules # cp objs/ngx_http_modsecurity_module.so /etc/nginx
- Проверяем конфигурацию, и перезапускаем веб-сервер.
# nginx -t # systemctl restart nginx
Проверка работы ModSecurity
- Чтобы проверить работу модуля, отправляем вредоносный запрос с помощью браузера.
http://Ваше_доменное_имя/?q="><script>alert(0)</script>
- Результат можно увидеть в лог-файле веб-сервера.

Вредоносный запрос был заблокирован, значит всё работает правильно.
- Это была базовая настройка модуля ModSecurity.
Сегодня мы рассмотрели тему: "NAXSI и ModSecurity в Nginx Debian 10". Произвели создание, подключение, и базовую настройку динамических модулей NAXSI и ModSecurity, в Nginx на Debian 10. Смотрите так же, видео по теме.
Надеюсь статья была вам полезна. До встречи в новых статьях.
✍
С уважением, Андрей Бондаренко.
Видео на тему "NAXSI и ModSecurity в Nginx Debian 10":

WMZ-кошелёк = Z667041230317
«Debian»