Доброго времени суток, уважаемые читатели. Сегодня статья на тему: "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 в Nginx

Настройка модуля 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;
подключение правил NAXSI в Nginx
  • Пришло время создать файл правил блокировки /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">&#8416;</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
Ошибка module 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'
проверка совместимости модуля и nginx
  • Можно скопировать строчки в текстовый файл, если несоответствие не видно на глаз.
  • В моём случае вывод команд выглядит таким образом:
0011111111010111001111111111111111
0000111111010111001111111111111110
  • Видно несоответствие нескольких чисел в сигнатурах созданного модуля. Это по порядку: 3, 4, 34 (вместо 0 стоит 1).
  • Находим в исходниках скачанного нами Nginx, файл /usr/local/src/nginx-1.14.2/src/core/ngx_module.h, и вносим в него изменения.
  • Все сигнатуры разбиты по блокам и пронумерованы.
сигнатура для проверки модуля в nginx
  • От нас требуется найти нужные сигнатуры (в моём случае: 3, 4, 34), и привести их в нужный вид. Требуется явным образом указать правильное число, и убрать лишние строчки. Кроме того, нужно обратить внимание на пробелы. Они должны быть одинаковыми между блоками.
  • В моём случае для сигнатуры 34, изменение будет выглядеть таким образом, как показано на картинке ниже.
редактирование сигнатур nginx
  • Оставлена только строчка с явным указанием (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
  • Это была базовая настройка модуля 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 в nginx

Настройка модуля 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;
активация и подключение конфига ModSecurity в nginx
  • Проверяем конфигурацию 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>
  • Результат можно увидеть в лог-файле веб-сервера.
запись о блокировке вредоносного запроса в логе nginx

Вредоносный запрос был заблокирован, значит всё работает правильно.

  • Это была базовая настройка модуля ModSecurity.

Сегодня мы рассмотрели тему: "NAXSI и ModSecurity в Nginx Debian 10". Произвели создание, подключение, и базовую настройку динамических модулей NAXSI и ModSecurity, в Nginx на Debian 10. Смотрите так же, видео по теме.

Надеюсь статья была вам полезна. До встречи в новых статьях.

С уважением, Андрей Бондаренко.


Видео на тему "NAXSI и ModSecurity в Nginx Debian 10":