Как усилить веб-сервер Apache с помощью mod_security и mod_evasive на CentOS

Если вас интересует установка mod_security на Apache под Windows, то обратитесь к статье "Как установить ModSecurity (mod_security) на Apache (на Windows)".

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

В этой статье мы обсудим, как установить и настроить mod_security and mod_evasive, предполагая, что веб-сервер Apache HTTP уже установлен и запущен. Мы выполним демо стресс-тест, чтобы увидеть, что веб-сервер реагирует, когда он попадает под атаку отказа в обслуживании (DOS) и покажем, как он борется с помощью этих модулей. В этом уроке мы будем использовать платформу CentOS.

Установка mod_security и mod_evasive

Если вы ещё не включили репозиторий EPEL в вашем сервере CentOS/RHEL, вам нужно это сделать до установки этих пакетов.

yum install mod_security
yum install mod_evasive

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

15007983049_be3d6ce897_o

Сейчас вам нужно убедиться, что когда Apache запустился, то он загрузил оба этих модуля. Найдите следующие строки, соответственно, в mod_security.conf и mod_evasive.conf (или добавьте их, если они отсутствуют).

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

В вышеприведённых строчках:

  • Директива LoadModule говорит Apache связать объектный файл (*.so) и добавить его в список активных модулей.
  • security2_module и evasive20_module имена модулей.
  • modules/mod_security2.so и modules/mod_evasive20.so — это относительные пути из директории /etc/httpd на исходные файлы модулей. В этом можно убедиться (и, если нужно, изменить), проверкой содержания каталога /etc/httpd/modules.

15191725511_bc6f22e1b5_o

Сейчас перезапустите веб-сервер Apache:

service httpd restart

Настройка mod_security

Чтобы использовать mod_security, сначала должен быть установлен Core Rule Set (CRS) (основной набор правил). В своей основе CRS обеспечивает веб-сервер набором правил о том, как реагировать на определённые обстоятельства. Trustwave's SpiderLabs (фирма, которая стоит за mod_security) обеспечивает OWASP (Open Web Application Security Project) ModSecurity CRS — Основной набор правил для ModSecurity от Открытого проекта по безопасности веб-приложений.

Для загрузки и установки последнего OWASP CRS используйте следующие команды.

mkdir /etc/httpd/crs
cd /etc/httpd/crs
wget https://codeload.github.com/SpiderLabs/owasp-modsecurity-crs/legacy.tar.gz/master
tar xzf master
mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs

Теперь перейдите в каталог с установленным OWASP CRS.

cd /etc/httpd/crs/owasp-modsecurity-crs

В каталоге OWASP CRS вы найдёте файл примеров с правилами (modsecurity_crs_10_setup.conf.example).

15008197157_685e4021c9_o

Мы скопируем его содержание в новый файл, названный (для удобства) modsecurity_crs_10_setup.conf.

cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

Чтобы сказать Apache использовать этот файл для модуля mod_security module, вставьте следующие строки в файл /etc/httpd/conf/httpd.conf. Точный путь может быть другим, в зависимости от того, где вы распаковали архив CRS.

<IfModule security2_module>
Include crs/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>

Последнее, но не менее важное, мы создадим наш собственный конфигурационный файл в каталоге modsecurity.d, где мы включим выбранные нами директивы. Мы назовём этот конфигурационный файл, например, codeby.conf. Настоятельно рекомендуется не редактировать непосредственно файл CRS, а разместить все необходимые директивы в конфигурационном файле. Это упростит дальнейшие обновления, когда будут выпускаться новые CRS.

vi /etc/httpd/modsecurity.d/codeby.conf
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
  • SecRuleEngine On: Использовать OWASP CRS для выявления и блокировки вредоносных атак.
  • SecRequestBodyAccess On: Включить проверку данных, передаваемых в теле запроса (например, параметры POST).
  • SecResponseBodyAccess On: Буфер ответа тел (только если MIME тип ответа соответствует списку, настроенному с SecResponseBodyMimeType).
  • SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream: Настраивает, какие MIME типы будут рассматриваться для буфера тела ответа. Если вы не знакомы с типами MIME или не уверены об их именах или использовании, вы можете проверить веб-сайт Internet Assigned Numbers Authority (IANA).
  • SecDataDir /tmp: Путь, где должны быть сохранены постоянные данные (например, данные IP адреса, данные сессии и т. д.). Здесь «постоянные» используется в том смысле, что они хранятся не в оперативной памяти, а на жёстком диске.

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

Не забудьте перезапустить Apache для применения изменений.

Настройка mod_evasive

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

Дефолтный файл mod_evasive.conf содержит следующие включённые директивы:

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
  • DOSHashTableSize: Размер хэш таблицы, которая используется для хранения трэка активности на один IP. Увеличение этого числа обеспечит более быстрый поиск сайтов, которые клиент посетил в прошлом, но может повлиять на общую производительность, если оно слишком велико.
  • DOSPageCount: Числоо идентичных запросов к определённому URI (например, к файлу, который обслуживает Apache), которые посетитель может сделать через интервал DOSPageInterval.
  • DOSSiteCount: похоже на DOSPageCount, но относится к тому, как много общих запросов может быть сделано к сайту за интервал DOSPageCount.
  • DOSBlockingPeriod: Если посетитель превысил лимиты, установленные DOSSPageCount или DOSSiteCount, он/она будут занесены в чёрный список на период времени DOSBlockingPeriod. Во время этого интервала, любой запрос, приходящий от него/неё, будет возвращён с ошибкой 403 Forbidden.

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

Здесь другие полезные директивы для mod_evasive:

1) DOSEmailNotify: Отправляет email по определённому адресу, когда IP заносится в чёрный список. В качестве аргумента нужен реальный адрес электронной почты. Если статус SELinux установлен на исполнение, вам нужно предоставить пользователю apache разрешение SELinux для отправки электронной почты. Это делается так, запустите эту команду как рут:

setsebool -P httpd_can_sendmail 1

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

DOSEmailNotify you@yourdomain.com

2. DOSSystemCommand: Выполняет настроенную системную команду, когда IP адрес добавляется в чёрный список. Это может пригодиться для добавления правил файервола для совместной блокировки IP нарушителей.

DOSSystemCommand <command>

Мы будем использовать эту директиву для добавления правила файервола через следующий скрипт (/usr/local/bin/scripts/ban_ip.sh):

#!/bin/sh
# mod_evasive выявил IP нарушителя
IP=$1
# Пусть к бинарнику iptables исполнимым под пользователем apache через sudo
IPTABLES="/sbin/iptables"
# mod_evasive блокируем директорию
MOD_EVASIVE_LOGDIR=/var/tmp
# Добавляем следующее правило файервола (блокируем IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Разблокируем IP нарушителя после 2 часов через команду 'at' ; смотрите 'man at' для дальнейших деталей
echo "$IPTABLES -D INPUT -s $IP -j DROP" | at now + 2 hours
# Удаляем блокировку директории для дальнейших проверок
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

Этот файл будет выполняться под пользователем apache. Он должен быть недоступен для записи, поэтому будет отлично, если вы выполните:

chattr +i /usr/local/bin/scripts/ban_ip.sh

— "chattr +i" не позволит никому (включая рута) модифицировать этот файл, следовательно, процесс apache будет не способен на внесение каких-либо изменений в этот скрипт;

— когда руту нужно сделать изменения в этом скрипте, он должен выполнить обратную команду (chattr -i /usr/local/bin/scripts/ban_ip.sh), а после того, как закончит, опять всё вернуть обратно командой chattr +i /usr/local/bin/scripts/ban_ip.sh.

Наша директива DOSSystemCommand будет выглядеть так:

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

Не забудьте обновить разрешения sudo для запуска нашего скрипта пользователем apache:

vi /etc/sudoers
apache ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh
Defaults:apache !requiretty

15194448202_1a546951f9_o

Симулируем DoS атаки

Мы будем использовать три инструмента для стресс-теста нашего веб-сервера Apache (запущенного на CentOS 6.5 с 512 MB оперативной памяти и с процессором AMD Athlon II X2 250), с включенными с выключенными mod_security и mod_evasive, и проверим, как веб-сервер поведёт себя в каждом случае.

Убедитесь, что вы выполняете эти шаги ТОЛЬКО к вашему собственному тест серверу, а НЕ к внешнему, рабочему веб-сайту.

В последующих примерах замените http://centos.codeby.net на ваш собственный домен по вашему выбору.

1. Apache bench: Инструмент проведения бенчмарка сервера Apache.

# ab -n1000 -c1000 
  • -n: Число выполняемых запросов за сессию проведения бенчмарка.
  • -c: Количество мульти запросов для выполнения за время.

2. test.pl: скрипт Perl, который поставляется с модулем mod_evasive.

#!/usr/bin/perl
# test.pl: small script to test mod_dosevasive's effectiveness
use IO::Socket;
use strict;
for(0..100) {
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "192.168.0.16:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET /?$_ HTTP/1.0nn";
$response = <$SOCKET>;
print $response;
close($SOCKET);
}

3. Low Orbit Ion Cannon (LOIC): инструмент для сетевого стресс-теста (подробности про этот инструмент, про его установку на Windows или на Linux, вы можете прочитать в отдельной статье). Для генерации нагрузки, сделайте так, как показано на скриншоте внизу, НЕ трогайте больше ничего.

15194393152_fdbbd5cd5b_o (1)

Результаты стресс-теста

С включёнными mod_security и mod_evasive (и этими тремя инструментами запущенными одновременно), пик использования CPU и RAM достиг максимума 60% и 50% соответственно, за 2 секунды до внесения IP в чёрный список, блокировки IP файерволом и, соответственно, остановки атаки.

С другой стороны, если отключены mod_security и mod_evasive, эти три вышеупомянутых инструмента отправляли очень быстро сервер в нокдаун (и оставляли его в этом состоянии на протяжении всей атаки) и, конечно, IP нарушителей не блокировались.

Заключение

Мы можем видеть​, что mod_security and mod_evasive, когда они должным образом настроены, — это два важных инструмента по укреплению веб-сервера Apache против нескольких угроз (не ограниченных атаками DoS) и их следует рассматривать в развёртываниях, открытых для Интернета.

Один комментарий

Добавить комментарий для Виталий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *