Установка ModSecurity и OWASP CRS с Apache на Debian 13, 12, 11: полное руководство

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

Релиз DebianModSecurity по умолчаниюDigitalwaveCRS 4.x совместимо
Debian 132.9.112.9.11+✅ Да
Debian 122.9.72.9.13pre✅ Да
Debian 112.9.32.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 securitysecurity2_module
  • [ ] Режим блокировки активен: grep SecRuleEngine /etc/modsecurity/modsecurity.confOn
  • [ ] 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-crsii ...

Удаление 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 для защиты от брутфорса
  • Настройте мониторинг сервера для отслеживания атак