Установка ModSecurity (WAF)
apt install libapache2-mod-security2
Включаем модуль
a2enmod security2
Проверяем
apachectl -M | grep security
Если ответ содержит security2_module (shared)
, то всё ок.
Копируем конфиг
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Изменяем конфиг /etc/modsecurity/modsecurity.conf
SecRuleEngine On SecResponseBodyAccess Off SecAuditLogType concurrent SecAuditLogStorageDir /opt/modsecurity/var/audit/
на каталог /opt/modsecurity/var/audit/
нужны права для www-data
на запись.
Логи будут рассортированы по каталогам датам-минутам.
Обновление правил
Новые правила будем устанавливать в /etc/modsecurity/coreruleset/
Скачиваем новые правила через git
git clone https://github.com/coreruleset/coreruleset.git /etc/modsecurity/coreruleset
Переименовываем setup скрипт
cp /etc/modsecurity/coreruleset/crs-setup.conf.example /etc/modsecurity/coreruleset/crs-setup.conf
Файлы правил с исключениями будем хранить в /etc/modsecurity/crs/
, чтобы при обновлении каталога с правилами (/etc/modsecurity/coreruleset/
) не приходилось сохранять и обратно перезаливать файл с исключениями.
Удаляем из каталога /etc/modsecurity/crs/
всё, кроме двух файлов:
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
В этих файлах прописываются исключения правил, если оно не нужно.
Изменяем файл /etc/apache2/mods-enabled/security2.conf
<ifmodule security2_module> SecDataDir /var/cache/modsecurity IncludeOptional /etc/modsecurity/*.conf IncludeOptional /etc/modsecurity/coreruleset/crs-setup.conf IncludeOptional /etc/modsecurity/crs/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf IncludeOptional /etc/modsecurity/coreruleset/rules/*.conf IncludeOptional /etc/modsecurity/crs/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf </ifmodule>
Проверяем и перезагружаем правила apache2
apachectl configtest service apache2 restart
Тестирование ModSecurity
Открываем url вида:
http://127.0.0.1/index.html?exec=/bin/bash
и видим 403 ошибку
Правило исключение
Если какое то правило срабатывает и мешает нормальному функционированию сайта, то такое правило можно отключить как глобально для всех сайтов, так и отдельно для каждого сайта.
Чтобы отключить правило глобально необходимо сработанное правило добавить в исключение в файл RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
, через SecRuleRemoveById
, например:
SecRuleRemoveById 12345
Чтобы отключить правило для конкретного сайта, нужно добавить следующий код в конфигурационный файл сайта. Пример для apache:
<IfModule mod_security2.c>
SecRuleRemoveById 12345
</IfModule>
Чтобы отключить ModSecurity для всего сайта:
<IfModule mod_security2.c>
SecRuleEngine Off
</IfModule>
Чтобы отключить правило для конкретного url:
<IfModule mod_security2.c>
<LocationMatch "/wp-admin/post.php">
SecRuleRemoveById 12345 445566
</LocationMatch>
<LocationMatch "/wp-admin/admin-ajax.php">
SecRuleRemoveById 6789
</LocationMatch>
</IfModule>
после чего перезапустить сервис apache:
service apache2 reload
https://hostadvice.com/how-to/how-to-setup-modsecurity-for-apache-on-ubuntu-18-04/
https://modsecurity.org/crs/