четверг, 12 декабря 2013 г.

Защищаем 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.


2 комментария:

Анонимный комментирует...

У меня nginx стоит как реверс прокси - и он все запросы передает на апач, в том числе и замедленные.

mod_reqitimeout и mod_antiliris вопрос нмного исправили, но слот апача все равно остается занятым на период 100-300 мсек пока обслуживает запрос.

Так что вопрос с баном по IP мне поможет несмотря на эти приблуды (выше).

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

Анонимный комментирует...

The Best Casino Site in the UK - Lucky Club
Our list of the best online luckyclub casinos offers plenty of fun and money to play online and on-line, Betfair, Paddy Power, Betfair, Coral, Betfair, Gambling.