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