Установка 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 ca-certificates curl gpg

Шаг 2: Добавьте GPG-ключ

curl -fsSL https://modsecurity.digitalwave.hu/archive.key | sudo gpg --dearmor --yes -o /usr/share/keyrings/digitalwave-modsecurity.gpg

Шаг 3: Добавьте репозиторий (DEB822 с определением кодового имени)

. /etc/os-release
printf '%s\n' \
'Types: deb' \
'URIs: http://modsecurity.digitalwave.hu/debian/' \
"Suites: ${VERSION_CODENAME}-backports" \
'Components: main' \
"Architectures: $(dpkg --print-architecture)" \
'Signed-By: /usr/share/keyrings/digitalwave-modsecurity.gpg' | sudo tee /etc/apt/sources.list.d/digitalwave-modsecurity.sources > /dev/null

Шаг 4: Настройте приоритеты пакетов (pin priority)

printf '%s\n' \
'Package: libapache2-mod-security2 libmodsecurity3 libmodsecurity3t64 modsecurity-crs' \
'Pin: origin modsecurity.digitalwave.hu' \
'Pin-Priority: 900' | sudo tee /etc/apt/preferences.d/99modsecurity > /dev/null

Шаг 5: Обновите список пакетов

sudo apt update

Установка ModSecurity

sudo apt install -y libapache2-mod-security2

Что делает: Устанавливает модуль ModSecurity для Apache.

Проверьте, что модуль включён:

sudo apachectl -M | grep security2

Ожидаемый вывод: 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 (свежее правила с проверкой GPG).

Вариант 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 (актуальные правила с проверкой GPG)

Шаг 1: Создайте временную директорию и определите последнюю версию

workdir=$(mktemp -d)
crs_tag=$(curl -fsSL https://api.github.com/repos/coreruleset/coreruleset/releases/latest | jq -r '.tag_name')
case "$crs_tag" in
    v*) ;;
    *) echo "Could not resolve the latest CRS tag." >&2; rm -rf "$workdir"; exit 1 ;;
esac
crs_version=${crs_tag#v}

Шаг 2: Скачайте архив и подпись

curl -fsSLo "$workdir/${crs_tag}.tar.gz" "https://github.com/coreruleset/coreruleset/archive/refs/tags/${crs_tag}.tar.gz"
curl -fsSLo "$workdir/coreruleset-${crs_version}.tar.gz.asc" "https://github.com/coreruleset/coreruleset/releases/download/${crs_tag}/coreruleset-${crs_version}.tar.gz.asc"

Шаг 3: Проверьте GPG-подпись

GNUPGHOME="$workdir/gnupg"
export GNUPGHOME
mkdir -m 700 "$GNUPGHOME"
gpg --fetch-key https://coreruleset.org/security.asc
gpg --verify "$workdir/coreruleset-${crs_version}.tar.gz.asc" "$workdir/${crs_tag}.tar.gz"

Ожидаемый вывод: gpg: Good signature from "OWASP Core Rule Set <security@coreruleset.org>"

Шаг 4: Установите CRS

sudo mkdir -p /etc/apache2/modsec
sudo tar xzf "$workdir/${crs_tag}.tar.gz" -C /etc/apache2/modsec --strip-components=1
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

Шаг 5: Настройте Apache для загрузки CRS

sudo tee /etc/apache2/mods-available/security2.conf > /dev/null <<'EOF'
<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>
EOF

Шаг 6: Очистите временную директорию

rm -rf "$workdir"
unset GNUPGHOME

Шаг 7: Проверьте конфигурацию и перезапустите 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"

Обновление OWASP CRS (для GitHub-версии)

Если вы установили CRS с GitHub, создайте скрипт для автоматического обновления с проверкой GPG-подписи:

sudo tee /usr/local/sbin/update-owasp-crs > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

CRS_DIR="/etc/apache2/modsec"
workdir=$(mktemp -d)
cleanup() {
    rm -rf "$workdir"
}
trap cleanup EXIT

latest_json=$(curl -fsSL https://api.github.com/repos/coreruleset/coreruleset/releases/latest)
crs_tag=$(printf '%s\n' "$latest_json" | jq -r '.tag_name')
case "$crs_tag" in
v*) ;;
*)
    echo "Could not resolve the latest CRS tag." >&2
    exit 1
    ;;
esac
crs_version=${crs_tag#v}

archive="$workdir/${crs_tag}.tar.gz"
signature="$workdir/coreruleset-${crs_version}.tar.gz.asc"
curl -fsSLo "$archive" "https://github.com/coreruleset/coreruleset/archive/refs/tags/${crs_tag}.tar.gz"
curl -fsSLo "$signature" "https://github.com/coreruleset/coreruleset/releases/download/${crs_tag}/coreruleset-${crs_version}.tar.gz.asc"

GNUPGHOME="$workdir/gnupg"
export GNUPGHOME
mkdir -m 700 "$GNUPGHOME"
gpg --fetch-key https://coreruleset.org/security.asc >/dev/null 2>&1
gpg --verify "$signature" "$archive"

backup="/etc/apache2/modsec-backup-${crs_version}-$(date +%Y%m%d%H%M%S)"
backup_created=0
if [ -d "$CRS_DIR" ]; then
    sudo cp -a "$CRS_DIR" "$backup"
    backup_created=1
fi

sudo mkdir -p "$CRS_DIR"
sudo rm -rf "${CRS_DIR:?}"/*
sudo tar xzf "$archive" -C "$CRS_DIR" --strip-components=1

if [ "$backup_created" -eq 1 ] && [ -f "$backup/crs-setup.conf" ]; then
    sudo cp "$backup/crs-setup.conf" "$CRS_DIR/crs-setup.conf"
else
    sudo cp "$CRS_DIR/crs-setup.conf.example" "$CRS_DIR/crs-setup.conf"
fi

for example in \
    REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example \
    RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example; do
    target="${example%.example}"
    if [ "$backup_created" -eq 1 ] && [ -f "$backup/rules/$target" ]; then
        sudo cp "$backup/rules/$target" "$CRS_DIR/rules/$target"
    else
        sudo cp "$CRS_DIR/rules/$example" "$CRS_DIR/rules/$target"
    fi
done

if sudo apachectl configtest; then
    sudo systemctl reload apache2
    echo "OWASP CRS $crs_tag installed and Apache reloaded."
else
    echo "Apache syntax check failed." >&2
    if [ "$backup_created" -eq 1 ]; then
        echo "Restoring $backup." >&2
        sudo rm -rf "${CRS_DIR:?}"/*
        sudo cp -a "$backup"/. "$CRS_DIR"/
        sudo apachectl configtest
    else
        echo "No previous CRS backup was available for automatic rollback." >&2
    fi
    exit 1
fi
EOF

sudo chmod +x /usr/local/sbin/update-owasp-crs

Запуск обновления:

sudo /usr/local/sbin/update-owasp-crs

Решение типичных проблем

8.1 Ошибка: Apache не запускается после включения ModSecurity

Симптом: sudo systemctl status apache2 показывает ошибку.

Причина: Ошибка в конфигурации ModSecurity или CRS.

Пошаговое решение:

Шаг 1: Проверьте синтаксис конфигурации Apache:

sudo apachectl configtest

Шаг 2: Посмотрите конкретную ошибку в логах:

sudo tail -20 /var/log/apache2/error.log

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

8.3 Ошибка: Много ложных срабатываний (легитимные запросы блокируются)

Симптом: Пользователи не могут зайти на сайт, в логах видны блокировки.

Причина: Слишком строгие правила CRS или не настроены исключения.

Пошаговое решение:

Шаг 1: Определите правило, которое блокирует запрос:

sudo tail -20 /var/log/apache2/modsec_audit.log

Найдите строку с [id "xxxxx"].

Шаг 2: Создайте исключение для этого правила (см. раздел «Создание собственных исключений»).

8.4 Ошибка: ModSecurity не видит CRS правила после обновления

Симптом: После обновления CRS с GitHub сайт перестал блокировать атаки.

Причина: При обновлении были удалены кастомные настройки.

Пошаговое решение:

Шаг 1: Проверьте, что файл security2.conf указывает на правильные пути:

cat /etc/apache2/mods-available/security2.conf

Шаг 2: Убедитесь, что файлы существуют:

ls -la /etc/apache2/modsec/crs-setup.conf
ls -la /etc/apache2/modsec/rules/*.conf

Чек-лист: что проверить после установки

  • [ ] Модуль ModSecurity включён: sudo apachectl -M | grep security2security2_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 -rf /etc/apache2/modsec-backup-*
sudo rm -f /etc/logrotate.d/modsecurity
sudo rm -f /usr/local/sbin/update-owasp-crs

Шаг 4: Удалите репозиторий Digitalwave и ключи

sudo rm -f /etc/apt/sources.list.d/digitalwave-modsecurity.sources
sudo rm -f /etc/apt/sources.list.d/digitalwave-modsecurity.list
sudo rm -f /etc/apt/preferences.d/99modsecurity
sudo rm -f /usr/share/keyrings/digitalwave-modsecurity.gpg
sudo apt update

Шаг 5: Проверьте, что модуль удалён

sudo apachectl -M | grep security2 || echo "ModSecurity module is not loaded"

Ожидаемый вывод: ModSecurity module is not loaded

Часто задаваемые вопросы (FAQ)

Вопрос: Зачем нужен репозиторий Digitalwave?

Ответ: Debian 11 содержит слишком старый ModSecurity (2.9.3), который не поддерживает CRS 4.x (требуется 2.9.6+). Digitalwave даёт свежие версии для всех релизов Debian.

Вопрос: Какой способ установки CRS выбрать?

Ответ: Digitalwave — проще и обновляется через APT. GitHub — даёт более свежие правила с проверкой GPG-подписи, но требует ручного обновления (или скрипта).

Вопрос: Можно ли включить 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"

Заключение

Теперь ModSecurity с OWASP CRS защищает ваш Apache-сервер. Он блокирует SQL-инъекции, XSS и другие атаки, не требуя изменений в коде приложений.

Что дальше?

  • Настройте HTTPS с Let’s Encrypt для полной безопасности
  • Установите Fail2ban для защиты от брутфорса
  • Настройте мониторинг сервера для отслеживания атак

Связанные статьи: