« Тест микрософтовской постилки | Пиарокопалка »
DDOS это есть Distributed Denial Of Service – “распределенный отказ в обслуживании”. Отказ в обслуживании это когда кто-то пришёл на сайт, но вместо сайта видит дулю с маслом. А распределённый это значит что сервер валят ботнетом – сетью зараженных компьютеров, управляемых хакером. Из этого следует, что если ботнет большой, то защититься от него иногда не могут даже самые крупные сайты интернета, крупный ботнет может просто забить канал запросами. Причём запросы будут не обязательно к апачу, а например к днс серверу, отчего сайт вообще перестанет даже резолвиться. Без вложений денег, причём как правило крупных, защититься от этого нельзя, но и для заказчика это может стоить довольно дорого.
Поэтому тут пойдёт речь о “защите на коленке”, когда у заказчика атаки мало денег или ресурсов для выполнение крупной атаки. Самый простой случай, это когда с сайта-жертвы, боты начинают безостановочно скачивать случайные страницы. При этом хакер надеется, что либо забъётся канал и сервер не сможет отвечать на нормальные запросы, либо запустится столько процессов httpd, обрабатывающих запросы, что они сожрут всю память сервера, отчего на нём зависнет линукс и отвечать на запросы сервер опять же не сможет.
Защиту можно разделить на 2 части – первая часть “внешняя”. Каждую минуту на сервере кроном запускается скрипт, который смотрит нагрузку (uptime). Если нагрузка выше любого возможного нормального значения (например 15) - сервер просто стопорится (service httpd stop), до тех пор пока нагрузка не упадёт. Звучит вроде глупо, зачем же самому выключать сервер, когда надо чтобы он работал? Но на самом деле, объясняется всё просто – если нагрузка резко пошла вверх, то у вас могут оставаться считанные секунды, до того как сервер вообще зависнет и перестанет отвечать на любые запросы, включая попытки войти туда по ssh. Поэтому лучше вырубить apache самому, но при этом иметь возможность зайти на сервер руками, чем потом ребутить сервер через хостера. Опять же, если после ребута ДДОС продолжается, у вас снова будут секунды на выкючение апача.
Поэтому такой скрипт это разумная мера. После того как скрипт засёк такую ситуацию, он пишет в какой-нибудь файлик, что сервер был остановлен. После падения нагрузки, скрипт это увидит (поскольку он запускается каждую минуту), а также увидит файл где прописано что сервер был остановлен. В этом случае скрипт перезапустит апача (service httpd graceful). В общем то одной этой меры хватит, чтобы сервер не уснул вечным сном при лёгком ддосе, но можно сделать кое-что ещё.
Вторая часть защиты “внутренняя” состоит в отключении досящих адресов. Для этого есть разные готовые модули в самом апаче, например mod_evasive. Этот модуль считает, сколько обращений было с какого-то ип за указанное время и если их было больше позволенного – ип банится на какой-то срок. В принципе идея нормальная, но поскольку модуль рассчитан на универсальность, то с таким подходом могут быть проблемы, например если у вас на странице 100 картинок, то баниться будут все посетители после первого захода на сайт.
Поэтому можно самостоятельно реализовать что-то вроде этого, но более гибко. В скрипте который выполняется при выдаче сайта, надо запоминать сколько раз обращался данный ип адрес за определённое время и если обращений было больше чем вам хочется, то можно в том же скрипте запретить доступ с этого адреса через htaccess, дописав в начало файла deny from ip.address. По истечении какого-то срока, эту запись можно удалить, либо просто переписать весь htaccess из сохранённой копии по крону (при этом плохие адреса сразу забанятся снова, если атака с них ещё идёт). Такой самопальный подход намного гибче чем готовые модули, а сделать его можно не менее быстрым и эффективным. Например хранить данные о хитах с ип можно в файле на tmpfs (виртуальном диске в памяти), а банить сразу подсеть по первым 2м циферкам ип адреса xx.xx. Если вас досят заражённые машины хостеров, всё равно оттуда человеческого трафа не может быть, и одна зараженная машина может досить с разных ип, так что вместо бана конкретного ип, можно смело выключать всю подсеть.
Сами скрипты специально не даю, поскольку их довольно просто реализовать, проще чем копаться в чужом коде. Первый скрипт можно сделать более умным, например в случае uptime 15 – выключать апач на 20 секунд и если нагрузка упала – включать его, чтобы не ждать целую минуту. Если uptime показывает скажем 50, то можно в цикле пытаться стопорить сервер несколько раз, бывает что с певого раза он не останавливается. При манипуляциях с .htaccess надо обращать внимание на то, чтобы 2 процесса не пытались писать в файл одновременно, блокировать файл в момент записи и чтения. Поскольку писать/читать туда придётся под ДДОСом, эта мера не будет лишней.
14 Responses
January 18th, 2008 at 14:56:33
// php gravatar() ?>1mod_evasive поможет только в случае, если атакующий будет обращаться к портам, которые слушает апач.
Проще написать правило iptables, которое будет банить IP по тому же принципу – но уже по всем портам.
January 18th, 2008 at 16:03:59
// php gravatar() ?>2+1, лучше банить файрволом
January 18th, 2008 at 17:14:43
// php gravatar() ?>3Ерунда какая-то. То сначала рассказывается, что нагрузка такая, что Апач выключать надо, то потом разговор про .htaccess идет, который вообще использовать при значительных нагрузках нельзя: Apache: Основы производительности (см. вторую часть, про .htaccess)
January 18th, 2008 at 18:06:21
// php gravatar() ?>4достаточно неплохой способ
http://www.xakep.ru/magazine/xa/081/066/1.asp
January 18th, 2008 at 23:16:05
// php gravatar() ?>5[...] В последнее время почти каждая банда вебмастеров считает нужным сделать свой поисковик. Хороших программеров на все поисковики не хватает поэтому их поделия тупо валят сервера. Причем представляться они могут разнообразными юзерагентами, ходить с кучи адросов и даже юзать прокси. При ручном просмотре логов таких ботов можно заметить, но задача автоматизации их отлова в общем случае еще не решена. Обозначенная проблема актуальна для сайтовладельцев, что было озвученно в блоге Alexf. [...]
January 19th, 2008 at 16:31:47
// php gravatar() ?>6Вообще за ddos должен следить хостер (если у вас конечно не свой дедик). Насколько я знаю, эффективные скрипты против ддоса стоят очень дорого.
January 20th, 2008 at 00:21:08
// php gravatar() ?>7SeoMan, нетрудно догадаться что речь идёт именно о своём дедике, ибо ни один хостер не даст рестартить апач.
Как сделать эффективные скрипты я написал, забесплатно. Принципиально более эффективного ничего не придумаешь.
buhhu, спасибо, статья вроде про тоже самое что и я пишет. Правда с той разницей что бан через firewall реализуется.
Anton, у меня такие скрипты, которые при каждом запуске читают/пишут во много файлов, при их работе прочитать и выполнить ещё и htaccess это абсолютно не принципиально по нагрузке. Думаю это так для почти любого пхп скрипта.
February 28th, 2008 at 17:40:40
// php gravatar() ?>8почти все боты не понимают редирект с JS
document.location.href=”http://www.domain.com/index.php”;
вот элегантное решение. положи html файл с этим редиректом. он маленький, быстро закэшируется и будет отдаваться из памяти
Банить в файрвол авто скриптами можно до посинения
Ну или snort. Но это другая песня…
March 12th, 2008 at 22:23:32
// php gravatar() ?>9ShivaS, не понятно как это использовать? Как быть с ддосерами, которые понимают редирект? Моё решение более универсальное.
April 13th, 2008 at 19:24:05
// php gravatar() ?>10по поводу “яваскрипта” и ботов которые его понимают,
если дос запланировался Живым челом то он Увидит редирект и поправит “смотрелку сайта”
а против “пришел какойто бот полулевый” можно сделать элегантное решение например с кешированием. все, что не похоже на нормального пользователя – получает кеш например лежаший для таких случаев и обновляющийся при заходе нормального пользователя. можно еще в кеш добавить строку аля Я_не_бот и естественно отдавайть все это чудо Не_апачем.
подводных камней , безусловно, в этом решение тоже много , но не бывает чуда “из коробки”.
ну и вообще , проверено на собственной шкуре что кеширование даже на 20 секунд контента снимает много лишних проблем
в плюсе с вышеуказаными скриптами -можно сделать еще что-то умное.
+ и плюс естественно лимитконнект фаерволом на ip а лучше на IP и на подсеть. ну и естественно асептфильтр в ядре. по крайней мере апачу станет от этого только легче. а против тупо удипей спасает только ширина канала. если она у вас выше чем сумарный канал ддосеров – то “ну пусть устанУт и отвалят сами когда надоест”
если канал у “них” толще и длинее …. это уже не легкий ддос
November 8th, 2008 at 13:27:34
// php gravatar() ?>11апаче зло,
логи лучше вести нгинксом – ресурсов меньше схавает, им же лимит коннекты по тяжелым скриптам сделать, им же можно кеш смейкать ге возможно – “статика” отдается нгинксом не в пример легче чем апачем.
нгинкс+cgi можно использовать для динамического бана (в фаер добавлять на лету, лучше сеткой сразу, хотя я предпочитаю просто отдать нгинксом 404 или 403 всем подозрительным, можно с яваредиректом (на случай если попал обычный юзер, нгинксом же можно и динамичесий урл соорганизовать (не побовал еще) который будет работать некоторое время и юзер туда попадут только те, у кого в броузере обычный яваскрипт имеется, у ботов нет ума для понимания ява редиректа и прочих мелочей
все это работает ровно пока есть канал.
чтобы было веселее – ставится робинбобин с минимальным временем экспаренса, ссылающийся на десяток ипишников. всех одновременно положить достаточно проблематично.
вот..
December 11th, 2008 at 01:02:07
// php gravatar() ?>12кстати о кеше , а интересно с форумами всякими , они же подставляют какуюто сессию в урл запроса, и получается что кешится вроде бы не то будет … нужно тогда как то вырезать лишнее из урла
December 14th, 2008 at 15:49:55
// php gravatar() ?>13Basil, в таких ситуациях надо кешировать не урл, а значимые параметры запроса и полученный результат.
November 28th, 2011 at 17:36:59
// php gravatar() ?>14[...] В последнее время почти каждая банда вебмастеров считает нужным сделать свой поисковик. Хороших программеров на все поисковики не хватает поэтому их поделия тупо валят сервера. Причем представляться они могут разнообразными юзерагентами, ходить с кучи адросов и даже юзать прокси. При ручном просмотре логов таких ботов можно заметить, но задача автоматизации их отлова в общем случае еще не решена. Обозначенная проблема актуальна для сайтовладельцев, что было озвученно в блоге Alexf . [...]
RSS feed for comments on this post · TrackBack URI
Написать комментарий
Про что писал
Календарь
Куйворды
Архив
Подписка на блог
Статистика подписки
Страницы
Комментарии
Последние посты
Blogroll
Счётчики
Свежие записи
Последние комментарии
Интересное на блоге
Самое комментируемое
SEO блог где палят темы is proudly powered by WordPress - BloggingPro theme modified by alexf