Быстрая обработка при DoS-атаке

Роберт

Аналитик
Быстрая обработка при DoS-атаке

Пару недель назад на один из моих проектиков была проведена DoS-атака (более 200 заходов в секунду с различных адресов). Вначале мой сервер загнулся от такой нагрузки , но уже через час подправив код и настройки сервера удалось привести его в состояние что он без особой проблемы стал выдерживать такую нагрузку и уже две недели работает под атакой (впрочем уже атакой и не назвать - так как через неделю количество заходов сократилось до 50 в секунду , а сейчас их всего около 5 в секунду).

По этому задумался о том что бы сделать свой небольшой универсальный модуль который бы стоял в самом начале загрузки страницы на проектах и смотрел - если пользователь зашёл больше 5 раз в секунду или более 30 раз за пол минуты - то он блокируется на 1 час. Всё вроде просто. Алгоритм простенький - где-то хранятся все IP-адреса зашедшие за последнюю минуту. Если адрес не заходил больше минуты - он выкидывается. Если превысил одно из ограничений - блокируется. Вопрос только в чём более удобно хранить список при нагрузке более 200 заходов в секунду?

У меня пока два варианта:
1) в простом текстовом файле
2) в HEAP таблице на MySQL (поскольку эта таблица хранится в виртуальной памяти)
В общем-то выбрать по какому пути идти , легко - проверив что происходит быстрей: обращение к дисковому файлу или установление соединения с базой MySQL?
Хотя есть и третий , как мне кажется - самый быстрый вариант: создать виртуальный диск из оперативной памяти , и работать с файлом на нём (помнится это ещё в DOS'е можно было сделать через ramdrive.sys). Однако тут появляется ряд неудобств: создаётся диск только при старте операционки (ну или сторонними программками) , потом перед глазами будет мешаться отдельный пустой диск на несколько десятков килобайт , короче не совсем универсально...

А может у кого есть другая идея не использующая сторонние разработки?
Может PHP уже может сам держать файлы в области виртуальной памяти? (в чём я сомневаюсь)
 

Вурдалак

Продвинутый новичок
Роберт
Обычно это делается на уровне сервера / прокси-сервера, модули где-то такие встречал (для Apache, например). Но это всё не поможет, если атака «качественная», в которой с одного и того же IP-адреса запрос выполняется раз в несколько секунд.
 

vovanium

Новичок
Если нормальная атака то всё это до лампочки, спасают только специальные сервисы у крупных хостеров (у которых свои тех. площадки), где специальное железо фильтрует аномальный трафик...

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

Доктор

Новичок
Вначале мой сервер загнулся от такой нагрузки , но уже через час подправив код и настройки сервера удалось привести его в состояние что он без особой проблемы стал выдерживать такую нагрузку и уже две недели работает под атакой
Независимо от рассказов, как делать правильно, было бы интересно послушать, что конкретно сделал лично ты в твоей ситуации. Потому как мне кажется, что 200 запросов в секунду - достаточно много и даже с таким числом справиться - уже хорошо. Найти решение проблемы в течение часа - тоже неплохо. Что помогло в конкретно твоей ситуации?
 

Роберт

Аналитик
Доктор
В моём случае всё было не так страшно как описывал vovanium. DoS-атака шла на один адрес "domen.ru" (обычно на него приходится около 80% трафика , и только в 20% пользователи набирают www). Я разделил эти два домена на разные виртуальные сервера в апаче (но они по прежнему ссылались на один каталог , хотя логи уже вёл отдельно). В настройках виртального сервера "domen.ru" я вписал строку "DirectoryIndex index.htm" (тем самым атакующие уже не задействовали PHP) в то время как те кто заходили через www или по ссылкам с других сайтов - попадали туда же куда попали бы и прежде. А в самом файле index.htm я написал:
Код:
<script>window.location='http://www.domen.ru/index.php'</script>
Ататкующие модули совершенно не читали что я им возвращал (может конечно и читал , но не обрабатывал скрипты) , а реальные пользователи переадресовывались на рабочий сайт и проблем не испытывали.
Вот и всё.

Если вдруг кто-то спросит - "Зачем разделял на два виртуальных сервера?" , то просто вначале побоялся что атакующая нагрузка не даст нормально работать пользователям моего сервера (примерно то что описал vovanium) , и по началу в DNS я развёл на разные сервера тех кто шёл на "domen.ru" и "*.domen.ru". Однако более мощный сервер с nginx показывал такую же нагрузку как и мой , и я вернул оба домена на одну машину (остатвив только разные файлы для логов и разные стартовые файлы index).
 

MiksIr

miksir@home:~$
Самое оптимальное тут - анализ логов раз в минуту/несколько, нахождение адресов, с которых слишком много запросов в секунду по одному URL (типичный патерн для дешевой атаки) и добавление в фаирвол этих адресов.
 

iceman

говнокодер
weregod
поисковику задать www.domen.ru (яндекс автоматом www дописывает...)
 

Роберт

Аналитик
weregod
Если честно сказать - я не задумывался куда попадали поисковые боты. С одной стороны - в тот момент я больше думал о том чтобы сайт работал. А с другой стороны я почему-то был всегда уверен что поисковики читают и обробатывают скрипты чтобы узнать куда дальше идти по сайту. Или я не прав? Если нет - то можно их по HTTP_USER_AGENT отфильтровывать ещё в апачи и подправлять для него адрес на работающий сайт.

MiksIr
Ты говоришь об анализе логов раз в минуту , но ведь сервер ложится за несколько секунд под такой атакой.
А чем плох мой метод - когда ты обнаруживаешь атакующий IP уже в течении нескольких секунд , и передаёшь его томуже фаирволу?
Кстати за день размер лог-файла превышал 500Мб , так что его анализ уже должен был бы входить в обязанности сторонней программы написанной не на РНР.

Кстати говоря , это подводит к новой мысли - наверняка должны существовать фаирволы (или плагины к ним) способные читать логи апача и самостоятельно блокировать тех кто создаёт нагрузку по одному URL. (конечно фаирвол может в режиме снифера самостоятельно читать и запросы которые делает клиент по портам 80 и 443 , но наверно на это будет уходить гораздо больше ресурсов чем даже раз в секунду читать изменения в лог-файле)
 

Ramzes

Новичок
Автор оригинала: Роберт
я почему-то был всегда уверен что поисковики читают и обробатывают скрипты чтобы узнать куда дальше идти по сайту. Или я не прав?
иногда поисковик может посылать запрос методом head, т.е. что-то типа пинга, живой ты или нет )
 

baev

‹°°¬•
Команда форума
Если нет - то можно их по HTTP_USER_AGENT отфильтровывать ещё в апачи и подправлять для него адрес на работающий сайт.
— в курсе, что такое «клоакинг»?
 

MiksIr

miksir@home:~$
Роберт
Сервер не должен ложится от атаки на скрипты. Если сам сервер ложится - уже ничего не сделаешь. Обычно первой помирает база или, если нормально настраивалась - просто дает отлупы по превышению коннектов. Потом пул скриптов и уже веб сервер дает отлупы по таймауту ибо все процессы заняты. Пихая "защиту" в скрипты ты во-первых озадачиваешь их ненужной работой заставляя что-то где-то хранить еще, во-вторых нет гарантии что коннект дойдет туда - может отвалится по таймауту и в-третьих, заставаляет не забывать добавлять эту "защиту" вот все скрипты включая готовые решения (а значит проблемы с обновлением версий и т.д. и т.п.).
Скриптик, который читает лог с последней запомненной позиции и запоминает последнее прочитанное - десяток строчек на любом языке. Храним последнюю позицию (смешение в байтах) и последнюю строчку, при новом запуске начинаем читать с этой позиции, проверяем эту последнюю строчку - если она не совподает с тем, что в файле - значит файл уже другой (ротировался, например), читаем с нуля. Раз в минуту вполне достаточно, но можно и чаще или реже - в принципе не проблема. Работает одинакого хорошо как для любых скриптов, так и для статических файлов, если кто-то решил канал забить скачивая найденное видео в 100500 потоков =)
 

Роберт

Аналитик
Ramzes
И что , мой сервер не отвечал на запрос head? Или что ты хотел сказать своим комментарием?


baev
Ты мне хочешь рассказать что такое «клоакинг» при DoS-атаках? Или описать модель идеальной DoS-атаки? Ты не знаешь диапазон IP-адресов с которых к тебе на сайт ходят поисковые роботы Яндекса и Гугла чтобы разрешить им беспрепятсвенную работу на те пару недель пока сплывает волна атаки? В моём случае , за две недели , ни один атакующий компьютер не прикинулся Googlebot'ом. Или ты что-то не понял в ответе на вопрос weregod'a - куда попадали в моём случае поисковые боты?


MiksIr
Анализ лога даёт только одно преимущество - я увижу им и такую атаку которая вообще на затрагивает .php файлов (типа атакующий компьютер один раз за сутки зашёл на главную страницу , прочитал ссылки скажем на видео , и дальше начал их качать по многу раз) , но это опять же отступление к филосовскому вопросу о защите от идеальной DoS-атаки... Ну начнут у тебя 20 000 комьютеров раз в минуту загружать по одному разному .jpg файлу - так же повесят канал.
Зато теряем в универсальности - далеко не везде поставишь описанную тобой защиту (хостеры не дадут) , хотя в моём случае у меня собственные машины стоят на разных хостовых площадках и мне гораздо проще писать не на РНР с которым работаю редко.
 

Вурдалак

Продвинутый новичок
Автор оригинала: Роберт
Ты не знаешь диапазон IP-адресов с которых к тебе на сайт ходят поисковые роботы Яндекса и Гугла чтобы разрешить им беспрепятсвенную работу на те пару недель пока сплывает волна атаки?
— конечно же нет.
 

MiksIr

miksir@home:~$
Анализ логов даетгораздо больше преимуществ, нужно только глаза открыть. И в первую очередь это отсуствие нагрузки на скрипты, за которые вас любой нормальный хостинг мгновенно отключит.
 

baev

‹°°¬•
Команда форума
Роберт, Вы явно не понимаете, что поисковой системе глубоко плевать на причины, побудившие Вас прибегнуть к клоакингу.
(Либо Вы на самом деле не в курсе, что такое «клоакинг»…)
 

weregod

unserializer
Автор оригинала: Роберт
weregod
Если честно сказать - я не задумывался куда попадали поисковые боты. С одной стороны - в тот момент я больше думал о том чтобы сайт работал. А с другой стороны я почему-то был всегда уверен что поисковики читают и обробатывают скрипты чтобы узнать куда дальше идти по сайту. Или я не прав?
исполнение клиентских JS ни в коем случае не задача обычного поискового бота
 

Роберт

Аналитик
MiksIr
За что меня отключит любой нормальный хостинг? За то что в начале index.php я буду следить - не заходил ли этот IP-адрес в течении последних 30 секунд? Это не загрузит процессор даже на пол процента. А вот внешнюю программу для анализа логов ты мало на каком хостинге договоришься чтобы поставили...

baev
Я подставил поисковику нереальную информацию? Гугл и Яндекс не обробатывет страницы обработанные через mod_rewrite? Ты тему прочёл или тебе хочется блесснуть перед другими тем что ты недавно прочитал про «клоакинг»? По моему ясно сказано что любой зашедший по конкретной ссылке получает реальную информацию , и лишь для ссылки на "domen.ru/" обычный смертный получит скрипт перенаправления на index.php , а поисковик сразу получит index.php

weregod
Может это и не задача обычного поискового бота. Но может в этом и ответ почему россияне пользуются Яндексом и Гуглом , а не используют что-то типа search.ru и altavista.com (используют тех у кого хорошие боты , а не тех у кого обычные поисковые боты)

С другой стороны зайдя на адрес rutracker.org получаешь:
<meta http-equiv="Refresh" content="0;URL=forum/index.php">
Вопрос - Зачем?
 

HraKK

Мудак
Команда форума
Роберт
Расскажешь, как возвращал в индекс после клоакинга, ок? Хотя я не думаю что что-то будет, но вполне возможно. А почему бы не сделать кеширование в html главной ?
 
Сверху