Anti DDoS. Атака по HTTP

Многие слышали, многие знают, а многие испытали на себе эту проблему.
DDoS — от англ. Distributed Denial of Service, распределённая атака типа «отказ в обслуживании».
На самом деле — всё гениальное просто и лучший способ избавиться от DDoS — это предотвратить атаку, путём проведения различных профилактических работ, в том числе и эмулируя её в малом объёме на свой ресурс перед его выходом в свет, чтобы найти слабые места в своей системе. Но если уже такое случилось, то некоторые меры по её предотвращению мы опишем здесь.

Прежде всего рекомендуем обратиться к открытым и достаточно авторитетным источникам информации, таким как Wikipedia, например и что мы можем там узнать? А это краткий перечень мер по предотвращению атаки:

  • Предотвращение. Профилактика причин, побуждающих тех или иных лиц организовывать DoS-атаки. Очень часто атаки являются следствиями личной обиды, политических, религиозных разногласий, провоцирующего поведения жертвы и т. п.
  • Фильтрация и блэкхолинг. Блокирование трафика исходящего от атакующих машин. Эффективность этих методов снижается по мере приближения к цели атаки и повышается по мере приближения к её источнику.
  • Устранение уязвимостей. Не работает против атак типа флуд, для которых «уязвимостью» является конечность тех или иных ресурсов.
  • Наращивание ресурсов.
  • Рассредоточение. Построение распределённых и продублированных систем, которые не прекратят обслуживать пользователей, даже если некоторые их элементы станут недоступны из-за атаки.
  • Уклонение. Увод непосредственной цели атаки (доменного имени или IP-адреса) подальше от других ресурсов, которые часто также подвергаются воздействию вместе с непосредственной целью.
  • Активные ответные меры. Воздействие на источники, организатора или центр управления атакой, как технического, так и организационно-правового характера.
  • Внедрение оборудования по отражению DoS-атак. Например DefensePro® (Radware), Arbor Peakflow® и других производителей.
  • Приобретение сервиса по защите от DoS-атак. Актуально в случае превышения флудом пропускной способности канала.

Ниже мы рассмотрим  достаточно простой способ фильтрации, который предусматривает объеденение «черных» IP в подсети и заблаговременное блокирование подсетей. Эффективность этого способа была проверена во время атаки на один крупный ресурс с трафиком более 7GBps при распределённой атаке в 800Mbps. Атака была полностью отражена в течении 36 часов (не быстро, но уверенно). Были обнаружены основные источники и заблокированы. Так же хочу заметить, что атака происходила по средствам HTTP запросов (что не есть тяжелой атакой) и програмный код был в полном порядке.

Итак, начнём. Прежде всего, Вам нужен отдельный сервер front-end, например NGINX, которй будет собирать статистику и перенаправлять отфильтрованный трафик на Ваш рабочий сервер. Все процедуры по защите нужно проводить на front-end, причем front-end зачастую должен быть гораздо мощнее чем back-end. Как минимум, это должен быть сервер с Quad core CPU. На front-end создаём bash-скрипт, например antiddos.sh и добавляем его в крон для запуска каждую минуту:

* * * * * /bin/sh /home/admin/antiddos.sh

Дальше, настраиваем access_log в nginx таким образом, что бы там были только IP адреса и запросы к вебсерверу — остальная информация для нас будет лишней. Для этого добавляем следующие записи nginx.conf:

log_format ddos '$remote_addr $request';

Соответственно настраиваем access_log c этими параметрами. Важно! Необходим отключить остальные логи, чтобы избежать дополнительной нагрузки на сервер, так как во время атаки  у Вас будет моментально рости количество записей в лог-файле.

access_log /var/log/nginx/ddos_access.log;

И наш скрипт antiddos.sh:


#!/bin/sh
BL="/root/blocklist" # сюда будем писать вражеские IP
LOG_F="/var/log/nginx/ddos_access.log" # путь к логам
LOG_TMP="/root/access.log" #копия для анализа
WL="'127.0.0.1'" #список разрешенных IP
IPTABLES=/sbin/iptables
touch $BL
# определение вражеских IP по запросам GET
ips1=`cat $LOG_F | grep "GET" | egrep -v -e $WL | sort -n | uniq -c | sort -n | awk '{if ($1 > 10 ) print $2}'`
# определение вражеских IP по пустым запросам GET
ips2=`cat $LOG_F | grep '"-"' | egrep -v -e $WL | sort -n | uniq -c | sort -n | awk '{if ($1 > 1 ) print $2}'`
IPS=`echo $ips1 $ips2`
# лог файл больше не нужен и мы его очищаем, предварительно сделав копию
cp $LOG_F $LOG_TMP
echo " " > $LOG_F
# пишем вражеские IP
for i in $IPS; do
if [ `cat $BL|grep -c $i` -lt 1 ]; then
echo $i >> $BL
fi
done
$IPTABLES -F
/bin/sh /root/additional.sh # Дполнительные правила Firewall
# объединяем в /24 подсети
LIST1=`cat $BL | sort -n | cut -d '.' -f 1-3 | uniq -c | sort -n | awk '{if ($1 > 1 ) print $2}'`
# объединяем в /16 подсети
LIST2=`echo $LIST1 | tr ' ' '\n ' | sort -n | cut -d '.' -f 1-2 | uniq -c | sort -n | awk '{if ($1 > 1 ) print $2}'`
# блок /16 подсетей
for i in `echo $LIST2`; do
$IPTABLES -A INPUT -p ALL -s $i.0.0/16 -j DROP
done
EX=`echo $LIST2|tr ' ' '|'`; a="egrep -v -e '$EX'"
# блок /24 подсетей
for i in `echo $LIST1 | tr ' ' '\n' | $a`; do
$IPTABLES -A INPUT -p ALL -s $i.0/24 -j DROP
done
EX1=`echo $LIST1 | tr ' ' '|'`; EX2=`echo $LIST2 | tr ' ' '|'`
a1="egrep -v -e '$EX1'" ; a2="egrep -v -e '$EX2'"
# блок по 1 IP с учетом исключения уже объеденённых сетей
for i in `cat $BL | sort -n | $a1 | $a2 `; do
$IPTABLES -A INPUT -p ALL -s $i -j DROP
done

Вот так вот будет легче Вам и тяжелее врагам.

Хочу заметить и обратить Ваше внимание на то, что если у Вас появились вопросы, такого плана, как «Где находиться файл nginx.conf?» и т.д., то лучше обратитесь к профессионалам и не делайте хуже самому себе.

Буду рад ответить на Ваши вопросы.

 

One thought on “Anti DDoS. Атака по HTTP

  1. Нашел ошибку в скрипте и исправил.
    Пользуйтесь, дорогие читатели.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *