DDoS-атака на Хабрахабр: post-mortem

:

26 июля к нам обратился Pas с пренеприятнейшим известием: Хабр снова атакуют. Мы, естественно, посоветовали переключаться на нас.

Пока обновлялся DNS, сделали первичную blackbox-оценку поля боя:

ximaera@endeavour:14#487:~$ nc habrahabr.ru 80 <<EOF
> GET / HTTP/1.1
> Host: habrahabr.ru
>
> EOF
^C

real 0m19.020s
user 0m0.000s
sys 0m0.024s
ximaera@endeavour:14#488:~$ ping habrahabr.ru
64 bytes from ***: icmp_req=1 ttl=54 time=53.5 ms
64 bytes from ***: icmp_req=2 ttl=54 time=53.1 ms
64 bytes from ***: icmp_req=3 ttl=54 time=53.1 ms
^C
--- *** ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 53.126/53.300/53.598/0.340 ms
ximaera@endeavour:14#489:~$

Итак, сервер отвечает за приемлемое время, но соединение не устанавливается. По всей видимости, атака идёт на протокол TCP или уровень приложения. После недавней 50-гигабитной атаки у нас появился карантин для трудных клиентов, но в данном случае его решили не задействовать — трафика, вероятно, идёт мизерное количество.

В полвосьмого вечера таки переключился DNS.

image

На этом графике изображен песец. В случае работоспособного Web-ресурса объём исходящего трафика превышает объём входящего на порядок. Если они отличаются на несколько десятков процентов — беда.

В последний раз Хабр стоял у нас под защитой, хм, давно. Накопленной истории поведения легитимных пользователей фактически нет, приходится контролировать фильтры вручную. Вначале включаем грубый анализ автомата TCP-соединений.

image

Выясняется, что атакуют большим рейтом соединений и запросами, вылетающими по таймауту. Connection tracking, само собой, полетел к чёрту, базе тоже было плохо. Боты блокируются в больших количествах.

image

Хабрасервер начинает быть скорее жив, чем мёртв. Но мусорные запросы есть, это видно.

image

Пока суд да дело, накопилась критическая масса в классификаторе. Запускаем анализ переходов. Тут же в «красную зону» вылетает туча IP-адресов, выполняющих вот такие запросы:

178.120.56.144 - - [26/Jul/2011:20:00:59 +0400] "GET /search/?q=intel HTTP/1.0" 200 14443 "http://www.live.com/" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0)" [habrahabr.ru]
85.173.219.240 - - [26/Jul/2011:20:00:59 +0400] "GET /search/?q=intel HTTP/1.0" 200 14443 "http://www.alexa.com/" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0)" [habrahabr.ru]
178.94.52.22 - - [26/Jul/2011:20:00:59 +0400] "GET /search/?q=intel HTTP/1.0" 200 14443 "http://www.google.com/" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1)" [habrahabr.ru]
46.36.130.136 - - [26/Jul/2011:20:00:59 +0400] "GET /search/?q=intel HTTP/1.0" 200 14443 "http://www.live.com/" "Opera/7.51 (Windows NT 5.2; U) [en]" [habrahabr.ru]
46.7.52.14 - - [26/Jul/2011:20:00:59 +0400] "GET /search/?q=intel HTTP/1.0" 200 14443 "http://www.live.com/" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2)" [habrahabr.ru]

Запрос всегда один и тот же: GET /search?q=intel. Реферреры разные: Google, Ask.com и прочие поисковики. Авторы этих нелегитимных запросов блокируются.

Не переживайте: если даже вы в это время пришли из гугла на поисковую страницу Хабра с запросом «intel», вряд ли вас тут же забанило. Расчёт легитимности пользователя делается на основе множества запросов.

image

Обратите внимание: как только был отфильтрован паразитный трафик, сразу же немного вырос трафик, генерируемый легитимными пользователями (ещё бы, сайт заработал) и моментально очнулся исходящий трафик. В течение часа после включения защиты «с нуля» сайт пришёл в полностью работоспособное состояние.

We surviveled HTTP QRATOR 503!

image

В этот момент атака в принципе прекратилась. Нет смысла держать паразитный трафик на сайте, который работает вопреки, лучше заработать ещё на ком-нибудь.

Оценим мощность атаки. В наличии следующие поражающие компоненты:
— количество соединений;
— количество запросов к базе.

Соответственно, объёмы входящего трафика или число атакующих IP-адресов оценивать бессмысленно, главное — количество открытых соединений в единицу времени. На пике атаки делалось около 9000 запросов/с, что, фактически, и является мощностью атаки. Каждый запрос выполнялся в отдельном TCP-соединении. Заметим, что умолчальное линуксовое значение CONNTRACK_MAX (в предположении, что на сервере более 1 Гб оперативной памяти), таким образом, исчерпывалось бы спустя 7,29 с атаки; плюс нагрузка на базу.

Беда, как известно, не приходит одна; во всяком случае, не в этой сфере. В 0:20 атакующие пришли вновь, причём объём ботнета был несколько больше, чем в 19:30. Но к этому мы уже были готовы, и атака отрулилась автоматически. Рецидив атаки — вещь весьма распространённая, порой организаторы специально мониторят поведение сайта и активируют ботнет, как только его участников начинает «отпускать». Здесь было проще, повторная атака прекратилась, как и первая, сразу же, как только все боты были заблокированы.

EDIT 14:52 Буквально только что с минимальными потерями завершилась третья волна атаки. Около 4500 атакующих ботов, 4000 запросов в пике. Заражённые машины теперь интересуются не только Интелом, но ещё Apple и Google. Мы продолжаем следить за развитием событий.