Поиск по сайту:

Защитите Apache от грубой силы или DDoS-атак с помощью модулей Mod_Security и Mod_evasive


Для тех из вас, кто занимается хостинговым бизнесом или если вы размещаете свои собственные серверы и предоставляете им доступ к Интернету, защита ваших систем от злоумышленников должна быть высоким приоритетом.

mod_security (механизм обнаружения и предотвращения вторжений с открытым исходным кодом для веб-приложений, который легко интегрируется с веб-сервером) и mod_evasive — два очень важных инструмента, которые можно использовать для защиты веб-сервера. против грубой силы или (D)DoS-атак.

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

В этой статье мы обсудим, как установить, настроить и запустить их вместе с Apache в RHEL/CentOS 8 и 7 как а также Fedora. Кроме того, мы будем моделировать атаки, чтобы убедиться, что сервер реагирует соответствующим образом.

Предполагается, что в вашей системе установлен сервер LAMP. Если нет, пожалуйста, прочтите эту статью, прежде чем продолжить.

  • Как установить сервер LAMP на CentOS 8
  • Как установить стек LAMP в RHEL/CentOS 7

Вам также потребуется настроить iptables в качестве интерфейса брандмауэра по умолчанию вместо firewalld, если вы используете RHEL/CentOS 8/7 или Fedora . . Мы делаем это, чтобы использовать один и тот же инструмент как в RHEL/CentOS 8/7, так и в Fedora.

Шаг 1. Установка брандмауэра Iptables на RHEL/CentOS 8/7 и Fedora

Для начала остановите и отключите firewalld:

systemctl stop firewalld
systemctl disable firewalld

Затем установите пакет iptables-services перед включением iptables:

yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables

Шаг 2. Установка Mod_Security и Mod_evasive

Помимо уже установленной настройки LAMP, вам также необходимо включить репозиторий EPEL в RHEL/CentOS 8/7, чтобы для установки обоих пакетов. Пользователям Fedora не нужно включать какое-либо репо, поскольку epel уже является частью проекта Fedora.

yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive

После завершения установки вы найдете файлы конфигурации для обоих инструментов в /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Теперь, чтобы интегрировать эти два модуля с Apache и загрузить их при запуске, убедитесь, что следующие строки появляются в разделе верхнего уровня mod_evasive.conf и mod_security.conf соответственно:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Обратите внимание, что modules/mod_security2.so и modules/mod_evasive24.so — это относительные пути от каталога /etc/httpd до исходного файла. модуля. Вы можете проверить это (и при необходимости изменить), перечислив содержимое каталога /etc/httpd/modules:

cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'

Затем перезапустите Apache и убедитесь, что он загружает mod_evasive и mod_security:

systemctl restart httpd 	

Дамп списка загруженных статических и общих модулей.

httpd -M | grep -Ei '(evasive|security)'				

Шаг 3. Установка основного набора правил и настройка Mod_Security

Короче говоря, Основной набор правил (также известный как CRS) предоставляет веб-серверу инструкции о том, как вести себя в определенных условиях. Фирма-разработчик mod_security предоставляет бесплатную CRS под названием OWASP (Open Web Application Security Project) ModSecurity CRS, которую можно загрузить и установить следующим образом.

1. Загрузите OWASP CRS в каталог, созданный для этой цели.

mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Разархивируйте файл CRS и измените имя каталога по нашему усмотрению.

tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Теперь пришло время настроить mod_security. Скопируйте файл примера с правилами (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) в другой файл без расширения .example:

cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf

и сообщите Apache использовать этот файл вместе с модулем, вставив следующие строки в файл основной конфигурации веб-сервера /etc/httpd/conf/httpd.conf. Если вы решили распаковать архив в другой каталог, вам нужно будет отредактировать пути, соответствующие директивам Include:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Наконец, рекомендуется создать собственный файл конфигурации в каталоге /etc/httpd/modsecurity.d, куда мы поместим наши настроенные директивы (мы назовем его tecmint.conf в следующем примере) вместо непосредственного изменения файлов CRS. Это позволит упростить обновление CRS по мере выпуска новых версий.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Вы можете обратиться к репозиторию ModSecurity GitHub от SpiderLabs для получения полного пояснительного руководства по директивам конфигурации mod_security.

Шаг 4: Настройка Mod_Evasive

mod_evasive настраивается с помощью директив в /etc/httpd/conf.d/mod_evasive.conf. Поскольку во время обновления пакета нет правил, которые нужно обновлять, нам не нужен отдельный файл для добавления настраиваемых директив, в отличие от mod_security.

В файле mod_evasive.conf по умолчанию включены следующие директивы (обратите внимание, что этот файл сильно закомментирован, поэтому мы удалили комментарии, чтобы выделить директивы конфигурации ниже):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Пояснения к директивам:

  • DOSHashTableSize: эта директива определяет размер хеш-таблицы, которая используется для отслеживания активности каждого IP-адреса. Увеличение этого числа обеспечит более быстрый поиск сайтов, которые клиент посещал в прошлом, но может повлиять на общую производительность, если оно установлено слишком высоким.
  • DOSPageCount: допустимое количество идентичных запросов к определенному URI (например, любому файлу, обслуживаемому Apache), которое может быть выполнено посетителем в течение интервала DOSPageInterval.
  • DOSSiteCount: аналогично DOSPageCount, но указывает, сколько общих запросов можно сделать ко всему сайту за интервал DOSSiteInterval.
  • DOSBlockingPeriod: если посетитель превышает ограничения, установленные DOSSPageCount или DOSSiteCount, его исходный IP-адрес будет занесен в черный список на период времени DOSBlockingPeriod. Во время DOSBlockingPeriod любые запросы, поступающие с этого IP-адреса, будут вызывать ошибку 403 Forbidden.

Не стесняйтесь экспериментировать с этими значениями, чтобы ваш веб-сервер мог обрабатывать необходимый объем и тип трафика.

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

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

DOSEmailNotify

Если у вас есть работающий почтовый сервер, вы можете отправлять предупреждающие сообщения через Apache. Обратите внимание, что вам нужно будет предоставить пользователю Apache разрешение SELinux на отправку электронной почты, если для SELinux установлено принудительное применение. Вы можете сделать это, запустив

setsebool -P httpd_can_sendmail 1

Затем добавьте эту директиву в файл mod_evasive.conf вместе с остальными директивами:

DOSEmailNotify [email 

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

DOSСистемнаякоманда

Для этого нужна действительная системная команда в качестве аргумента,

DOSSystemCommand </command>

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

Напишите сценарий оболочки, который обрабатывает черный список IP-адресов на уровне брандмауэра.

Когда IP-адрес попадает в черный список, нам необходимо заблокировать будущие соединения, исходящие с него. Мы будем использовать следующий сценарий оболочки, который выполняет эту работу. Создайте каталог с именем scripts-tecmint (или любое другое имя по вашему выбору) в /usr/local/bin и файл с именем ban_ip.sh. в этом каталоге.

#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

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

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

В строке выше %s представляет IP-адрес нарушителя, обнаруженный mod_evasive.

Добавьте пользователя Apache в файл sudoers

Обратите внимание: все это не будет работать, если вы не дадите пользователю apache разрешения на запуск нашего скрипта (и только этого скрипта!) без терминала и пароля. Как обычно, вы можете просто ввести visudo от имени пользователя root, чтобы получить доступ к файлу /etc/sudoers, а затем добавить следующие две строки, как показано на рисунке ниже:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

ВАЖНО. В качестве политики безопасности по умолчанию вы можете запускать sudo только в терминале. Поскольку в этом случае нам нужно использовать sudo без tty, нам нужно закомментировать строку, выделенную на следующем изображении:

#Defaults requiretty

Наконец, перезапустите веб-сервер:

systemctl restart httpd

Шаг 4. Имитация DDoS-атаки на Apache

Существует несколько инструментов, которые вы можете использовать для имитации внешней атаки на ваш сервер. Вы можете просто поискать в Google «инструменты для моделирования DDoS-атак», чтобы найти несколько из них.

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

Если вы хотите сделать то же самое с VPS, размещенным у кого-то другого, вам необходимо соответствующим образом предупредить своего хостинг-провайдера или попросить разрешения на прохождение такого потока трафика через его сети. linux-console.net ни в коем случае не несет ответственности за ваши действия!

Кроме того, запуск имитации DoS-атаки только с одного хоста не представляет собой реальную атаку. Чтобы смоделировать такое, вам нужно будет одновременно нацелить свой сервер на несколько клиентов.

Наша тестовая среда состоит из сервера CentOS 7 [IP 192.168.0.17] и хоста Windows, с которого мы запустим атаку [IP 192.168.0.103< /б>]:

Пожалуйста, воспроизведите видео ниже и выполните шаги, описанные в указанном порядке, чтобы смоделировать простую DoS-атаку:

Затем IP-адрес-нарушитель блокируется iptables:

Заключение

При включенных mod_security и mod_evasive имитируемая атака приводит к тому, что ЦП и ОЗУ экспериментируют с временным пиком использования для всего за пару секунд до того, как исходные IP-адреса будут занесены в черный список и заблокированы брандмауэром. Без этих инструментов моделирование наверняка очень быстро выведет сервер из строя и сделает его непригодным для использования во время атаки.

Нам бы хотелось узнать, планируете ли вы использовать (или использовали в прошлом) эти инструменты. Мы всегда с нетерпением ждем вашего ответа, поэтому не стесняйтесь оставлять свои комментарии и вопросы, если таковые имеются, используя форму ниже.

Справочные ссылки

https://www.modsecurity.org/




Все права защищены. © Linux-Console.net • 2019-2024