Как защитить Nginx с помощью NAXSI в Ubuntu 16.04

Автор выбралThe OWASP Foundation для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Nginx - это популярный HTTP-сервер с открытым исходным кодом и обратный прокси-сервер, известный своей стабильностью, простой конфигурацией и скромными требованиями к ресурсам. Вы можете значительно повысить безопасность своего сервера Nginx, используя такой модуль, как NAXSI. NAXSI (Nginx Anti XSS & SQL Injection) - это бесплатный сторонний модуль Nginx, который предоставляет функции брандмауэра веб-приложений. NAXSI анализирует, фильтрует и защищает трафик, поступающий в ваше веб-приложение, и действует как брандмауэр DROP по умолчанию, что означает, что он блокирует весь трафик, попадающий на его пути, если не указано иное, чтобы специально разрешить доступ.

Простота, с которой пользователь может управлять доступом, является ключевой особенностью, которая отличает NAXSI от других межсетевых экранов веб-приложений (WAF) с аналогичными функциями, такими какModSecurity. Хотя ModSecurity поставляется с богатым набором функций, поддерживать его сложнее, чем NAXSI. Это делает NAXSI простым и адаптируемым выбором, который предоставляет легко доступные правила, которые хорошо работают с популярными веб-приложениями, такими как WordPress.

В этом руководстве вы будете использовать NAXSI для защиты Nginx на вашем сервере Ubuntu 16.04. Поскольку модуль NAXSI по умолчанию не поставляется с пакетом Nginx, вам необходимо скомпилировать Nginx из исходного кода с помощью NAXSI. К концу этого урока вы узнаете, какие виды атак может блокировать NAXSI и как настраивать правила NAXSI.

Предпосылки

Для завершения этого урока вам понадобится:

  • Один сервер Ubuntu 16.04, настроенный следующим образомthe Ubuntu 16.04 initial server setup guide, включая пользователя sudo без полномочий root и брандмауэр.

[[step-1 -—- install-nginx-and-naxsi]] == Шаг 1. Установка Nginx и NAXSI

Большинство модулей Nginx недоступны через репозитории, и NAXSI не является исключением. Из-за этого вам придется вручную загружать и компилировать Nginx из исходного кода с помощью NAXSI.

Сначала загрузите Nginx, используя следующую команду.

[.note] #Note: В этом руководстве используется версия 1.14 Nginx. Чтобы использовать более новую версию, вы можете посетитьthe download page и заменить выделенный текст в предыдущей команде на обновленный номер версии. Рекомендуется использовать последнюю стабильную версию.
#

wget http://nginx.org/download/nginx-1.14.0.tar.gz

Затем загрузите NAXSI из стабильной версии 0.56 на Github.

[.note] #Note: В этом руководстве используется версия 0.56 NAXSI. Вы можете найти более свежие выпуски наNAXSI Github page. Рекомендуется использовать последнюю стабильную версию.
#

wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi

Как вы могли заметить, репозиторий Nginx представляет собой архивtar. Сначала вам нужно извлечь его, чтобы можно было скомпилировать и установить, что вы можете сделать с помощью командыtar.

tar -xvf nginx-1.14.0.tar.gz

В предыдущей команде-x указывает утилиту извлечения,-v запускает утилиту в подробном режиме, а-f указывает имя файла архива для извлечения.

Теперь, когда вы извлекли файлы Nginx, вы можете перейти к извлечению файлов NAXSI, используя следующую команду:

tar -xvf naxsi

Теперь у вас есть папкиnaxsi-0.56 иnginx-1.14.0 в вашем домашнем каталоге. Используя только что загруженные и извлеченные файлы, вы можете скомпилировать сервер Nginx с помощью NAXSI. Перейдите в каталогnginx-1.14.0

cd nginx-1.14.0

Чтобы скомпилировать Nginx из исходного кода, вам понадобится компилятор Cgcc, библиотека Perl-совместимых регулярных выраженийlibpcre3-dev иlibssl-dev, которая реализует криптографические протоколы SSL и TLD. Эти зависимости можно добавить с помощью командыapt-get.

Сначала выполните следующую команду, чтобы убедиться, что у вас есть обновленный список пакетов.

sudo apt-get update

Затем установите зависимости:

sudo apt-get install build-essential libpcre3-dev libssl-dev

Теперь, когда у вас есть все ваши зависимости, вы можете скомпилировать Nginx из исходного кода. Чтобы подготовить Nginx к компиляции из исходников в вашей системе, выполните следующий скрипт, который создастMakefile, показывающий, где найти все необходимые зависимости.

./configure \
--conf-path=/etc/nginx/nginx.conf \
--add-module=../naxsi-0.56/naxsi_src/ \
--error-log-path=/var/log/nginx/error.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-log-path=/var/log/nginx/access.log \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--without-mail_pop3_module \
--without-mail_smtp_module \
--without-mail_imap_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--prefix=/usr

Каждая из строк предыдущей команды определяет параметр для веб-сервера Nginx. Наиболее важными из них являются параметр--add-module=../naxsi-0.56/naxsi_src/, который связывает модуль NAXSI с Nginx, и параметры--user=www-data и--group=www-data, которые заставляют Nginx запускаться с правами пользователя и группы выделенного пользователь / группа с именемwww-data, которая поставляется с вашим сервером Ubuntu 16.04. Параметр--with-http_ssl_module позволяет серверу Nginx использовать шифрование SSL, а параметры--without-mail_pop3_module,--without-mail_smtp_module и--without-mail_imap_module отключают ненужные почтовые протоколы, которые в противном случае были бы включены автоматически. Для дальнейшего объяснения этих параметров см.official Nginx docs.

После использования команды./configure запустите командуmake, чтобы запустить серию задач, определенных вMakefile, которые вы только что создали, для сборки программы из исходного кода.

make

Когда Nginx собран и готов к запуску, используйте командуmake install в качестве суперпользователя, чтобы скопировать созданную программу и ее библиотеки в правильное место на вашем сервере.

sudo make install

Как только это произойдет, у вас будет скомпилированная версия Nginx с модулем NAXSI. Чтобы заставить NAXSI начать блокировать нежелательный трафик, теперь вам нужно установить набор правил, на которые NAXSI будет действовать, создавая серию файлов конфигурации.

[[step-2 -—- configuring-naxsi]] == Шаг 2 - Настройка NAXSI

Самая важная часть работы брандмауэра - это его правила, которые определяют, как запросы блокируются сервером. Базовый набор правил, который по умолчанию поставляется с NAXSI, называетсяcore rules. Эти правила предназначены для поиска шаблонов в частях запроса и фильтрации тех, которые могут быть атаками. Основные правила NAXSI применяются глобально к серверу для сопоставления подписи.

Чтобы настроить Nginx для использования этих основных правил, скопируйте файлnaxsi_core.rules в каталог конфигурации Nginx.

sudo cp ~/naxsi-0.56/naxsi_config/naxsi_core.rules /etc/nginx/

Теперь, когда основные правила установлены, добавьте основные правила Naxsi, которые включают и реализуют основные правила для каждого местоположения и назначают действия для сервера, которые необходимо выполнить, когда запрос URL не удовлетворяет основным правилам. Создайте файл с именемnaxsi.rules внутри каталога/etc/nginx/. Для этого используйте следующую команду, чтобы открыть файл в текстовом редакторе с именем nano, или используйте выбранный текстовый редактор.

sudo nano /etc/nginx/naxsi.rules

Добавьте следующий блок кода, который определяет некоторые основные правила брандмауэра.

/etc/nginx/naxsi.rules

 SecRulesEnabled;
 DeniedUrl "/error.html";

 ## Check for all the rules
 CheckRule "$SQL >= 8" BLOCK;
 CheckRule "$RFI >= 8" BLOCK;
 CheckRule "$TRAVERSAL >= 4" BLOCK;
 CheckRule "$EVADE >= 4" BLOCK;
 CheckRule "$XSS >= 8" BLOCK;

Предыдущий код определяетDeniedUrl, то естьURL, на который NAXSI будет перенаправлять, когда запрос заблокирован. Файл также включает контрольный список различных видов атак, которые NAXSI должен блокировать, включая внедрение SQL, межсайтовый скриптинг (XSS) и удаленное включение файла (RFI). После добавления предыдущего кода в файл сохраните и выйдите из текстового редактора.

Поскольку вы перенаправили заблокированные запросы на/error.html, теперь вы можете создать файлerror.html в каталоге/usr/html, чтобы предоставить этому месту назначения целевую страницу. Откройте файл в вашем текстовом редакторе:

sudo nano /usr/html/error.html

Затем добавьте следующий HTML-код в файл, чтобы создать веб-страницу, которая позволит пользователю узнать, что его запрос был заблокирован:

/usr/html/error.html


  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Сохраните файл и выйдите из редактора.

Затем откройте файл конфигурации Nginx/etc/nginx/nginx.conf в текстовом редакторе.

sudo nano /etc/nginx/nginx.conf

Чтобы добавить файлы конфигурации NAXSI в конфигурацию Nginx, чтобы веб-сервер знал, как использовать NAXSI, вставьте выделенные строки кода в разделhttp файлаnginx.conf:

/etc/nginx/nginx.conf

. . .
http {
    include       mime.types;
    include /etc/nginx/naxsi_core.rules;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


    default_type  application/octet-stream;
. . .

Затем в разделеserver того же файла добавьте следующую выделенную строку:

/etc/nginx/nginx.conf

. . .
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        include /etc/nginx/naxsi.rules;
            root   html;
            index  index.html index.htm;
        }
. . .

Теперь, когда вы настроили Nginx с основными и базовыми правилами для NAXSI, брандмауэр будет блокировать соответствующие вредоносные запросы при запуске веб-сервера. Затем вы можете написать скрипт запуска, чтобы Nginx запускался при перезагрузке сервера.

[[step-3 -—- created-the-startup-script-for-nginx]] == Шаг 3 - Создание сценария запуска для Nginx

Поскольку вы установили Nginx вручную, следующим шагом будет создание сценария запуска для автоматического запуска веб-сервера при перезагрузке системы.

В этом руководстве для создания сценария используется программный пакет Systemd. Для этого вы создадите файл модуля (см.Understanding Systemd Units and Unit Files для дальнейшего изучения), чтобы настроить, как Systemd должен запускать и управлять службой Nginx.

Создайте файл с именемnginx.service и откройте его в текстовом редакторе:

sudo nano /lib/systemd/system/nginx.service

Добавьте следующие строки в файл:

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Раздел[Unit] определяет программу, которую вы настраиваете,[Service] описывает, как Nginx должен вести себя при запуске, а[Install] предоставляет информацию об установке модуля. Как только вы добавите эти строки в файлnginx.service,systemd будет знать, как запустить Nginx.

Затем Nginx нужна папка для временного хранения данных входящего запроса перед их обработкой на тот случай, если на вашем сервере недостаточно памяти. Поскольку вы установили Nginx из исходного кода, вам нужно будет создать каталог, который Nginx сможет использовать для хранения этих данных. Создайте каталог с именемbody внутри/var/lib/nginx:

sudo mkdir -p /var/lib/nginx/body

После настройки сценария запуска вы сможете запускать сервер Nginx.

Используйте следующую команду для запуска сервера.

sudo systemctl start nginx

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

sudo systemctl status nginx

В вашем терминале вы увидите следующий вывод о том, что сервер успешно запущен:

Output● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-11-05 13:59:40 UTC; 1s ago
  Process: 16199 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 16194 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 16201 (nginx)
    Tasks: 2
   Memory: 1.3M
      CPU: 17ms
   CGroup: /system.slice/nginx.service
           ├─16201 nginx: master process /usr/sbin/ngin
           └─16202 nginx: worker proces
. . .

Теперь у вас есть работающий сервер Nginx, защищенный NAXSI. Следующим шагом является запуск имитации атаки XSS и SQL-инъекций, чтобы гарантировать, что NAXSI эффективно защищает ваш сервер.

[[step-4 -—- testing-naxsi]] == Шаг 4. Тестирование NAXSI

Чтобы проверить, что Nginx запущен и работает с включенным модулем NAXSI, вы попытаетесь установить на сервере вредоносные HTTP-запросы и проанализировать ответы.

Сначала скопируйте общедоступный IP-адрес вашего сервера и используйте командуcurl, чтобы сделать вредоносный запрос к серверу Nginx.

curl 'http://your_server_ip/?q=">'

Этот URL-адрес включает сценарий XSS"><script>alert(0)</script> в параметреq и должен быть отклонен сервером. Согласно правилам NAXSI, которые вы установили ранее, вы будете перенаправлены в файлerror.html и получите следующий ответ:

Output
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Брандмауэр NAXSI заблокировал запрос.

Теперь проверьте то же самое, используя журнал Nginx, следя за журналом сервера Nginx, используя следующую команду:

tail -f /var/log/nginx/error.log

В журнале вы увидите, что запрос XSS с удаленного IP-адреса блокируется NAXSI:

Output2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=1&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=8&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q="> HTTP/1.1", host: "your_server_ip"

НажмитеCTRL-C, чтобы выйти изtail и остановить вывод файла журнала ошибок.

Затем попробуйте другой URL-запрос, на этот раз с вредоносным запросом SQL-инъекции.

curl 'http://your_server_ip/?q=1" or "1"="1"'

Частьor "1"="1" предыдущего URL-адреса может раскрывать данные пользователя в базе данных и будет заблокирована NAXSI. Он должен выдать такой же ответ в терминале:

Output
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Теперь используйтеtail, чтобы снова следить за журналом сервера:

tail -f /var/log/nginx/error.log

В файле журнала вы увидите заблокированную запись для попытки SQL-инъекции:

Output2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$SQL&score0=40&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: "your_server_ip"

НажмитеCTRL-C, чтобы выйти из журнала.

Теперь NAXSI успешно заблокировал атаку XSS и SQL-инъекцией, что доказывает, что NAXSI настроен правильно и ваш веб-сервер Nginx защищен.

Заключение

Теперь у вас есть общее представление о том, как использовать NAXSI для защиты вашего веб-сервера от вредоносных атак. Чтобы узнать больше о настройке Nginx, см.How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04. Если вы хотите продолжить изучение безопасности на веб-серверах, ознакомьтесь сHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 иHow To Create a Self-Signed SSL Certificate for Nginx in Ubuntu 16.04.

Related