ModSecurity — это межсетевой экран для веб-приложений (WAF), который анализирует HTTP-трафик и блокирует типовые атаки: SQL-инъекции, межсайтовый скриптинг (XSS), внедрение команд и другие. В связке с OWASP Core Rule Set (CRS) — готовым набором правил — он превращает ваш Apache в надёжно защищённый веб-сервер без необходимости менять код приложений.
В этом руководстве я покажу, как установить ModSecurity и OWASP CRS на Debian 13, 12 и 11, настроить активную блокировку атак и управлять ложными срабатываниями.
Предварительные требования
Перед установкой убедитесь, что:
- У вас установлен и работает Apache (если нет — см. установка Apache на Debian)
- Вы имеете права
sudo(администратора)
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
Что делает: sudo — выполняет команду от имени суперпользователя; whoami — показывает имя текущего пользователя.
✅ Ожидаемый вывод в терминале:
root
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
Версии ModSecurity по релизам Debian
| Релиз Debian | ModSecurity по умолчанию | Digitalwave | CRS 4.x совместимо |
|---|---|---|---|
| Debian 13 | 2.9.11 | 2.9.11+ | ✅ Да |
| Debian 12 | 2.9.7 | 2.9.13pre | ✅ Да |
| Debian 11 | 2.9.3 | 2.9.13pre | ✅ Да (только Digitalwave) |
⚠️ Для Debian 11 обязателен репозиторий Digitalwave — иначе CRS 4.x не будет работать (требуется ModSecurity ≥ 2.9.6).
Добавление репозитория Digitalwave
Репозиторий Digitalwave предоставляет свежие версии ModSecurity для всех версий Debian.
Шаг 1: Установите зависимости
sudo apt update && sudo apt upgrade -y
sudo apt install -y lsb-release ca-certificates curl
Шаг 2: Добавьте GPG-ключ
curl -fsSL https://modsecurity.digitalwave.hu/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/digitalwave-modsecurity.gpg
Шаг 3: Добавьте репозиторий
Для Debian 13 и Debian 12:
cat <<EOF | sudo tee /etc/apt/sources.list.d/digitalwave-modsecurity.sources
Types: deb
URIs: http://modsecurity.digitalwave.hu/debian/
Suites: $(lsb_release -cs) $(lsb_release -cs)-backports
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /usr/share/keyrings/digitalwave-modsecurity.gpg
EOF
Для Debian 11 (Bullseye):
echo "deb [signed-by=/usr/share/keyrings/digitalwave-modsecurity.gpg] http://modsecurity.digitalwave.hu/debian/ bullseye main" | sudo tee /etc/apt/sources.list.d/digitalwave-modsecurity.list
echo "deb [signed-by=/usr/share/keyrings/digitalwave-modsecurity.gpg] http://modsecurity.digitalwave.hu/debian/ bullseye-backports main" | sudo tee -a /etc/apt/sources.list.d/digitalwave-modsecurity.list
Шаг 4: Настройте приоритеты пакетов (pin priority)
Чтобы APT всегда выбирал пакеты из репозитория Digitalwave, создайте файл приоритетов:
cat <<EOF | sudo tee /etc/apt/preferences.d/99modsecurity
Package: *libapache2-mod-security2*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900
Package: *modsecurity-crs*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900
Package: *libmodsecurity*
Pin: origin modsecurity.digitalwave.hu
Pin-Priority: 900
EOF
Шаг 5: Обновите список пакетов
sudo apt update
Установка ModSecurity
sudo apt install -y libapache2-mod-security2
Что делает: Устанавливает модуль ModSecurity для Apache.
Проверьте, что модуль включён:
sudo apachectl -M | grep security
✅ Ожидаемый вывод: security2_module (shared)
Если модуль не включён:
sudo a2enmod security2
sudo systemctl restart apache2
Настройка ModSecurity
Шаг 1: Скопируйте пример конфигурации
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Шаг 2: Включите активную блокировку
Отредактируйте файл:
sudo nano /etc/modsecurity/modsecurity.conf
Найдите строку:
SecRuleEngine DetectionOnly
Замените на:
SecRuleEngine On
Что делает: DetectionOnly только логирует атаки, On — блокирует.
⚠️ Рекомендация: Для начала установите DetectionOnly на несколько дней, чтобы выявить ложные срабатывания, затем переключитесь на On.
Шаг 3: Настройте аудит-лог
Найдите строку:
SecAuditLogParts ABDEFHIJZ
Замените на:
SecAuditLogParts ABCEFHJKZ
Сохраните файл: Ctrl+O, Enter, Ctrl+X
Шаг 4: Перезапустите Apache
sudo systemctl restart apache2
Установка OWASP Core Rule Set (CRS)
Вы можете установить CRS из репозитория Digitalwave (проще) или последнюю версию с GitHub (свежее правила).
Вариант A: Установка CRS из Digitalwave (рекомендуется для простоты)
sudo apt install -y modsecurity-crs
sudo systemctl restart apache2
Проверьте установку:
dpkg -l modsecurity-crs | tail -1
✅ Ожидаемый вывод: ii modsecurity-crs 3.3.x ...
Вариант B: Установка CRS 4.x с GitHub (актуальные правила)
Шаг 1: Создайте директорию для CRS
sudo mkdir -p /etc/apache2/modsec
Шаг 2: Скачайте и установите последнюю версию CRS
CRS_VERSION=$(curl -s https://api.github.com/repos/coreruleset/coreruleset/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
echo "Downloading OWASP CRS $CRS_VERSION..."
curl -fSL "https://github.com/coreruleset/coreruleset/archive/refs/tags/${CRS_VERSION}.tar.gz" -o /tmp/crs.tar.gz
sudo tar xzf /tmp/crs.tar.gz -C /etc/apache2/modsec --strip-components=1
rm /tmp/crs.tar.gz
Шаг 3: Скопируйте примеры конфигурации
sudo cp /etc/apache2/modsec/crs-setup.conf.example /etc/apache2/modsec/crs-setup.conf
sudo cp /etc/apache2/modsec/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /etc/apache2/modsec/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
sudo cp /etc/apache2/modsec/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example /etc/apache2/modsec/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
Шаг 4: Настройте Apache для загрузки CRS
sudo nano /etc/apache2/mods-available/security2.conf
Замените содержимое на:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
# Include ModSecurity base configuration
IncludeOptional /etc/modsecurity/*.conf
# Include OWASP CRS configuration and rules
Include /etc/apache2/modsec/crs-setup.conf
Include /etc/apache2/modsec/rules/*.conf
</IfModule>
Шаг 5: Проверьте конфигурацию и перезапустите Apache
sudo apachectl configtest
sudo systemctl restart apache2
Проверка работы ModSecurity
Отправьте тестовый запрос, имитирующий атаку:
curl -I "http://localhost/?exec=/bin/bash"
✅ Ожидаемый вывод: HTTP/1.1 403 Forbidden
Если получили 200 OK:
- Убедитесь, что
SecRuleEngineустановлен вOn - Проверьте, что CRS правила загружены:
sudo apachectl -t -D DUMP_INCLUDES | grep -i modsec - Перезапустите Apache:
sudo systemctl restart apache2
Настройка OWASP CRS (уровни паранойи и исключения)
Паранойя (Paranoia Level)
CRS имеет 4 уровня паранойи:
- Уровень 1 (по умолчанию) — минимальное количество ложных срабатываний
- Уровень 2 — больше правил, возможны ложные срабатывания
- Уровень 3 — строгие правила, много ложных срабатываний
- Уровень 4 — максимальная безопасность, только для особых случаев
Изменить уровень паранойи (в файле crs-setup.conf):
sudo nano /etc/apache2/modsec/crs-setup.conf # для GitHub-версии
# или
sudo nano /usr/share/modsecurity-crs/crs-setup.conf # для Digitalwave
Найдите и раскомментируйте:
SecAction "id:900000, phase:1, nolog, pass, t:none, setvar:tx.paranoia_level=1"
Измените 1 на нужный уровень.
Включение исключений для популярных приложений
В файле crs-setup.conf найдите и раскомментируйте строки для ваших приложений:
SecAction "id:900130, phase:1, nolog, pass, t:none, setvar:tx.crs_exclusions_wordpress=1"
SecAction "id:900130, phase:1, nolog, pass, t:none, setvar:tx.crs_exclusions_phpmyadmin=1"
Доступные исключения: wordpress, phpmyadmin, drupal, nextcloud, cpanel, dokuwiki, phpbb, xenforo.
Создание собственных исключений
Отредактируйте файл исключений:
sudo nano /etc/apache2/modsec/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
Примеры:
Отключить правила для конкретного URL:
SecRule REQUEST_URI "@beginsWith /admin/api/" "id:1000,phase:1,pass,nolog,ctl:ruleRemoveById=941000-942999"
Разрешить IP-адресу доступ без проверки:
SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" "id:1001,phase:1,allow,nolog,ctl:ruleEngine=off"
Отключить конкретное правило глобально:
SecRuleRemoveById 942100
Обновление OWASP CRS (для GitHub-версии)
Если вы установили CRS с GitHub, создайте скрипт для автоматического обновления:
sudo nano /usr/local/bin/update-owasp-crs.sh
Содержимое скрипта:
#!/bin/bash
set -e
CRS_DIR="/etc/apache2/modsec"
BACKUP_DIR="/etc/apache2/modsec-backup-$(date +%Y%m%d)"
LATEST_VERSION=$(curl -s https://api.github.com/repos/coreruleset/coreruleset/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
echo "Latest CRS version: $LATEST_VERSION"
# Backup
sudo cp -r "$CRS_DIR" "$BACKUP_DIR"
# Download and extract
curl -fSL "https://github.com/coreruleset/coreruleset/archive/refs/tags/${LATEST_VERSION}.tar.gz" -o /tmp/crs.tar.gz
sudo rm -rf "$CRS_DIR"/*
sudo tar xzf /tmp/crs.tar.gz -C "$CRS_DIR" --strip-components=1
rm /tmp/crs.tar.gz
# Restore custom config if exists
if [ -f "$BACKUP_DIR/crs-setup.conf" ]; then
sudo cp "$BACKUP_DIR/crs-setup.conf" "$CRS_DIR/crs-setup.conf"
fi
# Restore exclusion files
sudo cp "$CRS_DIR/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example" "$CRS_DIR/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf" 2>/dev/null || true
sudo cp "$CRS_DIR/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example" "$CRS_DIR/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf" 2>/dev/null || true
sudo apachectl configtest
sudo systemctl reload apache2
echo "CRS updated successfully to $LATEST_VERSION"
Сделайте скрипт исполняемым и запустите:
sudo chmod +x /usr/local/bin/update-owasp-crs.sh
sudo /usr/local/bin/update-owasp-crs.sh
Решение типичных проблем
8.1 Ошибка: Apache не запускается после включения ModSecurity
Симптом: sudo systemctl status apache2 показывает ошибку.
Причина: Ошибка в конфигурации ModSecurity или CRS.
Пошаговое решение:
Шаг 1: Проверьте синтаксис конфигурации Apache:
sudo apachectl configtest
Шаг 2: Посмотрите конкретную ошибку в логах:
sudo tail -20 /var/log/apache2/error.log
Шаг 3: Если ошибка связана с дублированием правил (например, Found another rule with the same id), убедитесь, что у вас не включены одновременно CRS из GitHub и из Digitalwave.
8.2 Ошибка: ModSecurity не блокирует тестовые атаки
Симптом: curl -I "http://localhost/?exec=/bin/bash" возвращает 200 OK.
Причина: SecRuleEngine в режиме DetectionOnly или CRS не загружен.
Пошаговое решение:
Шаг 1: Проверьте режим:
grep SecRuleEngine /etc/modsecurity/modsecurity.conf
Должно быть SecRuleEngine On.
Шаг 2: Проверьте, что CRS правила загружены:
sudo apachectl -t -D DUMP_INCLUDES | grep -i modsec
Шаг 3: Перезапустите Apache:
sudo systemctl restart apache2
8.3 Ошибка: Много ложных срабатываний (легитимные запросы блокируются)
Симптом: Пользователи не могут зайти на сайт, в логах видны блокировки.
Причина: Слишком строгие правила CRS или не настроены исключения.
Пошаговое решение:
Шаг 1: Определите правило, которое блокирует запрос:
sudo tail -20 /var/log/apache2/modsec_audit.log
Найдите строку с [id "xxxxx"].
Шаг 2: Создайте исключение для этого правила (см. раздел «Создание собственных исключений»).
Шаг 3: Временно снизьте уровень паранойи до 1 в crs-setup.conf.
8.4 Ошибка: Высокая нагрузка на сервер после включения ModSecurity
Симптом: Сервер стал медленнее отвечать, CPU загружен.
Причина: ModSecurity обрабатывает каждый запрос, включая большие ответы.
Пошаговое решение:
Шаг 1: Отключите сканирование тела ответа (если не критично):
sudo nano /etc/modsecurity/modsecurity.conf
Добавьте или измените:
SecResponseBodyAccess Off
Шаг 2: Ограничьте размер сканируемых запросов:
SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072
Шаг 3: Перезапустите Apache:
sudo systemctl restart apache2
8.5 Ошибка: ModSecurity не видит CRS правила после обновления
Симптом: После обновления CRS с GitHub сайт перестал блокировать атаки.
Причина: При обновлении были удалены кастомные настройки или файлы конфигурации.
Пошаговое решение:
Шаг 1: Проверьте, что файл security2.conf указывает на правильные пути:
cat /etc/apache2/mods-available/security2.conf
Должны быть строки:
Include /etc/apache2/modsec/crs-setup.conf
Include /etc/apache2/modsec/rules/*.conf
Шаг 2: Убедитесь, что файлы существуют:
ls -la /etc/apache2/modsec/crs-setup.conf
ls -la /etc/apache2/modsec/rules/*.conf
Шаг 3: Перезапустите Apache:
sudo systemctl restart apache2
Чек-лист: что проверить после установки
- [ ] Модуль ModSecurity включён:
sudo apachectl -M | grep security→security2_module - [ ] Режим блокировки активен:
grep SecRuleEngine /etc/modsecurity/modsecurity.conf→On - [ ] CRS правила загружены:
sudo apachectl -t -D DUMP_INCLUDES | grep -i modsec - [ ] Тестовая атака блокируется:
curl -I "http://localhost/?exec=/bin/bash"→403 Forbidden - [ ] Логи пишутся:
sudo tail -5 /var/log/apache2/modsec_audit.log - [ ] Для GitHub CRS:
ls /etc/apache2/modsec/rules/*.conf→ файлы существуют - [ ] Для Digitalwave CRS:
dpkg -l modsecurity-crs→ii ...
Удаление ModSecurity и CRS
Шаг 1: Отключите модуль
sudo a2dismod security2
sudo systemctl restart apache2
Шаг 2: Удалите пакеты
sudo apt remove --purge libapache2-mod-security2 modsecurity-crs
Шаг 3: Удалите конфигурационные файлы
sudo rm -rf /etc/modsecurity
sudo rm -rf /etc/apache2/modsec
sudo rm -f /etc/logrotate.d/modsecurity
sudo rm -f /usr/local/bin/update-owasp-crs.sh
Шаг 4: Удалите репозиторий Digitalwave
sudo rm -f /etc/apt/sources.list.d/digitalwave-modsecurity.*
sudo rm -f /etc/apt/preferences.d/99modsecurity
sudo rm -f /usr/share/keyrings/digitalwave-modsecurity.gpg
sudo apt update
Часто задаваемые вопросы (FAQ)
Вопрос: Зачем нужен репозиторий Digitalwave?
Ответ: Debian 11 содержит слишком старый ModSecurity (2.9.3), который не поддерживает CRS 4.x (требуется 2.9.6+). Digitalwave даёт свежие версии для всех релизов Debian.
Вопрос: Какой способ установки CRS выбрать?
Ответ: Digitalwave — проще и обновляется через APT. GitHub — даёт более свежие правила, но требует ручного обновления (или скрипта).
Вопрос: Можно ли включить ModSecurity только для определённых сайтов?
Ответ: Да. В конфигурации виртуального хоста Apache добавьте:
<IfModule security2_module>
SecRuleEngine On
IncludeOptional /etc/apache2/modsec/rules/*.conf
</IfModule>
Вопрос: Как посмотреть, какие правила сработали?
Ответ: sudo tail -50 /var/log/apache2/modsec_audit.log | grep -E "id|msg"
Вопрос: Нужно ли перезагружать Apache после изменения исключений?
Ответ: Да, всегда sudo systemctl reload apache2.
Заключение
Теперь ModSecurity с OWASP CRS защищает ваш Apache-сервер. Он блокирует SQL-инъекции, XSS и другие атаки, не требуя изменений в коде приложений.
Что дальше?
- Настройте HTTPS с Let’s Encrypt для полной безопасности
- Установите Fail2ban для защиты от брутфорса
- Настройте мониторинг сервера для отслеживания атак