Поиск по сайту:

Как защититься от DoS и DDoS с помощью mod_evasive для Apache на CentOS 7


Введение

Модуль mod_evasive Apache, ранее известный как mod_dosevasive, помогает защитить веб-сервер Apache от атак DoS, DDoS (распределенный отказ в обслуживании) и атак методом перебора. Он может обеспечивать действия по уклонению во время атак и сообщать о злоупотреблениях по электронной почте и средствам системного журнала. Модуль работает, создавая внутреннюю динамическую таблицу IP-адресов и URI, а также запрещая любой отдельный IP-адрес из любого из следующих:

  • Запрос одной и той же страницы чаще нескольких раз в секунду
  • Выполнение более 50 одновременных запросов к одному и тому же дочернему элементу в секунду.
  • Отправлять любые запросы, пока вы временно занесены в черный список.

Если какое-либо из вышеперечисленных условий выполняется, отправляется ответ 403, и IP-адрес регистрируется. При желании владельцу сервера можно отправить уведомление по электронной почте или выполнить системную команду для блокировки IP-адреса.

В этом руководстве мы обсудим, как установить, настроить и использовать mod_evasive на вашем сервере.

Предпосылки

Прежде чем приступить к работе с этим учебным пособием, у вас должно быть следующее:

  • CentOS 7, 64-разрядная капля (также работает с CentOS 6)
  • Пользователь без полномочий root с привилегиями sudo. Чтобы настроить пользователя этого типа, следуйте руководству по начальной настройке сервера с CentOS 7. Все команды будут выполняться от имени этого пользователя.
  • Веб-сервер Apache, работающий на дроплете. Чтобы установить Apache, следуйте шагу 1 статьи How To Install Linux, Apache, MySQL, PHP (LAMP) на CentOS.

Шаг 1 — Установка mod_evasive

В этом разделе мы установим пакеты, необходимые для работы mod_evasive, и, наконец, установим mod_evasive.

Во-первых, нам нужно установить на сервер репозиторий EPEL (Extra Packages for Enterprise Linux) yum. EPEL — это специальная группа Fedora, которая создает, поддерживает и управляет высококачественным набором дополнительных программных пакетов с открытым исходным кодом для Enterprise Linux. Выполните следующую команду, чтобы установить и включить репозиторий EPEL на вашем сервере:

В CentOS 7:

  1. sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

В CentOS 6:

  1. sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Давайте проверим, что репозиторий EPEL включен, используя:

  1. sudo yum repolist

Если включено, вы увидите следующее репо, указанное в выводе:

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64

Теперь давайте защитим базовые пакеты от EPEL с помощью плагина yum Protectbase.

  1. sudo yum install yum-plugin-protectbase.noarch -y

Плагин Protectbase предназначен для защиты определенных репозиториев yum от обновлений из других репозиториев. Пакеты в защищенных репозиториях не будут обновляться или переопределяться пакетами в незащищенных репозиториях, даже если незащищенный репозиторий имеет более позднюю версию.

Теперь мы готовы установить модуль mod_evasive. Выполните следующую команду, чтобы установить его:

  1. sudo yum install mod_evasive -y

Шаг 2 — Проверка установки

Теперь, когда mod_evasive установлен, давайте проверим, установлен ли файл конфигурации и загружается ли модуль.

Во время установки был добавлен конфигурационный файл mod_evasive /etc/httpd/conf.d/mod_evasive.conf. Чтобы проверить этот запуск:

  1. sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

Вывод должен выглядеть примерно так:

-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf

По умолчанию следующая строка LoadModule будет добавлена в начало файла конфигурации mod_evasive.conf. Откройте файл и добавьте строку, если ее еще нет. Эта строка указывает веб-серверу Apache загрузить и использовать модуль mod_evasive.

В CentOS 7 строка должна выглядеть следующим образом:

LoadModule evasive20_module modules/mod_evasive24.so

В CentOS 6 строка должна быть такой:

LoadModule evasive20_module modules/mod_evasive20.so

Давайте перечислим модули, загруженные для веб-сервера Apache, и найдем mod_evasive:

  1. sudo httpd -M | grep evasive

Вывод должен показать:

 evasive20_module (shared)

Шаг 3 — Настройка mod_evasive

Теперь, когда установка завершена и проверена, давайте рассмотрим конфигурацию модуля. mod_evasive можно легко настроить с помощью файла конфигурации mod_evasive.conf. В этом руководстве мы обсудим некоторые параметры конфигурации. Пожалуйста, обратитесь к конфигурационному файлу для получения информации обо всех параметрах — он содержит описание каждого параметра.

Один из параметров конфигурации, который необходимо изменить, — DOSEmailNotify. Это очень полезная директива. Если установлено это значение, электронное письмо будет отправлено на указанный адрес электронной почты всякий раз, когда IP-адрес будет занесен в черный список. В теле письма будет указано mod_evasive HTTP Blacklisted 111.111.111.111

Например, если вы хотите отправлять оповещения mod_evasive, чтобы сказать sammy@example.com, отредактируйте файл:

  1. sudo nano /etc/httpd/conf.d/mod_evasive.conf

Раскомментируйте строку DOSEmailNotify, удалив # перед строкой, и измените адрес электронной почты на свой:

DOSEmailNotify   sammy@example.com

Примечание: mod_evasive использует /bin/mail для отправки предупреждений по электронной почте. У вас должен быть установлен и работает почтовый сервер. Обратитесь к этому руководству за информацией о том, как настроить простой почтовый сервер, чтобы уведомления по электронной почте работали.

Другой параметр, который вы, возможно, захотите установить, это DOSWhitelist. Используя эту опцию, IP-адреса доверенных клиентов могут быть добавлены в белый список, чтобы гарантировать, что они никогда не будут отклонены. Целью внесения в белый список является защита программного обеспечения, скриптов, локальных поисковых роботов или других автоматизированных инструментов от отказа за запрос больших объемов данных с сервера.

Чтобы добавить IP-адрес в белый список, например 111.111.111.111, добавьте запись в файл конфигурации следующим образом:

DOSWhitelist	111.111.111.111

Подстановочные знаки можно использовать до последних 3 октетов IP-адреса, если это необходимо.

Чтобы внести в белый список несколько IP-адресов из разных диапазонов IP-адресов, вы можете добавить отдельные строки DOSWhitelist в файл конфигурации, например:

DOSWhitelist	111.111.111.111
DOSWhitelist	222.222.222.222

DOSPageCount и DOSSiteCount — два других параметра, которые рекомендуется изменить на менее агрессивные значения, чтобы избежать ненужной блокировки клиентов.

DOSPageCount – это ограничение на количество запросов одной и той же страницы за интервал между страницами (обычно устанавливается в одну секунду) по IP-адресу. Как только порог для этого интервала будет превышен, IP-адрес клиента будет добавлен в список заблокированных. По умолчанию установлено довольно низкое значение 2. Вы можете изменить его на более высокое значение, скажем, 20, отредактировав следующее в /etc/httpd/conf.d/mod_evasive.conf:

DOSPageCount 20

DOSSiteCount — это ограничение на общее количество запросов для одного и того же веб-сайта по IP-адресу за интервал сайта (по умолчанию 1 секунда). Чтобы изменить его на большее значение, например 100 секунд:

DOSSiteCount 100

Есть несколько других параметров, которые вы можете изменить для повышения производительности.

Одним из них является DOSBlockingPeriod, который представляет собой количество времени (в секундах), на которое клиент (IP-адрес) будет заблокирован, если он будет добавлен в список заблокированных. В течение этого времени все последующие запросы от клиента будут приводить к ошибке 403 (Forbidden) и сбросу таймера (по умолчанию 10 секунд).

Например, если вы хотите увеличить период блокировки до 300 секунд:

DOSBlockingPeriod	 300

Другим является DOSLogDir, который ссылается на временный каталог, используемый mod_evasive. По умолчанию /tmp будет использоваться для механизма блокировки, что создает некоторые проблемы с безопасностью, если ваша система открыта для пользователей оболочки. Если у вас есть непривилегированные пользователи оболочки, вам нужно создать каталог, доступный для записи только пользователю, от имени которого работает Apache (обычно apache), а затем установить этот параметр в файле mod_evasive.conf.

Например, чтобы установить каталог, используемый mod_evasive, в /var/log/mod_evasive, создайте каталог, используя:

  1. sudo mkdir /var/log/mod_evasive

Затем установите права собственности на пользователя apache:

  1. sudo chown -R apache:apache /var/log/mod_evasive

Теперь отредактируйте конфигурацию mod_evasive и измените каталог следующим образом:

DOSLogDir           "/var/log/mod_evasive"

Другой параметр — DOSSystemCommand. Если значение установлено, указанная команда будет выполняться всякий раз, когда IP-адрес занесен в черный список. Используя этот параметр, вы можете интегрировать mod_evasive с брандмауэром, установленным на вашем сервере, или скриптом оболочки и блокировать IP-адреса, занесенные в черный список mod_evasive в брандмауэре.

Шаг 4 — Загрузка модуля mod_evasive

После внесения изменений в файл конфигурации нам нужно перезапустить веб-сервер Apache, чтобы они вступили в силу. Выполните следующую команду, чтобы перезапустить Apache.

В CentOS 7:

  1. sudo systemctl restart httpd.service

В CentOS6:

  1. sudo service httpd restart

Примечание. Обратите внимание, что mod_evasive конфликтует с серверными расширениями FrontPage. Вы также можете проверить настройки веб-сервера Apache, чтобы убедиться, что mod_evasive может нормально работать. Предлагаемые настройки Apache должны иметь очень высокое значение для MaxRequestsPerChild, но не неограниченное (нулевое значение подразумевает неограниченное) и включить KeepAlive с помощью KeepAliveTimeout устанавливается достаточно долго.

Шаг 5 — Тестирование mod_evasive

Давайте проведем небольшой тест, чтобы убедиться, что модуль работает правильно. Мы будем использовать perl-скрипт test.pl, написанный разработчиками mod_evasive. Чтобы выполнить скрипт, нам нужно сначала установить пакет perl на сервер, используя:

  1. sudo yum install -y perl

Тестовый скрипт устанавливается вместе с mod_evasive по следующему адресу:

/usr/share/doc/mod_evasive-1.10.1/test.pl

По умолчанию тестовый скрипт запрашивает одну и ту же страницу с вашего веб-сервера Apache 100 раз подряд для запуска mod_evasive. В последнем разделе мы модифицировали mod_evasive, чтобы он был более терпимым к запросам в секунду на одну и ту же страницу. Нам нужно изменить сценарий на 200 запросов подряд вместо 100, чтобы убедиться, что мы запускаем все методы уведомления mod_evasive.

Отредактируйте /usr/share/doc/mod_evasive-1.10.1/test.pl:

  1. sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl

Найдите следующую строку:

for(0..100) {

Замените 100 на 200:

for(0..200) {

Сохранить и выйти.

Чтобы выполнить скрипт, запустите:

  1. sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

Вы должны увидеть вывод, похожий на:

HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...

Скрипт делает 100 запросов к вашему веб-серверу. код ответа 403 указывает на то, что доступ запрещен веб-сервером. mod_evasive также регистрируется в системном журнале, когда IP-адрес заблокирован. Проверьте файл журнала, используя:

  1. sudo tailf /var/log/messages

Должна появиться строка, похожая на:

Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.

указывает, что IP-адрес заблокирован mod_evasive.

Если вы настроили mod_evasive для отправки предупреждений по электронной почте, когда IP-адрес заблокирован, вы получите электронное письмо со следующим содержанием:

mod_evasive HTTP Blacklisted 127.0.0.1

Заключение

mod_evasive отлично справляется с одиночным сервером, атаками по сценарию, а также распределенными атаками. Тем не менее, это полезно только с точки зрения общей пропускной способности вашего сервера и мощности процессора для обработки и ответа на недействительные запросы. По этой причине рекомендуется интегрировать этот модуль с брандмауэром вашего сервера для максимальной защиты. Без действительно хорошей инфраструктуры и брандмауэра тяжелая DDoS-атак может вывести вас из сети. Если атака очень серьезная и постоянная, вам может потребоваться перейти на аппаратное решение по смягчению последствий DDoS.