Использование mod security для блокирования DDoS атак

Материал из wiki.planetahost.ru
Перейти к навигации Перейти к поиску

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 будет работать следующим образом:

  1. Если с одного IP происходит более 5 подключений в секунду, то этот IP получает на все запросы к сайту 403 ошибку
  2. IP разблокируется через 5 секунд
  3. Если IP был заблокирован более 5 раз, то он блокируется на 1 час

Это позволяет

  • Разгрузить сервер от обработки скриптов для атакующих IP
  • Снимает нагрузку на физический сервер
  • Позволяет подключать другие гибкие правила, для обработки запросов

5. Ссылки