По данным 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 необходимы правила. Их можно написать самому, а можно воспользоваться готовыми правилами, которые предоставляются в рамках проекта OWASP — ModSecurity 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