
Устанавливаем 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.