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

DIGL`KAYT

.:Я на всегда:.
Admins
Регистрация
7 Янв 2018
Сообщения
354
Репутация
77
#1
Безопасность веб-сервера — это обширная тема, и разные люди имеют различные предпочтения и варианты по выбору лучших инструментов и техник, которые усилят конкретный веб-сервер. По поводу веб-сервера Apache большинство экспертов, если не все, согласны, что mod_security и mod_evasive — это два очень важных модуля, которые могут защитить веб-сервер Apache против общих угроз.

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

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

yum install mod_security

yum install mod_evasive





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



Сейчас вам нужно убедиться, что когда 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.


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

service httpd restart





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

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

mkdir /etc/httpd/crs

cd /etc/httpd/crs

wget
У Вас недостаточно прав для просмотра ссылок. Войдите или зарегистрируйтесь.


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



Мы скопируем его содержание в новый файл, названный (для удобства) 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.



Include crs/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf

Include crs/owasp-modsecurity-crs/base_rules/*.conf







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

vi /etc/httpd/modsecurity.d/codeby.conf







SecRuleEngine On

SecRequestBodyAccess On

SecResponseBodyAccess On

SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream

SecDataDir /tmp







  • SecRuleEngine On: Использовать OWASP CRS для выявления и блокировки вредоносных атак.
  • SecRequestBodyAccess On: Включить проверку данных, передаваемых в теле запроса (например, параметры POST).
  • SecResponseBodyAccess On: Буфер ответа тел (только если MIME тип ответа соответствует списку, настроенному с SecResponseBodyMimeType).
  • SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream: Настраивает, какие MIME типы будут рассматриваться для буфера тела ответа. Если вы не знакомы с типами MIME или не уверены об их именах или использовании, вы можете проверить веб-сайт
    У Вас недостаточно прав для просмотра ссылок. Войдите или зарегистрируйтесь.
    .
  • SecDataDir /tmp: Путь, где должны быть сохранены постоянные данные (например, данные IP адреса, данные сессии и т. д.). Здесь «постоянные» используется в том смысле, что они хранятся не в оперативной памяти, а на жёстком диске.
Вы можете обратиться к
У Вас недостаточно прав для просмотра ссылок. Войдите или зарегистрируйтесь.
для полной инструкции по конфигурационным директивам.

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





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

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



DOSHashTableSize 3097

DOSPageCount 2

DOSSiteCount 50

DOSPageInterval 1

DOSSiteInterval 1

DOSBlockingPeriod 10







  • 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 [email protected]





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

DOSSystemCommand





Мы будем использовать эту директиву для добавления правила файервола через следующий скрипт (/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



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

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

В последующих примерах замените
У Вас недостаточно прав для просмотра ссылок. Войдите или зарегистрируйтесь.
на ваш собственный домен по вашему выбору.

1.
У Вас недостаточно прав для просмотра ссылок. Войдите или зарегистрируйтесь.
: Инструмент проведения бенчмарка сервера 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): инструмент для сетевого стресс-теста. Для генерации нагрузки, сделайте так, как показано на скриншоте внизу, НЕ трогайте больше ничего.



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

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

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