Защита от DoS и DDoS атак при помощи mod_evasive на Apache

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

  • Запрос одной и той же страницы несколько раз в секунду.
  • Создание более 50 одновременных запросов в секунду на один и тот же дочерний процесс.
  • Создание каких-либо запросов при временном внесении в черный список.

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

Это руководство поможет установить, настроить и начать работу с mod_evasive.

Требования

  • 64-битный сервер CentOS 7 (или 6).
  • Не-root пользователь с правами sudo (о начальной настройке сервера и создании такого пользователя можно прочитать здесь).
  • Предварительно установленный и запущенный сервер Apache (инструкции по установке можно найти специальном разделе данного руководства).

1: Установка mod_evasive

Для начала нужно установить все пакеты, необходимые для корректной работы mod_evasive.

Одним из них является репозиторий EPEL (Extra Packages for Enterprise Linux).

Примечание: EPEL создаёт, поддерживает и управляет высококачественными наборами дополнительных открытых пакетов для 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 при помощи protectbase:

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

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

Теперь можно установить mod_evasive.

sudo yum install mod_evasive -y

2: Проверка установки

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

Во время установки в системе появляется конфигурационный файл модуля (/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

По умолчанию в начало конфигурационного файла mod_evasive.con добавляется строка LoadModule. Откройте файл и добавьте эту строку самостоятельно, если она не добавилась автоматически; эта настройка отвечает за поддержку веб-сервером 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 и настроить некоторые параметры.

Примечание: Данное руководство охватывает только базовые параметры настройки модуля. Конфигурационный файл содержит детальное описание каждого параметра; в случае необходимости, пожалуйста, обратитесь к нему за подробностями.

Откройте файл в текстовом редакторе:

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

Первый параметр, который нужно отредактировать – DOSEmailNotify. Эта директива отправляет извещения на указанный адрес в случае атаки на сервер. Сообщение выглядит так:

mod_evasive HTTP Blacklisted 111.111.111.111

К примеру, чтобы модуль отправлял извещения на адрес 8host@example.com, нужно добавить в файл (или раскомментировать) строку:

DOSEmailNotify   8host@example.com

Примечание: для отправки извещений модуль mod_evasive использует /bin/mail. Для этого вам нужно установить и настроить почтовый сервер.

Следующий параметр – DOSWhitelist. Эта директива задаёт список заведомо безопасных IP-адресов. Такие адреса никогда не будут заблокированы. Цель белого списка заключается в защите программного обеспечения, сценариев, локальных поисковиков и других автоматизированных средств системы от блокировки в случае запроса больших объемов данных.

Чтобы добавить адрес в белый список, внесите в файл следующую строку:

DOSWhitelist    111.111.111.111

Примечание: Замените условный IP своим IP-адресом.

Чтобы добавить в белый список несколько IP-адресов, просто добавьте новую директиву DOSWhitelist для следующего адреса:

DOSWhitelist    111.111.111.111
DOSWhitelist    222.222.222.222

Далее рекомендуется настроить параметры DOSPageCount и DOSSiteCount. Установите более щадящие значения, в противном случае модуль будет безосновательно блокировать клиентов.

DOSPageCount ограничивает количество запросов IP-адреса к одной странице в течение определённого интервала времени (как правило, в течение 1 секунды). Если IP-адрес превысил лимит, он будет заблокирован. Значение по умолчанию – 2 – очень строгое, и многие клиенты могут случайно попасть в бан. Измените его хотя бы на 20:

DOSPageCount 20

DOSSiteCount ограничивает общее количество запросов IP-адреса (т.е. ко всем страницам сайта) в течение определённого интервала (по умолчанию – за 1 секунду). Увеличьте значение данного параметра до 100:

DOSSiteCount 100

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

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

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 при помощи брандмауэра.

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

После изменения параметров модуля перезапустите веб-сервер Apache, чтобы активировать обновления.

Для CentOS 7:

sudo systemctl restart httpd.service

Для CentOS 6:

sudo service httpd restart

Примечание: Модуль mod_evasive конфликтует с серверными расширениями FrontPage.

Также рекомендуется проверить настройки Apache на совместимость с настройками mod_evasive.

В случае конфликта рекомендуется увеличить значение параметра MaxRequestsPerChild (но не unlimited, которое задаётся при помощи 0) и включить 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

По умолчанию скрипт test создаёт 100 запросов к одной странице Apache; такое поведение должно запустить модуль. Если вы изменили параметры модуля, сделав их более мягкими, отредактируйте скрипт, чтобы увеличить количество запросов до 200. Откройте файл скрипта:

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
...

Код ошибки 403 значит, что доступ к серверу заблокирован. Модуль добавит вредоносный 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 HTTP Blacklisted 127.0.0.1

Заключение

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

Tags: , , , ,

Добавить комментарий