На нас напали!

Samat Galimov
Apr 14, 2017 · 7 min read

29–31-го марта на «Медузу» была DDoS-атака, но вы ничего не заметили (почти)

Когда читатель запрашивает страницу с сайта meduza.io или открывает наши приложения — на серверы Медузы приходит несколько HTTPS запросов. Сам текст страницы, шрифты что мы на ней используем, картинки или видео — все это запросы на серверы «Медузы». Сейчас мы используем около 30 таких Edge-серверов. Edge — от английского слова граница, граница нашей инфраструктуры, с которой общаются наши читатели. Большинство эджей находятся в Европе, небольшая часть — в России.

Обычно, CDN (сумма всех эджей) Медузы обрабатывает 2 тысячи HTTPS GET запросов в секунду (2K RPS). Когда мы посылаем важное пуш уведомление, бывает 10K RPS в течение пары секунд, не больше.

Слева — обычная ситуация, справа начинаются непонятные пики и стабильная нагрузка в 10K RPS

В 22:15 29-го марта к нам начали приходить примерно 10 тысяч HTTPS GET запросов в секунду. Никаких пушей мы не посылали. Массовые протесты против коррупции отгремели 3 дня назад, теракта в Питере еще не было. Издатель и технический директор «Медузы» были в этот момент в Брюсселе на конференции RightsConобсуждали свободу интернета в целом и DDoS-атаки на медиа в частности. Вдобавок к этому, системный инженер Медузы, ответственный за CDN, Дима Захаров, находился в отпуске — у него со дня на день должен был родиться третий ребенок.

***

Стоит сделать отступление и рассказать, что DDoS-атаки бывают разные по структуре и защищаются от них, в зависимости от вида атаки, по-разному. Самые простые атаки — на переполнение сетевого канала. Сетевые интерфейсы серверов, хостеров и даже интернет-провайдеров хостеров просто заливают мусорным трафиком. Крупнейшая атака такого рода на сайт журналиста Брайана Кребса достигала размера 600 Gbps, а хостер OVH недавно отчитался уже о терабитной атаке. Представьте себе, все 60 серий Игр престолов в высоком разрешении меньше, чем за полсекунды!

Медузу атаками такого рода валить смысла нет — мы хостимся у Online.net, это один из крупнейших французских операторов и он предоставляет защиту от простых сетевых атак бесплатно. Да и спрятаться за Cloudflare или Google Project Shield — невелика работа (но не будем забегать вперед).

Модель OSI (англ.) — обязательная тема первого курса всех приличных факультетов компьютерных наук

Нас решили нагрузить (еще один термин мира высоких нагрузок и DDoS-атак) L7 HTTP-GET-атакой. Интернет-протоколы, по которым общаются компьютеры, можно представить как слоеный пирог. Каждый следующий слой держится на нижних. Атака на переполнение канала задевает слой доставки сообщений, компьютеры теряют возможность общаться друг с другом, и поэтому сайт перестает открываться. Если бы речь шла о переговорах двух людей, то атака L3-4 — это включить громкий писк в динамиках. Логическим уровнем выше стоят протоколы HTTP(s) — это язык, на котором общаются компьютеры. В аналогии разговора — это начать говорить бессмысленные фразы, отвлекая участников. Ну а самый верхний логический уровень — сказать фразу, которая выведет собеседников из равновесия — атака на уровне приложений, L7.

Классический прием — забомбить бессмысленными запросами поиск на сайте. Дело в том, что поиск — ресурсоемкая операция, так что легко выесть все вычислительные ресурсы сайта запрашивая много поисковых фраз. Перегрузить процессор и память, так что на обработку запросов нормальных страниц сил у серверов уже не хватит.

Эта атака работает хорошо, если поиском и выдачей обычных страниц занимаются одни и те же серверы. В случае «Медузы» это не так, у нас микросервисная архитектура, так что все, что могли сломать атакующие — это поиск, которым можно без особых последствий пожертвовать. Единственная проблема — это режим «по порядку», технически завязанный на поиск. В этом режиме все материалы «Медузы» выдаются автоматически по хронологии (в отличие от обычного режима, где все собирается вручную редакцией. А от режима по-порядку, в свою очередь, раньше зависели RSS-потоки и подготовка Facebook Instant Articles.

Ищут слабое место

Для защиты режима «по порядку» от атаки мы составили «белый список урлов поиска», по которому отдается режим «по порядку». По всем остальным запросам в поиск начали отдавать ошибку HTTP 403 доступ запрещен.

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

ОК, теперь держат 50K RPS

***

Итак, я в Брюсселе уже в отеле, все никак не лягу спать, а атакующие запускают нагрузку в 50K RPS. Это все еще не влияет на читателей, но нас в технической команде пугают пики в 300K RPS.

И вот в 0:15 они заряжают уже полноценную атаку:

Движемся к 150K RPS

Да, Медузу нельзя сломать целиком, перегрузив поиск. Но атака в таком объеме грузит уже не сервер поиска, как планировали злоумышленники, а edge-серверы. Они не успевают говорить “нет, у нас нет такой страницы”. Атакующие, тем временем, видимо, решают полвторого пойти поспать и снимают часть нагрузки, оставляя ее постепенно спадать до 21K RPS в 8 утра.

Ночью атакующие спят

Я просыпаюсь в 8 утра невыспавшийся, чтобы успеть на завтрак и доклады, но быстро понимаю, что конференцию я сегодня пропущу:

Доброе утро!

250K RPS становится новой нормой, мы добавляем еще 10 edge-тачек (серверов) и понимаем, что так дольше продолжаться не может. Где 300K RPS там и миллион; бороться экстенсивно своими ресурсами мы не хотим — а то это уже выйдет атака на опустошение банковского счета.

300к!

Мы подключили Google Project Shield. Это проект компании Google по бесплатной защите медиа в интернете от DDoS-атак, часть более крупного проекта по защите свободы слова в интернете. Но он нам не помог. Shield передавал все запросы атакующих на наши серверы. Около 13:30 нам в голову пришла безумная идея — может быть, Project Shield путается из-за ответов 403 ошибка доступа, которые мы отдаем на все поисковые запросы атакующих? Что, если отдавать им OK, пустой ответ? Shield’у это не помогло, но зато боты оказались ужасно тупыми — и это простое изменение нас спасло.

Во-первых, оказалось, что все боты запрашивали примерно одни и те же страницы поиска, меняя лишь порядковый номер страницы. Во-вторых, они уважали наши cache-headers, то есть указания о том, как долго они обязаны не перезапрашивать страницу заново, но использовать ту версию, что уже скачали. Как только мы выкатили изменение с HTTP 200 cache-max=5min, число запросов драматически упало. И в этот момент у Димы родилась дочка.

Победа!

Все эти дни я провел в переговорах с Google Project Shield и Cloudlfare Project Galileo. В результате, Google включил нашему аккаунту защиту от этого типа атак (она выключена по умолчанию из-за редкости), а Cloudflare (крупнейший мировой CDN) добавил нас в Project Galileo, что дает нам, как медиа-проекту, полную защиту от атак бесплатно.

***

Прошли уже две недели после этого инцидента. Мы успели хорошо протестировать работу наших систем с Cloudflare, подправили все шероховатости и готовы в течение 2 минут переключиться под их защиту. Если вдруг с Cloudflare что-то пойдет не так — перейдем в Project Shield.

Нам повезло, что атакующие были невнимательны или не-профессиональны. У них был реальный шанс завалить «Медузу».

Это урок для всех русских медиа. Атака может прийти в любой момент и подготовиться лучше заранее.

Вот ссылки на Project Galileo от Cloudflare и Project Shield от Google. В Shield можно подать заявку просто на сайте. С Galileo процедура чуть сложнее — регистрируете в Cloudflare обычный аккаунт и после этого пишете в Access Now на адрес help@accessnow.org с просьбой подтвердить ваше участие. Access Now, в свою очередь, найдет кого-то, кто готов за вас поручиться, что вы не порно-сайт и не онлайн-казино, а настоящее медиа. Оба проекта абсолютно бесплатны для участников. Но они все же, скорее, для крупных медиа, у которых есть системные инженеры, готовые заниматься настройкой и поддержкой систем.

Если у вас небольшой блог, но вы опасаетесь DDoS атаки или боитесь не выдержать внезапной популярности, как случилось с сайтом Дениса Карагодина, когда о нем написали федеральные СМИ — то обращайтесь в Deflect. Это проект по защите свободы слова, готовый оказать чуть больше технической поддержки, чем Cloudflare или Shield. И в нем, кстати, есть русскоговорящие сотрудники.

Если вы медиа и находитесь под DDoS-атакой и вам нужна помощь — можете написать нам на ddos@meduza.io и мы постараемся подсказать, к кому лучше обратиться.

Если вы знаете о дыре в безопасности Медузы — пишите на security@meduza.io.

meduza: how it works

Как работает meduza.io

Thanks to Meduza

    Samat Galimov

    Written by

    CTO at RAWG.io, ex-CTO at Meduza.io

    meduza: how it works

    Как работает meduza.io

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade