Как защититься от 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:
- 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 с помощью плагина yum Protectbase.
- sudo yum install yum-plugin-protectbase.noarch -y
Плагин Protectbase предназначен для защиты определенных репозиториев yum от обновлений из других репозиториев. Пакеты в защищенных репозиториях не будут обновляться или переопределяться пакетами в незащищенных репозиториях, даже если незащищенный репозиторий имеет более позднюю версию.
Теперь мы готовы установить модуль mod_evasive. Выполните следующую команду, чтобы установить его:
- sudo yum install mod_evasive -y
Шаг 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 строка должна выглядеть следующим образом:
LoadModule evasive20_module modules/mod_evasive24.so
В CentOS 6 строка должна быть такой:
LoadModule evasive20_module modules/mod_evasive20.so
Давайте перечислим модули, загруженные для веб-сервера Apache, и найдем mod_evasive:
- 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, отредактируйте файл:
- 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
, создайте каталог, используя:
- sudo mkdir /var/log/mod_evasive
Затем установите права собственности на пользователя apache
:
- 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:
- sudo systemctl restart httpd.service
В CentOS6:
- sudo service httpd restart
Примечание. Обратите внимание, что mod_evasive конфликтует с серверными расширениями FrontPage. Вы также можете проверить настройки веб-сервера Apache, чтобы убедиться, что mod_evasive может нормально работать. Предлагаемые настройки Apache должны иметь очень высокое значение для MaxRequestsPerChild
, но не неограниченное (нулевое значение подразумевает неограниченное) и включить KeepAlive
с помощью KeepAliveTimeout
устанавливается достаточно долго.
Шаг 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
Найдите следующую строку:
for(0..100) {
Замените 100 на 200:
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.