Web Application Firewall и защита от DoS для веб-сервера Apache

По данным Netcraft на момент написания этой записи Apache все еще остается самым популярным веб-сервером и обслуживает 54% всех сайтов интернета.

В этой записи я хочу рассказать о двух модулях для веб-сервера Apache, которые позволяют немного повысить безопасность обслуживаемых им сайтов. В качестве примера будем использовать Ubuntu Linux 12.04 Precise Pangolin.

ModSecurity

О модуле mod_security наверняка слышали все, кто работает с веб-сервером Apache. Он представляет собой Web Application Firewall с открытым исходным кодом и защищает веб-прриложения от уязвимостей, таких как SQL injection, Cross-site Scripting, Local/Remote File Include и прочих.

Для работы mod_security необходимы правила. Их можно написать самому, а можно воспользоваться готовыми правилами, которые предоставляются в рамках проекта OWASPModSecurity Core Rule Set (SRS), они, кстати говоря, есть в репозитариях Ubutu. Их и будем использовать.

root@www:~# apt-get install libapache-mod-security modsecurity-crs

Создаем конфигурационный файл /etc/apache2/conf.d/mod_security.conf


	Include /usr/share/modsecurity-crs/*.conf
	Include /usr/share/modsecurity-crs/base_rules/*.conf
	SecWriteStateLimit 50

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

mod_evasive

В деле защиты от Brute-force и DoS-атак нам поможет еще один модуль Apache — mod_evasive.

root@www:~# apt-get install libapache2-mod-evasive ipset

Ему потребуется рабочий каталог, по умолчанию используется «/tmp», но это не лучший вариант.

root@www:~# mkdir /var/log/apache2/mod_evasive
root@www:~# chown www-data:www-data /var/log/apache2/mod_evasive 

Создаем конфигурационный файл /etc/apache2/conf.d/mod_evasive.conf


	DOSHashTableSize 3097  # размер хэш-таблицы которая обрабатывает запросы к веб-серверу.
	DOSPageCount 2         # число запросов к одной странице от одного и того же ip-адреса в течение DOSPageInterval
	DOSSiteCount 10        # число запросов ко всем страницам домена от одного и того же ip-адреса в течение DOSSiteInterval
	DOSPageInterval 1 
	DOSSiteInterval 1 
	DOSBlockingPeriod 120  # время блокировки ip-адреса в секундах
	DOSLogDir /var/log/apache2/mod_evasive 
	DOSEmailNotify [email protected] 
	DOSWhitelist 127.0.0.1
	DOSSystemCommand    "/usr/bin/sudo /usr/local/bin/modevasive_ddos.sh %s"

По-умолчанию когда mod_evasive доступ к веб-серверу у него сохраняется, но вместо контента отдается «HTTP/1.1 403 Forbidden». Но, опция DOSSystemCommand дает нам возможность выполнить проивольную команду и, например, заблокировать атакующий ip-адрес средствами пакетного фильтра.

Этим мы и воспользуемся. Поможет нам в этом ipset, он позволяет сделать в iptables то, за что все любят PF — работать с таблицами ip-адресов. А возможность задавать тайм-аут для записей таблицы избавляет нас от необходимости впоследствии обрабатывать наш бан лист.

root@www:~# ipset create modevasive hash:ip hashsize 4096 timeout 120
root@www:~# iptables -I INPUT  -m set --match-set modevasive src -p TCP \
     -m multiport --destination-ports 80,443 -j DROP

Скрипт /usr/local/bin/modevasive_ddos.sh выглядит следующим образом:

#!/bin/bash
if [ "x$1" = "x" ] ; then
    echo "USAGE: $0 ip"
    exit
fi
/usr/sbin/ipset add modevasive $1 timeout 120

Необходимо так же внести в /etc/sudoers изменения, которые позволят пользователю, из-под которого работает веб-сервер выполнять скрипт блокировки.

www-data  ALL=(ALL:ALL) NOPASSWD: /usr/local/bin/modevasive_ddos.sh

Убедимся что модули включены.

root@www:~# a2enmod mod-evasive
root@www:~# a2enmod mod-security

И перезапускаем Apache для того чтобы выполненные настройки применились.

root@www:~# service apache2 restart