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.

@SysadminNotes | https://sysadmin.pm

9 thoughts on “Nginx и ModSecurity

    1. Хм, почему-то антиспам не пропустил Ваш комментарий. Поправил этот момент. 🙂

      Нет, конкретно с этим можно ничего не делать. Всё должно собраться не смотря на эти сообщения.

  1. в modsecurity. conf желательно исправить
    SecAuditLog /var/log/nginx/modsec_audit.log а то SELinux ругается

    1. Таки да, там много изменений серьёзных случилось. Нужно будет обновить материал.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *