Устанавливаем ModSecurity WAF на NGINX

baltun

Администратор
Сообщения
10.733
Реакции
2.543
Баллы
2.003
Что такое брандмауэр веб-приложений и чем он отличается от сетевого брандмауэра? Сетевой брандмауэр отслеживает и контролирует входящий и исходящий сетевой трафик на основе заранее определенных правил. Обычно запрос, который является вредоносным запросом или атакой, будет выглядеть как правильный трафик к сетевому брандмауэру. Существуют сетевые брандмауэры следующего поколения, которые поддерживают приложения, но они являются частью стека инфраструктуры, а не стека приложений. Брандмауэр веб-приложений будет защищать от атак на уровне приложения как часть стека приложений. По мере разработки и тестирования приложения политики и правила WAF будут частью процесса и будут развернуты вместе со стеком. WAF в рамках безопасности Layer 7 или HTTP Layer будет проверять HTTP-трафик и в зависимости от правил будет предупреждать, регистрировать или блокировать запрос.

Устанавливаем необходимые пакеты для компиляции:
Код:
yum install gcc make automake curl curl-devel httpd-devel autoconf libtool pcre pcre-devel libxml2 libxml2-devel

Компиляция кода ModSecurity:
Код:
$ 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 для NGINX в качестве динамического модуля:
Код:
$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

Определите, какая версия Nginx установлена и скачайте исходный код для этой конкретной версии с официального сайта.
Код:
$ nginx -v
nginx version: nginx/1.20.1
Get the source code
$ wget http://nginx.org/download/nginx-1.20.1.tar.gz
$ tar -xvzmf nginx-1.20.1.tar.gz

Модули должны быть скомпилированы с теми же параметрами, что и nginx на вашем сервере.
Код:
$ cd nginx-1.14.1.tar.gz
$ ./configure <original configuration here> --add-dynamic-module=../ModSecurity-nginx
$ make modules
$ cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
//Если у вас ISPmanager
$ cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules

Добавьте следующую директиву load_module в конфигурационный файл /etc/nginx/nginx.conf
Код:
load_module modules/ngx_http_modsecurity_module.so;

Проще иметь отдельную папку, где можно сохранить все конфигурационные файлы modSecurity. Здесь мы будем использовать стандартную рекомендацию для конфигурационного файла от TrustWave SpiderLabs текущего сопровождающего проекта ModSecurity.
Код:
$ mkdir /etc/nginx/modsec
$ wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
$ mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf

По умолчанию конфигурация в этом файле имеет значение DetectionOnly, что означает, что вредоносные запросы будут обнаружены и зарегистрированы, но не будут удалены. Измените директиву на активное отбрасывание запросов. Я бы порекомендовал сделать это на промежуточном экземпляре и протестировать приложение, прежде чем запускать его в любом рабочем экземпляре.
1_DwHA52GEkrbsq6c-carXSw.png
Для этих целей мы настроим пару простых правил. Поместите следующий текст в /etc/nginx/modsec/main.conf
Код:
Include "/etc/nginx/modsec/modsecurity.conf"
# Basic test rule
SecRule ARGS:blogtest "@contains test" "id:1111,deny,status:403"
SecRule REQUEST_URI "@beginsWith /admin" "phase:2,t:lowercase,id:2222,deny,msg:'block admin'"

  • Правило 1 гласит, что если есть параметр запроса с именем «blogtest» со значением «test» в нем, удалите запрос.
  • Правило 2 говорит, что если есть URI, который начинается с администратора, удалите запрос.
До сих пор все, что мы сделали, это установили модуль, попросили NGINX загрузить его и настроили некоторую конфигурацию для модуля. Это не означает, что настроенные серверы начнут использовать конфигурации. Нам нужно включить этот модуль для хостов, которые мы хотим охватить, добавив следующие две директивы:
Код:
server {
    # Other server directives here
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
}

Так же вы можете его включить для определенных директив:
Код:
server {
    listen 443;
    # modsecurity on; # All traffic over 443 have ModSec on
 
    location / {
       proxy_pass http://127.0.0.1:8080;
       modsecurity off; # ModSec off by default
    }
    location /waf {
       proxy_pass http://127.0.0.1:8080;
       modsecurity on;
       modsecurity_rules_file /etc/nginx/modsec/main.conf;
       error_log /var/log/nginx/waf.log;
    }
}

Давайте выполним несколько запросов curl, чтобы проверить наши простые правила, созданные ранее.
Код:
$ curl http://localhost/adminaccess
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
$ curl http://localhost/admin-login
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
$ curl https://localhost?blogtest=thisistestparam
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

Не существует такого понятия, как достаточная безопасность. Наличие безопасности на разных уровнях смягчает угрозу в большей степени, чем наличие одного уровня безопасности. Брандмауэры веб-приложений выступают в качестве последней линии защиты от вредоносной атаки. ModSecurity - это проект с открытым исходным кодом, который легко сочетается с NGINX, а также имеет возможность применять основные наборы правил OWASP. Это делает его хорошим местом для начала защиты ваших приложений.
 
Назад
Верх Низ