8.2.9 Встановлення ModSecurity WAF для Nginx
WAF ModSecurity — це відкритий веб-аплікаційний фаєрвол (Web Application Firewall), що забезпечує захист веб-сайтів і веб-додатків від атак та вразливостей. ModSecurity аналізує HTTP-трафік, блокує шкідливі запити, запобігає SQL-ін’єкціям, XSS, брутфорсу, скануванню та іншим популярним загрозам. Працює як модуль для Apache, Nginx та IIS, підтримує гнучке налаштування правил (у тому числі готові політики OWASP CRS) та веде детальні журнали безпеки.
Системні вимоги
- Віртуальний сервер або Виділений сервер
- Ubuntu 22.04 LTS або Ubuntu 24.04 LTS
- CPU: мінімум 2 ядра;
- RAM: мінімум 1 ГБ;
- SSD: мінімум 5 ГБ вільного місця;
- root або sudo доступ.
Безпека
Перед початком переконайтесь, що увімкнено UFW або iptables правила, доступ по SSH обмежено ключами, а всі безпекові оновлення встановлені.
Підготовка сервера
Для початку оновлюємо пакети та встановлюємо залежності:
sudo apt update && sudo apt install -y \
git build-essential autoconf automake libtool pkg-config \
libpcre3 libpcre3-dev libpcre2-dev libxml2 libxml2-dev libyajl-dev \
zlib1g zlib1g-dev curl wget
- git – для клонування репозиторіїв ModSecurity та ModSecurity-nginx;
- build-essential, autoconf, automake, libtool, pkg-config: інструменти для збірки з вихідних кодів;
- libpcre3, libpcre3-dev, libpcre2-dev: Бібліотеки для підтримки регулярних виразів (використовуються ModSecurity та Nginx);
- libxml2, libxml2-dev: XML-парсер (потрібен ModSecurity);
- libyajl-dev: JSON-парсер (ModSecurity);
- zlib1g, zlib1g-dev: стиснення (ModSecurity, Nginx);
- curl: утиліта для завантаження файлів (знадобиться на наступних кроках).
Створюємо робочий каталог:
sudo mkdir -p /usr/local/src && cd /usr/local/src
Клонуємо репозиторій ModSecurity, ініціалізуємо підмодулі, збираємо бібліотеку:
git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule update --init
./build.sh
./configure
make
sudo make install
Клонуємо конектор для Nginx
cd ..
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Завантажуємо вихідний код Nginx, збираємо його з підключенням конектора:
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --add-module=../ModSecurity-nginx
make
sudo make install
Файли Nginx за замовчуванням будуть у /usr/local/nginx
. Щоб використовувати стандартні шляхи на зразок /etc/nginx
, /var/log/nginx
і /usr/sbin/nginx
, додайте до команди ./configure
параметр --prefix
і вкажіть шлях до конфігурацій та логів вручну.
Конфігурація
Створюємо каталог конфігурацій:
sudo mkdir -p /etc/nginx/modsec
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
Додамо OWASP CRS:
OWASP Core Rule Set (CRS) — це набір типових правил для ModSecurity, які захищають веб-застосунки від найрозповсюдженіших атак, таких як SQL-ін’єкції, XSS, CSRF, Local File Inclusion (LFI), Remote File Inclusion (RFI) тощо. Це проєкт з відкритим кодом, який підтримується спільнотою OWASP і регулярно оновлюється.
Встановлюємо CRS та копіюємо правила в каталог:
sudo apt install modsecurity-crs -y
cd /etc/nginx/modsec
sudo git clone https://github.com/coreruleset/coreruleset.git
sudo cp coreruleset/crs-setup.conf.example crs-setup.conf
sudo cp -r coreruleset/rules .
sudo cp -r /usr/share/modsecurity-crs/rules /etc/nginx/modsec/
Підключення правил у nginx.conf
У секції http конфігураційного файлу nginx.conf
додайте наступні директиви, наприклад одразу після default_type application/octet-stream; або перед блоком server {:
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
Виконайте команду для створення конфігураційного файлу:
nano /etc/nginx/modsec/main.conf
Та додайте наступний вміст:
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/crs-setup.conf
Include /etc/nginx/modsec/rules/*.conf
Логування атак
Створюємо каталог для логів і надаємо права:
sudo mkdir /var/log/modsecurity
sudo chown www-data: /var/log/modsecurity
В modsecurity.conf пропишіть шлях до журналу подій:
SecAuditLog /var/log/modsecurity/audit.log
Перевірка конфігурації та запуск:
/usr/local/nginx/sbin/nginx -t && sudo /usr/local/nginx/sbin/nginx -s reload
Перевірка WAF
Для перевірки роботи WAF необхідно зімітувати атаку. Найпростіший варіант — виконати SQL-ін’єкцію через URL прямо у веб-браузері або з використанням інструмента curl. WAF має виявити загрозу й повернути помилку 403 Forbidden. Спробуйте:
http://your-domain.com/?id=1' OR '1'='1
У браузері має бути 403 Forbidden. Лог перевіряється командою:
tail -f /var/log/modsecurity/audit.log
Типові проблеми та їх рішення
Проблема | Рішення |
---|---|
WAF нічого не блокує | Переконайтесь, що SecRuleEngine On та увімкнені правила CRS |
Логи порожні | Перевірте права на лог-файл і наявність місця на диску |
Помилка 403 на власних формах | Включіть DetectionOnly, знайдіть RuleID і додайте виняток |
Помилка CRS 901001 | «CRS is deployed without configuration» — файл crs-setup.conf не знайдено. Скопіюйте його та перезапустіть сервіс. |
Помилка збірки Nginx | Якщо ./configure не бачить PCRE або Zlib, встановіть libpcre2-dev і zlib1g-dev , потім повторіть збірку. |
Офіційна документація та корисні посилання