Защищаем Apache2 от SlowLoris DDoS

Что такое SlowLoris

У вас случалось такое, когда на сервере нагрузки нет, свободной памяти достаточно, и при этом ваш сайт не открывается?

Если при этом на статусной страничке апача все треды в состоянии R (reading), весьма вероятно, что вы находитесь под атакой SlowLoris.

SlowLoris означает, что злоумышленники открывают множество коннектов к серверу, однако не посылают много-много запросов, а, наоборот, посылают один и медленно-медленно. В таком случае серверу не остается ничего другого, кроме как ждать, когда же вы запрос наконец придёт. А он всё не приходит и не приходит.

В результате все треды (или потоки) апача заняты тем, что ждут, когда же всё-таки запрос придёт.

Nginx перед или вместо Апача

Nginx атаке SlowLoris практически не подвержен. Конечно, у него есть лимит открытых соединений, который по дефолту довольно маленький, однако его можно увеличивать практически безболезненно для системы. Не забывая, конечно, при этом увеличивать значение worker_rlimit_nofile.

Однако иногда бывает, что по каким-то причинам Нжинкс перед Апачем не поставить. Делать нечего, надо отбиваться другими силами.

Так и как бороться?

Я для этой цели написал небольшой скрипт, который делает следующее:

 

  1. Выбираем из /server-status список PID’ов процессов апача, которые заняты чтением (reading).
  1. Из вывода netstat смотрим, с каких IP идут коннекты
  1. Баним эти IP
#!/bin/bash
date >> /tmp/banned
lynx -dump  localhost/server-status | grep reading | awk '{if ($6 > 10 ) print $2}' > /tmp/processes
for pid in `cat /tmp/processes`; do
        IP=`netstat -ntp | grep EST| grep $pid | awk '{print $5}' | cut -d: -f1`;
        echo $IP >>  /tmp/banned
        iptables -t raw -I PREROUTING -s $IP -j DROP 2>/dev/null
done

И запускаем этот скрипт по крону раз в сколько-то минут.
Для его работы необходим lynx, который можно установить командой:

$ sudo aptitude install lynx

Не забудьте включить mod_status у апача. В моём случае он отвечает на localhost/server-status.

Автор: AlexWinner
Дата публикации: 2013-12-12T12:25:00.001-08:00