Security-заголовки работают на стороне браузера. Для защиты на стороне сервера нужен WAF (Web Application Firewall). Установили ModSecurity с OWASP Core Rule Set:
# Установка ModSecurity для Nginx
apt install -y libmodsecurity3 libmodsecurity-dev
apt install -y libnginx-mod-http-modsecurity
# Или компиляция connector для Nginx
git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git
# Включение ModSecurity в Nginx
# /etc/nginx/conf.d/modsecurity.conf
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/main.conf;
# /etc/nginx/modsecurity/main.conf
Include /etc/nginx/modsecurity/modsecurity.conf
Include /etc/nginx/modsecurity/crs/crs-setup.conf
Include /etc/nginx/modsecurity/crs/rules/*.conf
# Кастомные исключения для CMS (чтобы не ломать редактор статей)
# /etc/nginx/modsecurity/custom-exclusions.conf
SecRule REQUEST_URI "@beginsWith /admin/articles/edit" \
"id:1001,phase:1,pass,nolog,\
ctl:ruleRemoveById=941100,\
ctl:ruleRemoveById=941160,\
ctl:ruleRemoveById=942100"
# Режим работы: DetectionOnly для тестирования, On для блокировки
SecRuleEngine On
# Логирование заблокированных запросов
SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecAuditLogFormat JSON
# Скачиваем OWASP Core Rule Set
cd /etc/nginx/modsecurity/
git clone https://github.com/coreruleset/coreruleset.git crs
cp crs/crs-setup.conf.example crs/crs-setup.conf
# Настраиваем порог аномалий (по умолчанию 5)
# /etc/nginx/modsecurity/crs/crs-setup.conf
SecAction "id:900110,phase:1,pass,nolog,\
setvar:tx.inbound_anomaly_score_threshold=5,\
setvar:tx.outbound_anomaly_score_threshold=4"
nginx -t && systemctl reload nginx
Важно: первые 3 дня мы работали в режиме DetectionOnly, анализируя логи. CMS-редактор статей отправлял HTML в POST-запросах, что ModSecurity считал XSS. Добавили исключения для admin-панели, после чего переключили в режим блокировки.
Оставить комментарий