Защита от DoS и DDoS атак при помощи mod_evasive на Apache
Centos | Комментировать запись
Модуль веб-сервера 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: Apache, CentOS 6, CentOS 7, EPEL, mod_evasive