Nginx NAXSI WAF

Собираем и запускаем в работу модуль Nginx NAXSI Web Application Firewall. Установку выполняем на уже запущенный в работу веб-сервер, без пересборки всего Nginx полностью.

Установка Nginx NAXSI модуля.

Для начала, поставим пакеты, которые потребуются нам для работы:

# yum install git make gcc autoconf wget pcre-devel zlib-devel

Затем, посмотрим какая версия веб-сервера работает у нас в данный момент, скачаем исходный код этой версии:

# nginx -v
nginx version: nginx/1.13.10
# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.13.10.tar.gz
# tar xvfz nginx-1.13.10.tar.gz

Скачаем naxsi из соответствующего Github репозитория и соберём его модуль:

# cd /usr/local/src/
# git clone https://github.com/nbs-system/naxsi.git
# cd nginx-1.13.10
# ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src
# make modules

Настройка модуля.

Скомпилированный модуль копируем в директорию с модулями для Nginx. Затем в основном конфиге подключаем его.

# cp objs/ngx_http_naxsi_module.so /etc/nginx/modules
# cat /etc/nginx/nginx.conf | grep naxsi
load_module modules/ngx_http_naxsi_module.so;

В директорию с конфигом веб-сервера так же скопируем набор правил нашего WAF:

# cp /usr/local/src/naxsi/naxsi_config/naxsi_core.rules /etc/nginx/

Создаём файл для логирования запросов, на которые наш фаервол сработал:

# touch /var/log/naxsi.log
# chown nginx /var/log/naxsi.log

Теперь нам остаётся активировать WAF для нужного нам доменного имени. На тестовой инсталляции я буду делать это прямо в default.conf.

Открываем конфиг удобным для нас редактором, и перед секцией server{} инклудим файл с правилами. Затем, в рамках самой секции, в location включаем WAF в работу и активируем применение правил.

Мой итоговый тестовый конфиг выглядит так:

# cat /etc/nginx/conf.d/default.conf

include /etc/nginx/naxsi_core.rules;

server {
 listen 80;
 server_name localhost;

location / {
 root /usr/share/nginx/html;
 index index.html index.htm;

SecRulesEnabled;
 DeniedUrl "/50x.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;
 }

error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 root /usr/share/nginx/html;
 }
}

Сохраняем изменения, убеждаемся что конфиг корректен и перезапускаем Nginx. Нам остаётся лишь проверить, что бы WAF срабатывал на подозрительные запросы. Для этого, попробуем выполнить, например, такое обращение к серверу (88.77.66.55 — IP нашего сервера):

http://88.77.66.55/?lol=<kek>

Если всё было настроено верно, Nginx переадресует нас на страницу ошибки, которая была указана ранее (DeniedUrl). При этом, в логе осядет примерно следующее:

2018/04/03 09:02:24 [error] 9256#9256: *1 NAXSI_FMT: ip=1.2.3.4&server=88.77.66.55&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$XSS&score0=8&zone0=ARGS&id0=1302&var_name0=lol, client: 1.2.3.4, server: localhost, request: "GET /?lol=%3Ckek%3E HTTP/1.1", host: "88.77.66.55"

Многие считают, что сам NAXSI гораздо проще того же ModSecurity (его мы тоже ставили в прошлых заметках), а теперь его ещё и собрать можно отдельным модулем, не переустанавливая при этом Nginx, и не добавляя в систему дополнительные репозитории — это конечно же, значительно упрощает жизнь сисадмину.

@SysadminNotes | https://sysadmin.pm

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *