Установка ModSecurity в NGINX на CentOS 7

Доброго времени суток, уважаемые читатели. Сегодня статья на тему: "Установка ModSecurity в NGINX на CentOS 7". Как можно обезопасить веб-сайт от атак, с использованием уязвимостей на уровне веб-приложения? Для данных целей можно использовать WAF – Firewall для веб-приложений.
ModSecurity – это ПО, выполняющее функции Firewall на уровне веб-приложения (защита от XSS, SQL Injection и т.д.)
- В этой статье мы рассмотрим установку ModSecurity, в качестве динамического подключаемого модуля, для веб-сервера NGINX, в операционной системе CentOS 7. Установку будем производить, на уже работающем NGINX.
- Готового пакета ModSecurity для NGINX не существует, поэтому нам нужно будет производить сборку из необходимых исходников.
При обновлении NGINX, нужно будет производить полную пересборку, так как модуль будет привязан к версии NGINX.
Установка необходимых пакетов
- Прежде всего, нужно скачать необходимые для сборки пакеты.
# yum install git libcurl-devel libxml2-devel pcre-devel libtool wget make autoconf gcc-c++ openssl-devel
Компиляция ModSecurity
- Заходим в рабочую директорию, в которой будем производить все манипуляции.
# cd /usr/local/src/
- Клонируем исходники ModSecurity из github.
# git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
- Переходим в папку с ModSecurity, и выполняем компиляцию.
# cd ModSecurity
# git submodule init
# git submodule update
# ./build.sh
# ./configure
# make
# make install
Клонирование коннектора
- Так как мы не будем встраивать ModSecurity в NGINX, а будем подключать его в качестве динамического модуля, нам понадобится коннектор.
- Возвращаемся в рабочую директорию, и клонируем коннектор с github.
# cd /usr/local/src/
# git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
Скачивание копии работающего NGINX
- Чтобы модуль работал, нам нужно произвести сборку на основе используемого NGINX.
- Узнаём версию используемого NGINX, и скачиваем нужный архив с официального сайта.
# nginx -v

# wget http://nginx.org/download/nginx-1.16.1.tar.gz
- Разархивируем архив, и переходим в папку с NGINX.
# tar xvfz nginx-1.16.1.tar.gz
# cd /usr/local/src/nginx-1.16.1
Сборка и подключение модуля
- Теперь можно запускать сборку модуля.
# ./configure --with-http_ssl_module --with-compat --add-dynamic-module=../ModSecurity-nginx
# make modules
- Копируем собранный модуль, в директорию для модулей Nginx.
# cp objs/ngx_http_modsecurity_module.so /etc/nginx
- Для подключения модуля, нужно произвести его подключение в конфигурационном файле /etc/nginx/nginx.conf.
load_module /etc/nginx/ngx_http_modsecurity_module.so;

Конфигурация ModSecurity
- Теперь нужно настроить конфигурацию ModSecurity, для этого нужно скачать файл, с конфигурацией рекомендуемой разработчиками.
- Создаём директорию, в которой будут находится нужные файлы для работы ModSecurity. Переходим в неё, и скачиваем рекомендуемый файл.
# mkdir /etc/nginx/modsec
# cd /etc/nginx/modsec
# wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
- Переименовываем скачанный файл в modsecurity.conf.
# mv modsecurity.conf-recommended modsecurity.conf
- Чтобы установить ModSecurity в боевой режим, нужно в файле modsecurity.conf, произвести некоторые изменения:
Найти строчку
SecRuleEngine DetectionOnly
и изменить её на
SecRuleEngine On
- Далее создаём файл /etc/nginx/modsec/main.conf, в котором будет производиться подключение всех настроек и правил, и подключаем в нём файл от разработчиков.
Include /etc/nginx/modsec/modsecurity.conf
Подключение правил от OWASP
- По умолчанию разработчики предоставляют только базовый набор правил. Для усиления защиты, мы будем использовать подборку правил от OWASP, созданную специально для ModSecurity.
- Заходим в рабочую директорию, скачиваем архив с правилами, и разархивируем его.
# cd /usr/local/src
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.0.0.tar.gz
# tar -xzvf v3.0.0.tar.gz
- Заходим в папку с правилами, и копируем с переименованием файл crs-setup.conf.example.
# cd /usr/local/src/owasp-modsecurity-crs-3.0.0
# cp crs-setup.conf.example crs-setup.conf
- Возвращаемся к файлу /etc/nginx/modsec/main.conf, в котором производим подключение правил OWASP. Добавляем две строчки.
Include /usr/local/src/owasp-modsecurity-crs-3.0.0/crs-setup.conf
Include /usr/local/src/owasp-modsecurity-crs-3.0.0/rules/*.conf
Активация модуля и конфигурации
- Теперь можно активировать модуль и конфигурацию. Добавляем в файл /etc/nginx/nginx.conf, две строчки.
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

- Проверяем конфигурацию NGINX.
# nginx -t
Исправление возможных ошибок
- В зависимости от конфигурации Вашего NGINX, может понадобится исправить две ошибки.
- Первая связана с Unicode. Открываем файл /etc/nginx/modsec/modsecurity.conf, находим и закомментируем в нём строчку.
# SecUnicodeMapFile unicode.mapping 20127

- Вторая возможная ошибка, связана с одним из файлов правил OWASP, его можно просто удалить.
# rm /usr/local/src/owasp-modsecurity-crs-3.0.0/rules/REQUEST-910-IP-REPUTATION.conf
- Ещё раз проверяем конфигурацию NGINX, и перезапускаем его.
# nginx -t
# systemctl restart nginx
Проверка работы ModSecurity
- ModSecurity работает в боевом режиме, по правилам безопасности от OWASP. Можно проверить его работу.
- Открываем браузер, вводим доменное имя или ip-адрес, ставим слеш, а после него вставляем зловредный запрос, и жмём «Enter».
http://ВАШ_САЙТ.ru/?q=">
- В итоге получаем 403 ошибку, означающую, что доступ запрещён. В логах NGINX, появляется запись о блокировке ModSecurity вредоносного запроса.
- ModSecurity отработал как положено.

Сегодня мы рассмотрели тему: "Установка ModSecurity в NGINX на CentOS 7". Произвели установку ModSecurity, в качестве динамического модуля в NGINX на CentOS 7. Смотрите также видео по теме.
Надеюсь статья была вам полезна. До встречи в новых статьях.
✍
С уважением, Андрей Бондаренко.
Видео на тему "Установка ModSecurity в NGINX на CentOS 7":

WMZ-кошелёк = Z667041230317
«Linux»
Igor
Добрый день!
Спасибо за детальную инструкцию по установки данного продукта, все работает!
Но у меня возник вопрос, как можно настроить исключения для POST запроса сайта, в логах выдает :
2022/05/17 10:04:48 [error] 21959#21959: *733174 [client ИП] ModSecurity: Access denied with code 403 (phase 2). Matched «Operator `Ge’ with parameter `5′ against variable `TX:ANOMALY_SCORE’ (Value: `5′ ) [file «/usr/local/src/owasp-modsecurity-crs-3.2.0/rules/REQUEST-949-BLOCKING-EVALUATION.conf»] [line «79»] [id «949110»] [rev «»] [msg «Inbound Anomaly Score Exceeded (Total Score: 5)»] [data «»] [severity «2»] [ver «»] [maturity «0»] [accuracy «0»] [tag «application-multi»] [tag «language-multi»] [tag «platform-multi»] [tag «attack-generic»] [hostname «ИП»] [uri «/landSell-priorityEnglish/procedures/update/75457»] [unique_id «1652771088»] [ref «»], client: ИП, server: мой_сайт, request: «POST /landSell-priorityEnglish/procedures/update/75457?return_url=%2FlandSell-priorityEnglish%2Fprocedures%2Fview%2F75457 HTTP/1.1», host: «мой_сайт», referrer: «https://мой_сайт/landSell-priorityEnglish/procedures/update/75457?return_url=%2FlandSell-priorityEnglish%2Fprocedures%2Fview%2F75457»
Андрей Бондаренко
Здравствуйте.
Почитайте документацию: https://github.com/SpiderLabs/ModSecurity/wiki/