Технический директор сайта «Медуза» Самат Галимов рассказывает, что 29–31-го марта на сайт была DDoS-атака, и почему этого почти никто не заметил.
Когда читатель запрашивает страницу с сайта meduza.io или открывает наши приложения — на серверы Медузы приходит несколько HTTPS запросов. Сам текст страницы, шрифты что мы на ней используем, картинки или видео — все это запросы на серверы «Медузы». Сейчас мы используем около 30 таких Edge-серверов. Edge — от английского слова граница, граница нашей инфраструктуры, с которой общаются наши читатели. Большинство эджей находятся в Европе, небольшая часть — в России.
Обычно, CDN (сумма всех эджей) Медузы обрабатывает 2 тысячи HTTPS GET запросов в секунду (2K RPS). Когда мы посылаем важное пуш уведомление, бывает 10K RPS в течение пары секунд, не больше.
В 22:15 29-го марта к нам начали приходить примерно 10 тысяч HTTPS GET запросов в секунду. Никаких пушей мы не посылали. Массовые протесты против коррупции отгремели 3 дня назад, теракта в Питере еще не было. Издатель и технический директор «Медузы» были в этот момент в Брюсселе на конференции RightsCon — обсуждали свободу интернета в целом и DDoS-атаки на медиа в частности. Вдобавок к этому, системный инженер Медузы, ответственный за CDN, Дима Захаров, находился в отпуске — у него со дня на день должен был родиться третий ребенок.
***
Стоит сделать отступление и рассказать, что DDoS-атаки бывают разные по структуре и защищаются от них, в зависимости от вида атаки, по-разному. Самые простые атаки — на переполнение сетевого канала. Сетевые интерфейсы серверов, хостеров и даже интернет-провайдеров хостеров просто заливают мусорным трафиком. Крупнейшая атака такого рода на сайт журналиста Брайана Кребса достигала размера 600 Gbps, а хостер OVH недавно отчитался уже о терабитной атаке. Представьте себе, все 60 серий Игр престолов в высоком разрешении меньше, чем за полсекунды!
Медузу атаками такого рода валить смысла нет — мы хостимся у Online.net, это один из крупнейших французских операторов и он предоставляет защиту от простых сетевых атак бесплатно. Да и спрятаться за Cloudflare или Google Project Shield — невелика работа (но не будем забегать вперед).
Нас решили нагрузить (еще один термин мира высоких нагрузок и 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.
Нам повезло, что атакующие были невнимательны или не-профессиональны. У них был реальный шанс подсадить нас на деньги (если бы мы переключились в Cloudflare до включения в Project Galileo) или даже завалить «Медузу» (если бы мы решили не экспериментировать).
Это урок для всех русских медиа. Атака может прийти в любой момент и подготовиться лучше заранее.
Вот ссылки на Project Galileo от Cloudflare и Project Shield от Google. В Shield можно подать заявку просто на сайте. С Galileo процедура чуть сложнее — регистрируете в Cloudflare обычный аккаунт и после этого пишете в Access Now на адрес [email protected] с просьбой подтвердить ваше участие. Access Now, в свою очередь, найдет кого-то, кто готов за вас поручиться, что вы не порно-сайт и не онлайн-казино, а настоящее медиа. Оба проекта абсолютно бесплатны для участников. Но они все же, скорее, для крупных медиа, у которых есть системные инженеры, готовые заниматься настройкой и поддержкой систем.
Если у вас небольшой блог, но вы опасаетесь DDoS атаки или боитесь не выдержать внезапной популярности, как случилось с сайтом Дениса Карагодина, когда о нем написали федеральные СМИ — то обращайтесь в Deflect. Это проект по защите свободы слова, готовый оказать чуть больше технической поддержки, чем Cloudflare или Shield. И в нем, кстати, есть русскоговорящие сотрудники.
Если вы медиа и находитесь под DDoS-атакой и вам нужна помощь — можете написать нам на [email protected] и мы постараемся подсказать, к кому лучше обратиться.
Если вы знаете о дыре в безопасности Медузы — пишите на [email protected].