Использование mod security для блокирования DDoS атак
Содержание
1. Для чего эта статья?
- Последнее время участились случаи атак типа «отказ в обслуживании» (DDoS) на Web-сервера наших клиентов.
- Часто так бывает, что атака на Web-сервер, расположенный на VDS(виртуальный сервер) приводит к исчерпанию всех свободных ресурсов VDS
- В таком случае вступают ограничения виртуализации - это приводит к заметной нагрузке на родительский сервер
- Из-за всего этого страдают клиенты, которых не атакуют
Для решения этих проблем необходимо использовать инструменты отражения DDoS атак, но сначала рассмотрим какие атаки бывают
2. Популярные методы DDoS атак на Web-сервер
Флуд по количеству подключений
- Данная атака использует уязвимость сервера на виртуализации: исчерпание всех свободных подключений к Web-серверу
- Это приводит к ответам вида error 324 err_empty_response
- Apache в таком случае реагирует на новые входящие соединения через раз
Флуд по запуску долгих скриптов
- Данная атака использует небольшое количество подключений к скриптам, которые выполняются длительное время
- Это приводит к исчерпанию ресурсов оперативной памяти и CPU
- Apache полностью перестает реагировать на запросы
- Сильно нагружает родительский сервер
Slow HTTP Post
- Данная атака пока не сильно распространена. Она использует подключения к Web-серверу с целью занять свободные слоты для подключений
- В таком случае нагрузка на сервер не слишком большая, но Apache полностью перестает реагировать на запросы
3. Что такое mod_security
ModSecurity™ - это бесплатный модуль для Apache с открытым кодом, организующий функции firewall. Он позволяет организовать защиту от большого количества атак против web-сайтов, используя мониторинг и анализ всех запросов в реальном времени
Для этого модуля есть большое число правил, написанных сообществом для предотвращения популярных атак
Мы же будем использовать этот модуль для блокирования DDoS атак
4. Использование mod_security для автоматического блокирования атакующих
Инструкции для различных операционных систем. Все инструкции даны для шаблона VDS с ISPmanager
Подключаетесь по SSH и выполняйте команды в консоли сервера
1. Установим mod_security
- FreeBSD
make -C /usr/ports/www/mod_security BATCH=YES install clean
- Debian
apt-get install libapache-mod-security
- Ubuntu
apt-get install libapache2-modsecurity
- CentOS
yum install mod_security
2. Создадим файл конфигурации
- FreeBSD
mcedit /usr/local/etc/apache22/Includes/httpd-security.conf
Здесь нужны строки в начале файла
LoadModule unique_id_module libexec/apache22/mod_unique_id.so LoadModule security2_module libexec/apache22/mod_security2.so
- Debian и Ubuntu
mcedit /etc/apache2/mods-enabled/mod-security.conf
Содержание файла - добавить в указанный выше файл такой конфиг:
SecRuleEngine On SecAuditEngine Off SecDataDir /tmp SecRule REMOTE_ADDR "^127\.0\.0\.1$" "phase:1,nolog,allow" SecRule REQUEST_BASENAME "!(\.avi$|\.bmp$|\.css$|\.doc$|\.flv$|\.gif$|\ \.htm$|\.html$|\.ico$|\.jpg$|\.js$|\.mp3$|\ \.mpeg$|\.pdf$|\.png$|\.pps$|\.ppt$|\.swf$|\ \.txt$|\.wmv$|\.xls$|\.xml$|\.zip$)"\ "phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests=+1,expirevar:ip.requests=1" SecRule ip:requests "@eq 5" "phase:1,pass,nolog,setvar:ip.block=1,expirevar:ip.block=5,setvar:ip.blocks=+1,expirevar:ip.blocks=3600" SecRule ip:blocks "@ge 5" "phase:1,deny,log,logdata:'req/sec: %{ip.requests}, blocks: %{ip.blocks}',status:403" SecRule ip:block "@eq 1" "phase:1,deny,nolog,status:403"
- CentOS
mcedit /etc/httpd/conf.d/mod_security.conf
На CentOS устанавливается новая версия mod_security 2.7 - поэтому файл конфига чуть-чуть другой
LoadModule unique_id_module modules/mod_unique_id.so LoadModule security2_module modules/mod_security2.so SecRuleEngine On SecAuditEngine Off SecDataDir /tmp SecRule REMOTE_ADDR "^127\.0\.0\.1$" "id:'400000',phase:1,nolog,allow" SecRule REQUEST_BASENAME "!(\.avi$|\.bmp$|\.css$|\.doc$|\.flv$|\.gif$|\ \.htm$|\.html$|\.ico$|\.jpg$|\.js$|\.mp3$|\ \.mpeg$|\.pdf$|\.png$|\.pps$|\.ppt$|\.swf$|\ \.txt$|\.wmv$|\.xls$|\.xml$|\.zip$)"\ "id:'400001',phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR},setvar:ip.requests=+1,expirevar:ip.requests=1" SecRule ip:requests "@eq 5" "id:'400002',phase:1,pass,nolog,setvar:ip.block=1,expirevar:ip.block=5,setvar:ip.blocks=+1,expirevar:ip.blocks=3600" SecRule ip:blocks "@ge 5" "id:'400003',phase:1,deny,log,logdata:'req/sec: %{ip.requests}, blocks: %{ip.blocks}',status:403" SecRule ip:block "@eq 1" "id:'400004',phase:1,deny,nolog,status:403"
3. Создаем файлы для работы
touch /tmp/ip.dir touch /tmp/ip.pag chmod 666 /tmp/ip.dir chmod 666 /tmp/ip.pag
4. Перезапустим Apache
apachectl restart
5. Результат
В итоге Apache будет работать следующим образом:
- Если с одного IP происходит более 5 подключений в секунду, то этот IP получает на все запросы к сайту 403 ошибку
- IP разблокируется через 5 секунд
- Если IP был заблокирован более 5 раз, то он блокируется на 1 час
Это позволяет
- Разгрузить сервер от обработки скриптов для атакующих IP
- Снимает нагрузку на физический сервер
- Позволяет подключать другие гибкие правила, для обработки запросов