Add Me!Закрыть меню навигации
Login
Добавь меня!Открытое Меню Категорий

Простенькая защита от Slowloris HTTP DoS, написанная на коленке

Есть такой тип атаки по http, в котором используются медленные запросы к веб-серверу и называется он Slow HTTP DoS Attacks, которую еще называют Slowloris. 

Суть в том, что делаются медленные запросы к сереверу, который постепенно принимает куски запроса и при этом некоторое время не закрывает соединение с клиентом. В поведении сервера это выглядит приблизительно так: в процессах висят процессы Apache, netstats показывает пачки установленных (ESTABLISHED) соединений с сервером по 80 порту и когда забивается пулл соединений веб-сервера новые запросы, даже вполне корректные, становятся в очередь и ждут пока обработаются уже установленные медленные соединения. Таким образом с сервером ничего особенного не происходит (нагрузки не наблюдается, канал не нагружается) и веб-сервер послушно ждет пока клиент полностью сделает свой запрос чтобы ответить. Также веб-сервер ничего не пишет в логи. На сколько я понимаю, то в лог пишется запись по факту отрвета сервера, а поскольку сервер все принимает запрос и ничего не отвечает, то он ничего и не пишет в лог.

Данное решение писалось когда нужно было быстро отсечь эти подключения без особого вникания в суть. Причина была разобрана уже позже в спокойной обстановке и анализе ситуации.

Был написан вот такой скрипт, который делает следующее:

  1. Анализирует выдачу netstat, считает количество установленных подключений от одного IP
  2. Убивает все процессы апача, которые связанны с этими соединениями, если количество этих подлючений больше, чем указанный предел
  3. Добавляет REJECT в iptables на этот IP
#!/bin/bash
 
LIMIT=20
LOG_FILE=/root/bin/ddos.log
 
IPS=`netstat -n | grep ESTABLISHED | grep -P ':80\b' | awk '{ print $5; }' | grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sort | uniq -c | awk -v limit=$LIMIT '$1 > limit{print $2}'`
 
for IP in $IPS; do
	PIDS=`netstat -np | grep $IP | awk '{ print $7; }' | grep -v - | cut -d/ -f1`
	for PID in $PIDS; do
		kill -9 $PID
	done
 
	/sbin/iptables -I INPUT -s $IP -j REJECT
 
	echo `date "+%Y-%m-%d_%T"`" Banned: "$IP >> $LOG_FILE
done

Ссылки на тему:

  1. Slowloris HTTP DoS
  2. How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server
Автор записи Мастер топоров

Календарь

Июль 2017
Пн Вт Ср Чт Пт Сб Вс
« Апр    
 12
3456789
10111213141516
17181920212223
24252627282930
31  
DeadLock