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


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

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

ModSecurity

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

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

[email protected]:~# apt-get install libapache-mod-security 

Создаем конфигурационный файл /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.

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

[email protected]:~# apt-get install libapache2-mod-evasive 

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

[email protected]:~# mkdir /var/log/apache2/mod_evasive
[email protected]:~# 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, он позволяет сделать в то, за что все любят PF — работать с таблицами ip-адресов. А возможность задавать тайм-аут для записей таблицы избавляет нас от необходимости впоследствии обрабатывать наш бан лист.

[email protected]:~# ipset create modevasive hash:ip hashsize 4096 timeout 120
[email protected]:~# 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

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

[email protected]:~# a2enmod mod-evasive
[email protected]:~# a2enmod mod-security

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

[email protected]:~# service apache2 restart