Собираем и запускаем в работу модуль 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, и не добавляя в систему дополнительные репозитории — это конечно же, значительно упрощает жизнь сисадмину.
One thought on “Nginx NAXSI WAF”