Защита стартапа от DDOS. Личный опыт и переживания

Давайте начнем с общих понятий. DOS — атака на вычислительную систему с целью довести ее до отказа. DDOS — распределенная DOS атака (более чем с одного хоста). Разновидностей DDOS существует довольно много, но речь пойдет о конкретной разновидности — UDP Flood. Я позиционирую данную статью как повествование истории, а не инструкцию по защите от любых нападений, поэтому с радостью выслушаю ваши комментарии и советы :)

Чем вам может повредить DDOS?

  • Недоступность ресурсов.

  • Урон вашей репутации.

  • Убытки и недополученный доход.

К сожалению здесь нельзя выиграть, но можно проиграть. Если вас атакуют, ваша задача — понести меньшие убытки, чем атакующий, и научиться пережидать DDOS атаки не получая ощутимого вреда.

Кто может устроить DDOS?

Любому пользователю интернета, доступны для покупки услуги ботнетов, которые по щелчку пальцев начнут засылать паразитный трафик на сервер жертвы. Называются эти услуги где прямо, а где завуалировано, например: стресс-тестирование, stresser. Стоимость услуг по «стресс тестированию IP-адреса» колеблется от 3000р в день до бесконечности, в зависимости от мощности атаки.

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

Завязка

Мы, с небольшой командой единомышленников, на протяжении двух лет разрабатывали онлайн игру. И вот в январе 2022 года мы подошли к точке релиза нашего проекта для пользователей.

Наша скромная архитектура устроена следующим образом. Все пользователи обитают на игровом сервере, который пользуется «услугами» Kubernetes и ряда серверов с архитектурой (LDAP / Mail / VPN / Samba)

64f56e656c585bca7e14ec8e518696b2.pngУже заметили подозрительный момент? =)

Один клиент не улыбается, он недоволен сервисом!

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

Первые опасности

На этом ребята не остановились, подключились к нашему дискорду и начали угрожать администрации DDOS атаками, выдвигая требования к разбану и публичному извинению администрации перед бедными нарушителями. Мы, вежливо, поблагодарили их за игру и проигнорировали угрозы.

Все началось поздно ночью: игроки начали жаловаться на проблемы с голосовым чатом и задержки в ответах сервера. По графикам сразу стала заметна аномалия по количеству входящего трафика.

63be98253eb1d29f011fec26a3dd5045.png

Мы начали оживлять в памяти команды для работы c iptables, анализировать входящие запросы, гуглить вспомогательную информацию по борьбе с атаками и писать в саппорт хостинга. За этим занятием атака и кончилась, злоумышленники видимо «проверяли» свои возможности. Атака в 800 Mb/s — довольно слабая, да и участие принимало около 30 ботов. Тем не менее, игнорировать это нельзя, атака повлияла на игровой процесс в отрицательную сторону.

Весь следующий день был потрачен на подготовку скриптов, которые бы помогли оперативно вычислить IP-адреса ботов и побанить их через iptables. Вооружившись всем необходимым, мы начали ждать… Но кое-кто внес неожиданные корректировки в наш безупречный план… Наш хостинг Digital Ocean.

Следующей ночью началась очередная атака

9c136ff55cd550d5b95309eb3652be8b.png

Как же я удивился, когда в первые 3 минуты атаки я потерял доступ к серверу, всех игроков отключило, наступил тотальный блэкаут. Сервер упал? Что произошло?

Черная дыра в цифровом океане

Черная дыра в цифровом океанеЧерная дыра в цифровом океане

Данное явление в Digital Ocean называется Blackhole.

Системы анализа трафика нашего хостера автоматически обнаружили DDOS атаку, и для того чтобы убрать паразитную нагрузку на гипервизор [[ВНИМАНИЕ]] отключили наш сервер от сети на 3 часа.

Продакшен сервер с онлайн игрой выключили из сети на 3 часа.

Я не могу описать свое состояние на тот момент, тот от кого я больше всего ждал поддержки, помог злоумышленнику совершить успешную атаку.

Забегая вперед, скажу, что никто не ответил ничего внятного на мои тикеты в саппорт хостинга, стандартные ответы что так и должно быть, мне не нужно переживать и сервер автоматически вернется в сеть через 3 часа и так далее. Естественно, как только сервер вернулся в сеть через 3 часа, злоумышленник вновь активировал DDOS и сервер провалился в blackhole снова.

Ночной переезд

Было принято срочное решение о смене хостинга. После анализа доступных вариантов и консультаций со знающими коллегами, был выбран хостинг OVH, который предоставляет услуги защиты от DDOS и даже игровой фаервол.

Схема Anti-DDOSСхема Anti-DDOS

В течение пары часов все необходимые ресурсы были перенесены на новый сервер (благо мы подозревали что может случиться беда и все скрипты и инструкции были в актуальном состоянии). Фаерволы настроены, компенсация для игроков заряжена, анонс в дискорд канале сделан, запуск!

69b9046e925579e438f72511e90787f8.png

Моментально срабатывает защита от DDOS от OVH, начинается фильтрация трафика, мне приходит письмо с нотификацией о том что сервер заботливо перемещен в защищенную инфраструктуру. И что же, запуская анализ трафика я вижу как боты появляются и тут же пропадают, сервер не испытывает никакой нагрузки, происходит спокойное пережидание, наступает облегчение, проблемы позади?

0eb1fca1f6855f3141280955eda3a3cb.png

Куда там! Злоумышленники решили подлить денег в печку и сменить стратегию. Атаки с нескольких хостов крупными пакетами сменились на атаки поочередно с двух ботнетов по 5 000 хостов смешанными пакетами (крупными и мелкими).

a46ab575e9f8b263732ae277037e37be.png

Фильтр OVH начал пропускать все больше и больше ботов до сервера, но тут мы решили применить уже подготовленные ранее скрипты. Фаервол iptables начал с безумной скоростью наполняться тысячами правил с блокировкой IP-адресов ботов. CPU на сервере подпрыгнуло до заоблачных высот, игроки начали испытывать проблемы, не могли нормально общаться, снова появились задержки. Почему-же? Что снова не так?

Оказалось — я сам выстрелил себе в ногу. Тысячи DROP правил пробудили процесс ksoftirqd и он забил всё свободное CPU и начал мешать игровому серверу. Оказывается нельзя много правил держать в iptables!

iptables -I INPUT -s 1.2.3.4 -j DROP 
(никогда так не делайте если IP-адресов много)

ksoftirqd ksoftirqd

Данная проблема была решена с помощью утилиты ipset, которая специально и нужна, чтобы кормить тонны IP-адресов фаерволу в одно правило.

После переконфигурации, сервер вздохнул полной грудью. Проблемы наконец-то были решены. Игроки перестали замечать периодические DDOS атаки, а злоумышленники, поняв что все стало бесполезно, и вовсе их прекратили.

Так и стали мы жить-поживать. Наибольшую часть атаки фильтрует хостер, а с остатками разбираемся мы сами, в автоматизированном режиме.

Заключение

Хочу поделиться с вами теми выводами, которые я сделал по результатам этого приключения.

  • Во-первых, как бы странно это не звучало, большое спасибо злоумышленникам, за то что заставили нас столкнуться с проблемой DDOS атак на раннем этапе нашего проекта. Мы перестали переживать на этот счет и получили порцию нового опыта.

  • Если ваш стартап растет в конкурентной среде, позаботьтесь о правильном хостинге для своих ресурсов, даже такие гиганты как Digital Ocean могут слиться в самый неподходящий момент.

  • Скорее всего первая DDOS атака для вас будет неожиданной и достигнет цели. Когда сервер проседает по ресурсам, вы попросту можете потерять доступ по SSH и сделать ничего не сможете.

  • Если вас атакуют по доменному имени (боты резолвят IP-адрес), вы можете схитрить и подменить A-запись на другой IP-адрес, что временно (пока злоумышленник не заметит) может увести атаку в другую сторону :))

И небольшой рецепт, который сработал в моем случае:

  • Определите список всех IP-адресов, подключенных к атакуемому порту

  • Уберите из этого списка легальных клиентов (если это возможно)

  • ipset -N DDOS0201 iphash

  • xargs < bad-addresses.txt -n 1 ipset -A DDOS0201

  • iptables -A INPUT -m set --match-set DDOS0201 dst -j DROP

Всем спасибо за внимание!

© Habrahabr.ru