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

Вступление

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

  • Запрос одной и той же страницы чаще, чем несколько раз в секунду

  • Делать более 50 одновременных запросов на одного и того же ребенка в секунду

  • Делать любые запросы, временно находясь в черном списке

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

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

Предпосылки

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

  • CentOS 7 64-bit Droplet (работает также с CentOS 6)

  • Пользователь без полномочий root с привилегиями sudo. Чтобы настроить пользователя этого типа, следуйте руководствуInitial Server Setup with CentOS 7. Все команды будут выполняться от имени этого пользователя.

  • Веб-сервер Apache, работающий на Droplet. Чтобы установить Apache, выполните шаг №1 статьиHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS.

[[step-1 -—- install-mod_evasive]] == Шаг 1. Установка mod_evasive

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

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

На CentOS 7:

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

На CentOS 6:

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

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

sudo yum repolist

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

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64

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

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

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

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

sudo yum install mod_evasive -y

[[step-2 -—- verifying-the-installation]] == Шаг 2 - Проверка установки

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

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

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

/etc/httpd/conf.d/mod_evasive.conf

LoadModule evasive20_module modules/mod_evasive24.so

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

/etc/httpd/conf.d/mod_evasive.conf

LoadModule evasive20_module modules/mod_evasive20.so

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

sudo  httpd -M | grep evasive

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

 evasive20_module (shared)

[[step-3 -—- configuring-mod_evasive]] == Шаг 3 - Настройка mod_evasive

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

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

Например, если вы хотите отправлять предупреждения mod_evasive, чтобы сказать[email protected], отредактируйте файл:

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSEmailNotify   [email protected]

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

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSWhitelist    111.111.111.111

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSWhitelist    111.111.111.111
DOSWhitelist    222.222.222.222

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSPageCount 20

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

/etc/httpd/conf.d/mod_evasive.conf

DOSSiteCount 100

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

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSBlockingPeriod    300

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

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

sudo mkdir /var/log/mod_evasive

Затем установите право собственности наapache user:

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

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

/etc/httpd/conf.d/mod_evasive.conf

DOSLogDir           "/var/log/mod_evasive"

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

[[step-4 -—- loading-the-mod_evasive-module]] == Шаг 4 - Загрузка модуля mod_evasive

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

На CentOS 7:

sudo systemctl restart httpd.service

На CentOS6:

sudo service httpd restart

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

[[step-5 -—- testing-mod_evasive]] == Шаг 5. Тестирование mod_evasive

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

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:

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

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

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

for(0..100) {

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

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

for(0..200) {

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

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

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-адрес заблокирован. Проверьте файл журнала, используя:

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-атак.

Related