Установка и настройка NGINX WAF

Установка и настройка NGINX WAF

Установка и настройка NGINX WAF

Начало

Безопасность модов - это бесплатный брандмауэр веб-приложений (WAF), который работает с Apache, Nginx и IIS. Он поддерживает гибкий механизм правил для выполнения простых и сложных операций и поставляется с базовым набором правил (CRS) с правилами для SQL-инъекций, межсайтового скриптинга, троянов, плохих пользовательских агентов, перехвата сеанса и многих других злоупотреблений. Это дополнительный модуль для Apache, который упрощает установку и настройку.

LAMP должен быть установлен на вашем сервере для выполнения этого руководства.

Modsecurity доступен в репозитории Debian / Ubuntu:

apt-get install libapache2-modsecurity

Убедитесь, что модуль mod_security загружен.

apachectl -M | grep --color security

Вы должны увидеть модуль с именем security2_module (shared) указывающий, что модуль загружен.

Установка Modsecurity включает рекомендуемый файл конфигурации, который следует переименовать:

mv /etc/modsecurity/modsecurity.conf{-recommended,}

Переустановите Apache

service apache2 reload

Вы найдете новый файл журнала для mod_security в каталоге журналов Apache:

root@droplet:~# ls -l /var/log/apache2/modsec_audit.log
-rw-r----- 1 root root 0 Oct 19 08:08 /var/log/apache2/modsec_audit.log

Настройка Mod_security
По умолчанию modsecurity ничего не делает, потому что для работы нужны правила. Конфигурационный файл по умолчанию установлен на DetectionOnly, который регистрирует запросы на основе совпадений правил и ничего не блокирует. Это можно изменить, отредактировав файл modsecurity.conf:

nano /etc/modsecurity/modsecurity.conf

Найдите эту строку

SecRuleEngine DetectionOnly

И измените его на это:

SecRuleEngine On

Если вы пытаетесь это сделать на производственном сервере, измените эту директиву только после тестирования всех ваших правил.

Другая директива которую необходимо изменить,  это SecResponseBodyAccess. Это настраивает, защищены ли response body (например, читаются с помощью modsecurity). Это необходимо только при необходимости обнаружения утечки данных и защиты. Поэтому если оставить его включенным, будут использоваться ресурсы капли и увеличится размер файла журнала.

Найдите это

SecResponseBodyAccess On

И измените его на:

SecResponseBodyAccess Off

Теперь мы собираемся ограничить максимальное количество данных, которые могут быть отправлены в ваше веб-приложение. Их настраивают две директивы:

SecRequestBodyLimit
SecRequestBodyNoFilesLimit

Директива SecRequestBodyLimit устанавливает максимальный размер данных POST. Если клиент отправляет что-то большее, сервер отвечает ошибкой 413 Request Entity Too Large. Это значение можно значительно уменьшить, если в вашем веб-приложении нет файлов для загрузки.

Значение, указанное в файле конфигурации:

SecRequestBodyLimit 13107200

Это 12,5 МБ.

Похожая на это директива SecRequestBodyNoFilesLimit. Единственное отличие состоит в том, что эта директива ограничивает размер данных поста за вычетом загрузки файлов. Это значение должно быть «as low as practical».

Значение в файле конфигурации;

SecRequestBodyNoFilesLimit 131072

Это 128 КБ.

В этих инструкциях есть еще одна вещь, которая влияет на производительность сервера: SecRequestBodyInMemoryLimit. Эта директива в значительной степени не требует пояснений. Это определяет, какая часть данных «request body» (данные POST) должна храниться в памяти (ОЗУ), а другая, на жестком диске (например, при подкачке). Поскольку они используют твердотельные накопители Droplet (виртуальный сервер), это не слишком большая проблема. Но если у вас все еще есть место в ОЗУ для хранения, его можно установить с подходящей стоимостью.

SecRequestBodyInMemoryLimit 131072

Это значение (128 КБ), указанное в файле конфигурации.

 

Тестирование привязки SQL

Прежде чем продолжить настройку правил, мы создадим и опробуем PHP-скрипт, открытый для SQL Binding. Обратите внимание, что это просто базовый сценарий входа в систему PHP без обработки сеанса. Не забудьте изменить пароль MySQL в следующем скрипте для подключения к базе данных:

/var/www/login.php
            Username: 

            Password: 

            
        


Этот сценарий отобразит входной файл. При вводе правильных учетных данных отобразится сообщение «Секрет для вас».

Нам нужны учетные данные в базе данных. Создайте базу данных MySQL и таблицу, затем введите имя пользователя и пароли.

mysql -u root -p

Это вас

mysql>

перенесет в командную строку.

create database sample;
connect sample;
create table users(username VARCHAR(100),password VARCHAR(100));
insert into users values('jesin','pwd');
insert into users values('alice','secret');
quit;

Откройте браузер, перейдите на http://yourwebsite.com/login.php и введите правильную пару идентификаторов.

Username: jesin
Password: pwd

Вы увидите сообщение об успешном входе в систему. Теперь вернитесь и введите неправильную пару идентификаторов. Вы увидите сообщение "Неверное имя пользователя или пароль". Мы можем убедиться, что командная строка работает правильно. Следующее задание это попробовать свои силы с привязкой SQL для обхода страницы входа. Введите в поле имени пользователя следующее:

' or true --

Обратите внимание, что после знака “—“ должен быть пробел, без пробелов эта ссылка работать не будет. Оставьте поле пароля пустым и нажмите кнопку ввода.

Команда показывает сообщение, написанное для аутентифицированных пользователей.

Создание правил
Есть много правил, установленных с помощью mod_security, чтобы облегчить вашу жизнь. Они называются CRS (Core Rule Set) и

root@droplet:~# ls -l /usr/share/modsecurity-crs/
total 40
drwxr-xr-x 2 root root  4096 Oct 20 09:45 activated_rules
drwxr-xr-x 2 root root  4096 Oct 20 09:45 base_rules
drwxr-xr-x 2 root root  4096 Oct 20 09:45 experimental_rules
drwxr-xr-x 2 root root  4096 Oct 20 09:45 lua
-rw-r--r-- 1 root root 13544 Jul  2  2012 modsecurity_crs_10_setup.conf
drwxr-xr-x 2 root root  4096 Oct 20 09:45 optional_rules
drwxr-xr-x 3 root root  4096 Oct 20 09:45 util

содержатся в нем.

 
 Документация,
 
root@droplet1:~# ls -l /usr/share/doc/modsecurity-crs/
total 40
-rw-r--r-- 1 root root   469 Jul  2  2012 changelog.Debian.gz
-rw-r--r-- 1 root root 12387 Jun 18  2012 changelog.gz
-rw-r--r-- 1 root root  1297 Jul  2  2012 copyright
drwxr-xr-x 3 root root  4096 Oct 20 09:45 examples
-rw-r--r-- 1 root root  1138 Mar 16  2012 README.Debian
-rw-r--r-- 1 root root  6495 Mar 16  2012 README.gz

Это доступно в скрипте.

Мы должны указать Apache для поиска в этих каталогах для установки этих правил. Отредактируйте файл modsecurity.conf.

nano /etc/apache2/mods-enabled/modsecurity.conf

Добавьте в него следующие каталоги.

Include "/usr/share/modsecurity-crs/*.conf"
Include "/usr/share/modsecurity-crs/activated_rules/*.conf"

Каталог active_rules похож на каталог Apache. Правила доступны в следующих каталогах:

/usr/share/modsecurity-crs/base_rules
/usr/share/modsecurity-crs/optional_rules
/usr/share/modsecurity-crs/experimental_rules

Символические ссылки должны быть созданы внутри каталога activate_rules, чтобы активировать их. Включим правила привязки SQL.

cd /usr/share/modsecurity-crs/activated_rules/
ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf 

Чтобы правила вступили в силу, необходимо переустановить Apache.

service apache2 reload

Теперь откройте домашнюю страницу, которую мы создали ранее и попробуйте использовать запрос привязки SQL в поле имени пользователя. Если бы вы изменили директиву SecRuleEngine на On, вы бы увидели ошибку 403 Forbidden. Если параметр DetectionOnly был отключен, монтирование будет успешным, но пробная версия будет зарегистрирована в modsec_audit.log.

 

Написание собственных правил Mod_security

В этом разделе мы создадим цепочку правил, которые будут блокировать запрос, если определенные слова «spam» будут 
введены в HTML-форму. Сначала мы создадим сценарий PHP, который берет ввод из текстового поля и снова отображает его
пользователю.

/var/www/form.php
Enter something here:

Пользовательские правила можно добавить в любой из файлов конфигурации или поместить в каталоги modsecurity. Мы поместим наши правила в отдельный новый файл.

nano /etc/modsecurity/modsecurity_custom_rules.conf

Добавьте в этот файл следующее:

SecRule REQUEST_FILENAME "form.php" "id:'400001',chain,deny,log,msg:'Spam detected'"
SecRule REQUEST_METHOD "POST" chain
SecRule REQUEST_BODY "@rx (?i:(pills|insurance|rolex))"

Сохраните файл и переустановите Apache. Откройте в браузере http://yourwebsite.com/form.php и введите текст, содержащий любое из этих слов: pills, insurance, rolex

Вы увидите либо страницу 403 и запись в журнале, либо просто запись в журнале, основанную на установке SecRuleEngine. Синтаксис для SecRule

SecRule VARIABLES OPERATOR [ACTIONS]

Здесь мы использовали действие цепочки для сопоставления переменных REQUEST_FILENAME с form.php, REQUEST_METHOD с POST и REQUEST_BODY с регулярным выражением (@rx) string (pills | insurance | rolex). ? i: создает нечувствительную ситуацию совпадения.
При успешном совпадении всех этих трех правил ДЕЙСТВИЕ, отклонить с сообщением «Обнаружен спам» и войти в систему. Действие цепочки имитирует логическое AND, чтобы соответствовать этим трем правилам.


Удаление серверов и каталогов

Иногда имеет смысл исключить конкретный каталог или доменное имя, если оно запускает приложение, такое как phpMyAdmin,
в качестве modsecurity и блокирует запросы SQL. Кроме того, лучше удалить приложения сервера администратора из приложений CMS,
таких как WordPress.

Чтобы отключить mod_security для полного VirtualHost, сделайте следующее

    SecRuleEngine Off

Для конкретного каталога:

<directory "="" var="" www="" wp-admin"="">    SecRuleEngine Off

Если вы не хотите полностью отключать modsecurity, используйте директиву SecRuleRemoveById, чтобы удалить конкретное правило или цепочку правил, указав его идентификатор.

<locationmatch "="" wp-admin="" update.php"="">
    
        SecRuleRemoveById 981173
    

 




 



Установка и настройка NGINX WAF
Обновление до Mysql на се...
  • 2020-10-08
  • 1
  • 64
Установка и настройка NGINX WAF
Резервное Копирование и ...
  • 2020-10-05
  • 1
  • 76
Установка и настройка NGINX WAF
Что такое Ioncube и для ч...
  • 2020-10-06
  • 1
  • 82
Установка и настройка NGINX WAF
Что такое FTP и каковы е...
  • 2020-10-07
  • 1
  • 58
Установка и настройка NGINX WAF
Что такое выделенный серв...
  • 2020-10-07
  • 1
  • 47
Установка и настройка NGINX WAF
Wordpress Litespeed
  • 2020-10-09
  • 1
  • 512