Pull to refresh

Теория и практика борьбы с DDoS атаками

image Привет, хабраписатели и хабрачитатели! Я работаю в компании, занимающейся решением задач масштабирования вычислительных систем, а так же написанием новых, а в качестве социальной деятельности веду ряд мелких некоммерческих проектов. Недавно мне впервые удалось побороться с живой DDoS атакой и я рад поделиться с вами полученным опытом.

Мы обсудим способы борьбы с DDoS атаками на небольшие сайты и рассмотрим мой частный случай.


Введение


Начнем с того, что поразмышляем о том, откуда берутся эти DDoS атаки. В принципе, основных источников — три: интернет-хулиганьё, вымогатели и конкуренты — недоброжелатели.

С интернет-хулиганьём все относительно просто: шансов попасть под раздачу не так уж и много. А если вы под нее попали — атака будет недолгой. Травить вас неделями вряд ли кому вздумается.

С вымогателями дело может обстоять сложнее, однако если вымогатели нашли вас, значит у вас, по их мнению, есть что взять. Тут уже каждый решает для себя, что выгоднее: дать денег жуликам, дать денег компании-производителю анти-DDoS решений или иметь хороших специалистов, которые уже собаку съели на борьбе с DDoS атаками. Однако если вы не являетесь владельцем популярного онлайн-казино, и час простоя не измеряется десятками тысяч баксов упущенной прибыли, вряд ли вы будете интересны жуликам.

А вот с конкурентами-недоброжелателями бороться и сложно и интересно. Во-первых нарваться на такую атаку очень просто. Ваш интернет-магазин находится в поисковике выше конкурирующего магазина? Этого вполне хватит. Уверен, что любой владелец коммерческого проекта может навскидку назвать 10 причин, почему кто-то может захотеть, чтобы его сайт покинул интернет-эфир.

Как это происходит


Разумеется, для совершения DDoS атаки нужен ботнет (с атаками хомячков с популярных ресурсов мы расстались во введении). А контроль над ботнетами имеют далеко не все желающие напакостить. Можно даже сказать, что как правило, никто из недоброжелателей не в состоянии организовать DDoS атаку. Но этого и не нужно. Ведь всегда можно заглянуть в старый почтовый ящик и выудить в нем пару десятков предложений убрать сайт конкурента. Да поиском эти предложения замечательно ищутся.

Стоит это относительно недорого, а сайт, работающий без поддержки, валится на ура.

Как с этим бороться


В первую очередь, атаку надо заметить. Если вы заметили атаку по сократившемуся числу звонков в офис, или числу электронных писем в ящике, значит с мониторингом у вас что-то не так. Чем раньше вы узнаете об атаке, тем раньше вы ее подавите и тем меньше клиентов потеряете. При разработке сайта закладывайте хотя бы простейший мониторинг. Причем желательно не встроенный в сайт, а отдельный, который можно запустить на домашнем компьютере, или на компьютере в офисе. Достаточно просто раз в час замерять время отдачи главной страницы сайта. Время увеличилось с нескольких секунд до нескольких десятков — стоит посмотреть, что случилось: дома интернет лагает или сайт лег.

Итак, вы получили сигнал тревоги и убедились, что сайт, действительно, перегружен. Тут можно пользоваться чем угодно: панелью управления хостингом, инструментами операционки и т.д. В первую очередь, свяжитесь со своим хостером. Многие хостеры штрафуют своих клиентов за превышение нагрузки на сеть/процессор, но часто достаточно заказать относительно недорогую услугу для избежания более серьезных трат.

Ну а теперь можно заняться отражением атаки.

Учитывая то, что сети хостеров, как правило, защищены от DDoS-ов низкого уровня, такого как 64-килобайтные пинги и прочая ерунда, убивать ваш сайт с высокой степерью вероятности будут по HTTP, имитируя небывалую популярность вашего ресурса.

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

В первую очередь стоит попробовать в действии ваш firewall. Конкретные зоны IP-адресов закреплены за конкретными странами. Поэтому если ваши заказчики из России, а DDoS-ят вас с китайского ботнета, в качестве экстренной меры вполне подойдет отрезание зон Китая на firewall-е. А можно, наоборот, оставить только те страны, где живут ваши потенциальные клиенты — вам виднее. Как определить откуда DDoS-ят? Включите временно логирование запросов и посмотрите откуда к вам лезут. В принципе, netstat -a -n тоже подойдет. Если ваш сайт поднялся, дальше можно не бороться. Когда атака прекратится — разбаните этот Китай.

Если firewall не помог навскидку, стреляйте прицельно. Возьмите лог запросов за пару минут и выберите из него уникальные IP адреса. Если ботнет небольшой, его будет отлично видно, и тогда можно будет забанить ноды ботнета персонально.

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

Что же делать? Если дергают не главную страницу сайта, просто подвиньте страницы вашего сайта и сделайте страницу 404 с редиректом на главную страницу сайта. Вы потеряете часть посетителей из поисковиков, но отдавать большие страницы с каталогом товаров из базы всем подряд вы все равно вряд ли сможете так просто (хотя, если памяти хватает, ваша CMS умеет возвращать 304/Not Modified не ныряя в базу, можно поставить перед вашим веб-проектом тот же сквид. Этим, кстати, стоит заняться уже сейчас если у вас есть пара сотен свободных мегабайт памяти. Эта мера и нагрузку снизит на базу, и рейтинг в поисковиках поднимет за счет более быстрой отдачи, и посетители будут охотнее листать ваш каталог).

Если дергают главную страницу — нужно настоящих пользователей перенаправить на новый URL главной страницы, причем так, чтобы боты не поняли. Как это не смешно, лично мне помог простой редирект 301/Moved Permanently на новый адрес главной страницы. Отсылка этих редиректов почти ничего не стоит, если у вас сайт не написан пьяным гиком на питоне и на каждом запросе не запускается интерпретатор питона. В моем случае нагрузка на процессор от ботнета упала до 4% и сайт заработал, как будто никакой атаки нет.

Если ботнет окажется достаточно умным, чтобы понимать 301/Moved Permanently — возможностей еще полно: можно использовать http-equiv=«refresh» или редирект посредством JavaScript. В крайнем случае, можно возвращать страницу с ссылочкой.

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

Ну и самое главное: когда атака закончится, не забудьте вернуть все назад :)

Как это было у меня


Ну и напоследок приведу свой случай с цифрами:
  • Проект — некоммерческий, на виртуальном хосте VDS за 8.95 баксов в месяц: Shared CPU, 256MB RAM, 500GB traffic.
  • Операционка — CentOS 5.5
  • Сайт на Java (Apache Tomcat + Apache httpd для статики + MySql).
  • По крону регулярно проверялось наличие процессов в памяти, и в случае отсутствия они перезапускались.
  • Бомбили сайт запросами GET / со скоростью 80-100 запросов в секунду.

В результате атаки httpd начал жрать много памяти и много файловых дескрипторов, что привело к выпаданию его самого и томката. Время открытия сайта увеличилось до минуты, кроме того посетители периодически получали Connection Refused.

После того, как httpd был откручен и выкинут, остался один томкат. Сайт стал стабилен, но время ответа все еще было очень большим. После прикручивания к томкату native-libs (его же родного ускорителя), томкат стал выпадать с Segmentation Fault. Лучшее — враг хорошего.

После анализа айпишников атаковавших, стало понятно, что отсеять их firewall-ом не получится.

Покрутив конфиги сайта, установил редирект с главной страницы сайта на /index. Ботнет этот редирект преодолеть не смог, а для томката отправлять 100 редиректов в секунду — не особо затратно. С редиректом нагрузка упала со 100% до жалких 4%.

Подключение услуги «безлимитный трафик» стоило 1 доллар за месяц (ширина канала ограничена до 5Mbit/s).

Через несколько дней атака иссякла.

Надеюсь, этот пост поможет кому-нибудь, потому что мне пришлось думать головой, как бороться с атакой вместо того, чтобы раздавить ее за 20 минут. Всем успехов!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.