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