Защита Nginx с помощью NAXSI в Ubuntu 16.04

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

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

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

Требования

Для работы вам нужен сервер Ubuntu 16.04, полностью настроенный по этому мануалу.

1: Установка Nginx and NAXSI

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

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

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

Примечание: Этот мануал использует версию Nginx 1.14. Чтобы загрузить более современную версию, откройте станицу загрузок, выберите другой номер и укажите его в вышеприведенной команде. Рекомендуем использовать последнюю стабильную версию.

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

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

Примечание: В мануале используется версия NAXSI 0.56. Более новые релизы модуля можно найти на странице NAXSI на Github.

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

tar -xvf nginx-1.14.0.tar.gz

В этой команде флаг -x вызывает утилиту extract, -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 из исходного кода, вам понадобится компилятор C gcc, совместимая с 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 отключают ненужные почтовые протоколы, которые в противном случае были бы автоматически включены. Подробное объяснение этих параметров можно найти в официальной документации Nginx.

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

make

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

sudo make install

После этого у вас будет скомпилированная версия Nginx с модулем NAXSI. Чтобы 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

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

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-код, чтобы создать веб-страницу, где пользователь сможет узнать, что его запрос был заблокирован.

<html>
<head>
<title>Blocked By NAXSI</title>
</head>
<body>
<div style="text-align: center">
<h1>Malicious Request</h1>
<hr>
<p>This Request Has Been Blocked By NAXSI.</p>
</div>
</body>
</html>

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

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

sudo nano /etc/nginx/nginx.conf

Добавьте конфигурационные файлы NAXSI в конфигурацию Nginx, чтобы веб-сервер знал, как использовать NAXSI. Для этого вставьте выделенные строки кода в раздел http файла 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 и добавьте в него эту выделенную стоку:

. . .
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 запускается при перезагрузке сервера.

3: Сценарий для запуска Nginx

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

В данном мануале для этого используется Systemd. Создайте юнит-файл, чтобы система инициализации Systemd знала, как запускать сервис и управлять ним.

Создайте файл nginx.service:

sudo nano /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

В выводе вы увидите:

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 эффективно защищает ваш сервер.

4: Тестирование NAXSI

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

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

curl 'http://your_server_ip/?q="><script>alert(0)</script>'

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

<html>
<head>
<title>Blocked By NAXSI</title>
</head>
<body>
<div style="text-align: center">
<h1>Malicious Request</h1>
<hr>
<p>This Request Has Been Blocked By NAXSI.</p>
</div>
</body>
</html>

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

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

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

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

2018/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="><script>alert(0)</script> 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. Сервер должен выдать тот же ответ в терминале:

<html>
<head>
<title>Blocked By NAXSI</title>
</head>
<body>
<div style="text-align: center">
<h1>Malicious Request</h1>
<hr>
<p>This Request Has Been Blocked By NAXSI.</p>
</div>
</body>
</html>

Снова проверьте лог:

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

Последней записью в логе ошибок будет сообщение о попытке выполнить SQL-инъекцию:

2018/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, чтобы остановить tail и закрыть вывод из лога.

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

Заключение

Теперь у вас есть общее представление о том, как использовать NAXSI для защиты вашего веб-сервера от вредоносных запросов.

Читайте также:

Tags: , , ,