Nginx и ModSecurity

nginx сборка модуля ModSecurity

Устанавливаем ModSecurity на сервер с Nginx и тестируем его работу. Сам Nginx забираем из репозиториев, а ModSecurity и нужный модуль собираем из исходников. Почти ModSecurity WAF для тех, у кого нет Nginx Plus.

Установка NGINX.

NGINX на сервер мы ставим из официального репозитория от разработчиков. Ставим, конечно же, актуальную версию (я предпочитаю mainline):

# cat /etc/yum.repos.d/nginx.repo [nginx]name=nginx repobaseurl=http://nginx.org/packages/mainline/centos/7/$basearch/gpgcheck=1enabled=1# wget http://nginx.org/keys/nginx_signing.key# rpm —import nginx_signing.key# yum install nginx

Установка ModSecurity.

Устанавливаем на сервер необходимые для сборки ModSecurity пакеты:

# yum install git libcurl-devel libxml2-devel pcre-devel libtool autoconf gcc-c++ openssl-devel

Забираем v3 ветку модсека с гитхаба и собираем её. На ошибку вида fatal: No names found, cannot describe anything. можно не обращать внимания в данном случае:

# cd /usr/local/src/

# git clone —depth 1 -b v3/master —single-branch https://github.com/SpiderLabs/ModSecurity

# cd ModSecurity

# git submodule init

# git submodule update

# ./build.sh

# ./configure

# make

# make install

Установка ModSecurity Connector.

Для сборки модуля нам потребуются исходники установленной на сервере версии NGINX и исходники модуля NGINX Connector для ModSecurity.

Проверяем какая версия nginx установлена на сервере и скачиваем её с Github:

# nginx -vnginx version: nginx/1.13.5

# cd /usr/local/src/

# wget http://nginx.org/download/nginx-1.13.5.tar.gz

# tar xvfz nginx-1.13.5.tar.gz

С гитхаба же, забираем исходники NGINX Connector’a для ModSecurity:

# cd /usr/local/src/

# git clone —depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

Собираем нужный нам модуль и устанавливаем его:

# cd /usr/local/src/nginx-1.13.5

# ./configure —with-http_ssl_module —with-compat —add-dynamic-module=../ModSecurity-nginx

# make modules

# cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules

Подключаем модуль в конфиге nginx:

# cat /etc/nginx/nginx.conf | grep modsload_module modules/ngx_http_modsecurity_module.so;

Настройка и тестирование ModSecurity.

Скачиваем конфигурационный файл, и включаем блокировку проблемного трафика в SecRuleEngine параметре:

# mkdir /etc/nginx/modsec

# wget -O /etc/nginx/modsec/modsecurity.conf https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/modsecurity.conf-recommended

# sed -i ‘s/SecRuleEngine DetectionOnly/SecRuleEngine On/’ /etc/nginx/modsec/modsecurity.conf

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

# cat /etc/nginx/modsec/main.conf
Include «/etc/nginx/modsec/modsecurity.conf»SecRule ARGS:testparam «@contains testmodsec» «id:123456,deny,status:403»

Для нужного виртуалхоста прописываем директивы modsecurity и modsecurity_rules_file:

server {
# ... 
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;
# ...
}

Проверяем, корректна ли конфигурация:

# nginx -t

В случае возникновения ошибки вида:

nginx: [emerg] «modsecurity_rules_file» directive Rules error. File: /etc/nginx/modsec/modsecurity.conf. Line: 37. Column: 33. As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer supported.

Просто закомментируем в файле /etc/nginx/modsec/modsecurity.conf параметр SecRequestBodyInMemoryLimit.

Убедившись что конфиг не содержит ошибок, перезапускаем nginx, а после со стороннего сервера выполняем тестовый запрос (на основе того правила что мы написали ранее):

# curl 38.8.7.10?testparam=testmodsec

<html><head><title>403 Forbidden</title></head><body bgcolor=»white»><center><h1>403 Forbidden</h1></center><hr><center>nginx/1.13.5</center></body></html>

Можно увидеть, что тестовое правило ModSecurity отработало и соединение с тестовыми параметрами было заблокировано. В итоге, мы получили почти то же самое, что даёт ModSecurity WAF для Nginx Plus.

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!