Nginx ·
Nginx и ModSecurity
Устанавливаем ModSecurity на сервер с Nginx и тестируем его работу. Сам Nginx забираем из репозиториев, а ModSecurity и нужный модуль собираем из исходников. Почти ModSecurity WAF для тех, у кого нет Nginx Plus.
Установка NGINX.
NGINX на сервер мы ставим из официального репозитория от разработчиков. Ставим, конечно же, актуальную версию (я предпочитаю mainline):
# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=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 -v
nginx 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 mods
load_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.