Что нового

Article [0] Защищаем NGINX. WAF

Vander

Команда форума
10.11.2019
388
818
Всем привет, в этом цикле публикаций мы разберем тему защиты web-сервера NGINX, поэтапно.

Начиная от установки WAF (Web Application Firewall) и заканчивая такими моментами, как снижение нагрузки на сервер и защита баз данных от постороннего вмешательства.

4.png

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

3.png

NGINX [engine x] — это HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения.

Чаще всего используется для обслуживания серверов высоконагруженных сайтов.

1.png

Web Application Firewall - Брандмауэр веб-приложений - фильтрует, отслеживает и блокирует HTTP-трафик в веб-приложение и из него. WAF отличается от обычного брандмауэра тем, что WAF может фильтровать содержимое определенных веб-приложений, в то время как обычные брандмауэры служат в качестве шлюза безопасности между серверами.

2.png

ModSecurity создан Иваном Ристиком (Ivan Ristic) в 2003 году и представляет собой firewall Web-приложений, который может использоваться как модуль Web-сервера Apache, либо работать в автономном режиме и позволяющий защитить Web-приложения как от известных, так и неизвестных атак.

Изначально ModSecurity разрабатывался только для Аpache, на данный момент он является кросс-платформенными решением и может быть установлен как на Apache, так и на Nginx и IIS.

У ModSecurity есть три основных состояния/режима работы - это:
  • Отключена обработка запроса правилами - SecRuleEngine Off.
  • Включена в режиме обучения, режим предназначен для первичной подгонки правил - SecRuleEngine DetectionOnly.
  • Правила активны и их срабатывание могут вызывать блокировку запросов или ответов от сервера, попавших под условия блокировки(есть возможность слушать и прогонять по правилам не только REQUEST, но и RESPONSE, прослушивание ответов от сервера с веб приложением нацелено в первую очередь на подавление выводов ошибок) - SecRuleEngine On.

5.png

Так как, мы защищаем Nginx с помощью ModSecurity, верным решением будет активировать основной набор правил OWASP (CRS) для защиты от следующих угроз.
  • Защита протокола HTTP/HTTPS
  • Общие сетевые атаки
  • Боты, сканеры, защита от вредоносных действий
  • Защита от троянских программ
  • Защита от утечки информации
  • Атаки с использованием Cross Site Scripting
  • SQL-инъекции
Приступим к реализации задуманного плана.

Компиляция Libmodsecurity:
  • Чтобы скомпилировать библиотеку Libmodsecurity, нам нужно сначала установить зависимости. Далее нам нужно скачать и скомпилировать исходный код Libmodsecurity.
Установка зависимостей:
  • Используйте следующую команду для установки пакетов, необходимых для библиотеки Libmodsecurity:
Код:
apt install libtool autoconf build-essential libpcre3-dev zlib1g-dev libssl-dev libxml2-dev libgeoip-dev liblmdb-dev libyajl-dev libcurl4-openssl-dev libpcre++-dev pkgconf libxslt1-dev libgd-dev
11.png

Скачиваем исходный код:
  • Используйте следующую команду, чтобы загрузить последнюю версию исходного кода Libmodsecurity.
Код:
git clone --depth 100 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
33.png

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

Код:
cd ModSecurity
git submodule init
git submodule update
21.png

Генерируем файл конфигурации:

Код:
./build.sh
23.png


  • fatal: No names found, cannot describe anything. – На это предупреждение не стоит обращать внимание, так как у нас нет тегов в репозитории.
Предварительный этап компиляции. Проверка зависимостей:

Код:
./configure
Успешный вывод должен выглядеть примерно так:

44.png

Компилируем исходный код:

Код:
make
Устанавливаем libmodsecurity в /usr/local/modsecurity/lib/libmodsecurity.so:

Код:
make install
Компиляция коннектора:

Требуется загрузка исходного кода Nginx и исходного кода для коннектора ModSecurity-nginx. При загрузке исходного кода Nginx убедитесь, что версия соответствует текущей установленной версии Nginx.

Хотя нам просто нужно скомпилировать коннектор ModSecurity-nginx, нам нужен исходный код Nginx.

Выполняем следующие шаги:

Скачиваем исходный код Nginx. Смотрите каталог: http://nginx.org/download/ для всех версий Nginx.

Код:
wget http://nginx.org/download/nginx-1.14.2.tar.gz
321.png

Распаковываем загруженный исходный код:

Код:
tar -xvzf nginx-1.14.2.tar.gz
Загружаем исходный код коннектора ModSecurity-nginx.

Код:
git clone https://github.com/SpiderLabs/ModSecurity-nginx
Переходим в папку с распакованным nginx и проверяем конфигурацию, при которой проводилась компиляция сервера:

Код:
nginx –V
Используя эту информацию, компилируем nginx следующей командой, включив в конце режим совместимости с динамическими модулями и указав путь к ModSecurity-nginx:

Код:
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.17.6/debian/debuild-base/nginx-1.17.6=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --with-compat --add-dynamic-module=/home/protey/Downloads/ModSecurity-nginx/
Успешным можно считать такой результат.

2121.png

Генерируем модули:

Код:
make
Далее, копируем модуль в Nginx.

Код:
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
Настройка коннектора:

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

После этого можно смело настраивать сам коннектор ModSecurity-nginx.

Загрузка модуля:

Добавляем следующую строку в файл /etc/nginx/nginx.conf.

Код:
load_module modules/ngx_http_modsecurity_module.so;
1313.png

Создайте папку modsec в папке конфигурации Nginx. Она будет содержать правила.

Код:
mkdir /etc/nginx/modsec
Загружаем набор правил OWASP:

Код:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
6466.png

Переименуйте файл конфигурации правил ModSecurity по умолчанию:

Код:
mv /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf.example /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf
Настройка ModSecurity:

Переименовываем и переносим файл конфигурации в директорию modsec.

Код:
cp /Downloads/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
Создайте файл конфигурации, который будет загружен Nginx. Этот файл загрузит файл конфигурации правил ModSec и файл конфигурации ModSec.

Код:
nano /etc/nginx/modsec/main.conf
Добавляем в этот файл:
  • Include /etc/nginx/modsec/modsecurity.conf
  • Include /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf
  • Include /etc/nginx/modsec/owasp-modsecurity-crs/rules/*.conf
7676.png

Проверяем конфигурацию nginx и перезагружаем его.

Код:
nginx –t
service nginx restart
Для того, чтобы модуль включился в работу, активируем его, прописав следующие строки в конфигурационном файле виртуального хоста:

Код:
nano /etc/nginx/sites-available/default
  • modsecurity on;
  • modsecurity_rules_file /etc/nginx/modsec/main.conf;
rrr.png

Если при проверке конфигурации nginx –t, вы встречаете ошибку:
  • Rules error. File: /etc/nginx/modsec/modsecurity.conf. Line: 236. Column: 17. Failed to locate the unicode map file from: unicode.mapping Looking at: 'unicode.mapping'
То правим этот файл /etc/nginx/modsec/modsecurity.conf закомментировав:
  • SecUnicodeMapFile unicode.mapping 20127
rre.png

Тестирование ModSecurity.

Мы можем протестировать ModSecurity, отправив подозрительный запрос на веб-сервер Nginx.

Следующая команда отправляет запрос curl, содержащий запрещенный пользовательский агент:

Код:
curl -H "User-Agent: nikto" http://localhost
Следующее событие должно быть зарегистрировано в файле журнала ModSecurity, /var/log/modsec_audit.log:

eec.png

Проверим, что сможет отыскать сканер Nikto на нашем сервере:

eve.png

Это как раз то, что я хотел увидеть, и совсем не то, действуй я со злым умыслом.

Вывод довольно скуден и малоинформативен по сравнению с серверами, где средствами защиты пренебрегли.

А журнал зафиксировал попытки сканирования.

Далее натравим на наш сервер Burp Suite Professional с самым агрессивным сканированием:

cece.png

В логи посыпались самые разнообразные сообщения, предупреждающие нас о попытках сканирования:

cecxx.png

Закончу испытания своего сервера я, пожалуй, Nmap’ом тоже в режиме агрессивного сканирования, не скрываясь.

xzz.png

Так как брандмауэр, далеко не единственная защита, которая будет рассмотрена в этом цикле статей, то вывод nmap, оказался не очень полезным, а WAF зарегистрировал попытки сканирования.

ed33.png

Все сообщения из логов, которые вы видели выше, указывают на то, что ModSecurity успешно обнаружил подозрительный запрос.

Однако запрос был разрешен до Nginx. Это связано с тем, что ModSecurity по умолчанию работает в режиме обнаружения, что означает, что он только регистрирует подозрительные запросы.

Чтобы включить ModSecurity для блокировки запросов, нам нужно отредактировать файл конфигурации: /etc/nginx/modsec/modsecurity.conf:
  • Изменив: SecRuleEngine DetectionOnly на SecRuleEngine On.
Далее нам нужно перезапустить Nginx. Теперь ModSecurity успешно перехватывает и блокирует такие запросы. Заблокированный запрос, также будет зарегистрирован.

На этом, первую часть можно считать завершённой.

Вывод:
  • Мы узнали, что такое WAF в целом, познакомились с Modsecurity WAF.
  • Научились настраивать и защищать web-сервер nginx с помощью WAF.
  • И полагаю, поняли, что защитой пренебрегать не стоит.
Спасибо за внимание, статья создана специально для protey.net.​
 
Последнее редактирование:

Klimer

Команда форума
28.11.2019
21
28
Добрый день.
Не подскажите бесплатный WAF для nginx кроме mod-security?
И на сколько сложно обойти mod-security с набором правил owasp?
Ибо слышал что буквально с помощью одного флага обходят, но сам я этого флага не видел. Да и не знаю в какой утилите есть этот флаг.
 

Vander

Команда форума
10.11.2019
388
818
Добрый день.
Не подскажите бесплатный WAF для nginx кроме mod-security?
И на сколько сложно обойти mod-security с набором правил owasp?
Ибо слышал что буквально с помощью одного флага обходят, но сам я этого флага не видел. Да и не знаю в какой утилите есть этот флаг.
ModSecurity
NAXSI
WebKnight
Shadow Daemon
 
Верх Низ