Вступление
Модуль 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-атак.