Защита HTTP сервера Apache от DDoS атак

Простая защита от DoS атак на HTTP сервер Apache

Мой блог живёт на маленьком одноплатном компьютере Raspberry Pi 3 Model B+, и при обычной нагрузке HTTP сервер Apache2, который его обслуживает, легко справляется со своим делом. Но однажды, играясь с Andrax на смартфоне я обнаружил, что легко могу его «положить», закидав мусорными запросами с помощью приложения для осуществления DoS атак из данного дистрибутива. И хоть у меня не супер мощный топовый сервер, а всего лишь одноплатный компьютер за пару сотен десятков баксов — всё равно так дело не пойдёт и нужно с этим бороться. Хотя бы от одного пользователя мы должны отмахаться 😁

Как я положил HTTP сервер?

Далее пойдёт речь об инструментах, при помощи которых можно причинить реальный ущерб компьютерным системам! Данные инструменты можно использовать только для проверки собственных компьютерных систем на стойкость к DoS атакам! Я не несу никакой ответственности за любой возможный вред, причинённый Вами кому-либо вследствие прочтения данного материала! Не согласны — закрывайте страницу!

В состав дистрибутива Andrax входит одна небольшая утилита на Python под названием GoldenEye (страница на Github).

GoldenEye
GoldenEye — инструмент для проведения DoS атак

С настройками по умолчанию за несколько секунд GoldenEye закидал мой HTTP сервер GET запросами типа https://imatvey.xyz/?w4tgwaui44hmgiklasff34wf до состояния, при котором Apache перестал отдавать страницы блога легитимным пользователям, а память и процессор Raspberry Pi были загружены на 100% процессами apache и php-fpm. Это и есть классическая успешная DoS атака.

Как этому противостоять?

HTTP сервер Apache за свою долгую историю обзавёлся множеством дополнительных модулей, расширяющих его фунекциональность в ту или иную сторону. И среди них есть как раз тот, который мне нужен: mod_qos.

Установка mod_qos

Устанавливать и настраивать будем на примере операционной системы Debian GNU/Linux. Ставим пакет libapache2-mod-qos.

sudo apt install libapache2-mod-qos

Настройка

Настройки модуля хранятся в файле /etc/apache2/mods-available/qos.conf. Открываем для редактирования любым текстовым редактором, мне например nano нравится.

sudo nano /etc/apache2/mods-available/qos.conf

Конфигурационный файл по умолчанию имеет следующий вид:

<IfModule qos_module>
  # minimum request rate (bytes/sec at request reading):
  #QS_SrvRequestRate                                 120

  # limits the connections for this virtual host:
  #QS_SrvMaxConn                                     100

  # allows keep-alive support till the server reaches 600 connections:
  #QS_SrvMaxConnClose                                600

  # allows max 50 connections from a single ip address:
  #QS_SrvMaxConnPerIP                                 50
</IfModule>

Далее настраиваем по вкусу. Довольно подробное руководство по настройке есть на Opennet. Мне же хватило наскомментировать строку QS_SrvMaxConnPerIP и понизить ее значение с 50 до 5. Этот параметр ограничивает максимальное количество одновеменных соединений с одного IP адреса. Сохраняем конфиг и включаем модуль командой

sudo a2enmod qos

Для применения изенений перезапускаем Apache.

sudo systemctl restart apache2.service

Готово. Теперь после запуска атаки GoldenEye блог открывается без проблем.