Pull to refresh

Comments 92

Вы лучше покажите скрипт который автоматически банит ботов, заблокировать 80 порт на фаерволе это не самая сложная задача.
> заблокировать 80 порт на фаерволе

Не сложная — если есть доступ к этому самому фарволу. И если сам внешний файрвол есть…

> скрипт который автоматически банит ботов

При загрузке создаем правлио:

iptables -I INPUT -m set --set autoban src,dst -j DROP

Потом собственно:

sudo /sbin/ipset -A autoban $REMOTE_ADDR

синтаксис айпитейблс я знаю, спасибо. как ботов находите?
Ну это как-то тапорно рубить весь порт. Может посмотреть в сторону iptables + limit-burst?
Да, это жестоко, но эффективно.

> iptables + limit-burst

А есть что либо почиатаь на эту тему?
Если у вас коло и есть своя железная файрволина типа SRX210: вкусно использовать policer что бы сбрасывать http трафик при загрузке полосы >90%. Плюс — многие типы атак можно задавить еще на уровне IPS
MODevasive давно пробовали, но эффекта не было.

MODsecurity выглядит интересно. Попробуем.
Где в статье про защиту от DDoS-то? Судя по тексту, атака достигла цели. Гордиться тем, что получил доступ к серверу — невеликое достижение, IPKVM и иже с ними завсегда есть.
IPKVM — у нас нет. Только SSH.

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

Так продолжение будет? Что за дедик (ведь дедик в статье, не?) без возможности IPKVM/iLo/IPMI?
Продолжение планируется.

Дедик. Но ipkvm нет.

Кстати, при load average > 100, KVM особенно не поможет.
Имея КВМ можно после перезагрузки уйти в сингл-юзер мод и произвести необходимые настройки
имея ип квм можно подождать 10-20 минут, пока залогинишься и потушить интерфейс. Но вот ла в 100 для линукса при ддосе — это не правильное количество максклиентс и серверлимит, которые выставлены в 256 по дефолту в рхел. плюс фронтэнд не настроен.
Зайти в single user mode (впрочем, даже без него можно) у нормальных хостеров можно и без KVM (привет Hetzner'у!): PXE, network boot, rescue mode и всё такое. Загрузился во внешнюю ОС, смонтировал раздел(ы), переконфигурил свою систему, ребутнулся обратно.
loadavg 100 у вас от неправильной настройки сервера
Всеми обожаемый хетцнер, например :) Это и называется «дешево и сердито».
А, ну да. Десктопное железо, понятно дело.
У хетцнера есть IPKVM при желании подключать к любому серверу. Собственно у любого дедика это есть.
Что за дедик (ведь дедик в статье, не?) без возможности IPKVM/iLo/IPMI?

Десктопное железо или самосбор, м.б.? Не все же готовы переплачивать за серверные бренды по несколько тысяч USD.
UFO landed and left these words here
Это пионерские методы и спасут они лишь от пионерской атаки. Делать mitigation средствами атакуемого же сервера — тупиковая затея.
UFO landed and left these words here
Реверс-прокси должен по дефолту стоять фронтом на любом мало-мальски приличном проекте, это давно уже очевидно любому школьнику, на мой взгляд. Тем не менее, сервер общего назначения не сможет поглотить атаку в 30 килопакетов в секунду, например, что бы там ни стояло. Nginx великолепен, но рассматривать его как «защиту от DDoS» по меньшей мере неразумно. Это балансер, фронт-сервер, кеш-сервер, если хотите. Поглощать мусорный трафик в его задачи не входит, хотя он это делает много лучше динамических серверов с тредовой моделью, это тоже весьма очевидно.
UFO landed and left these words here
Посмотри мой коммент чуть ниже и ответь на вопросы про «штатный iptables», ок? Тогда и поговорим.
ОК, 8-и часовое молчание принимается как отсутствие мыслей по заданному вопросу.
UFO landed and left these words here
Итак, что мы имеем в сухом остатке?
Я задал прямые, простые вопросы по теме топика. Ты не ответил ни на один, уклонился, признав, очевидно, собственную некомпетентность, как я понимаю. Далее назвал меня троллем и бросил фразу «я все сказал», еще раз признавшись, что добавить, попросту, нечего. ОК.
Nuff said.
Ах, да, слишком мало многозначительных точек, ты же их так любишь, держи:







Три дня назад таким вот пионерским методом отбил 8-часовую атаку в 13к хостов. Это когда у вас standalone сервер под один-два проекта — вы можете себе позволить и внешние сервера для отражения атаки, и даже циску в стойке ) А когда пара шаредных серверов — денег на «правильную» зашиту на особо наблюдается.
Ну, все правильно. Стоимость защиты должна быть адекватна ресурсу, который защищаем. Если дешевле лечь — лежим, если простой сервиса стоит больше, чем услуги по защите или даже закупка специализированного оборудования — покупаем. Если есть знакомый линуксойд с iptables наперевес, который может небольшую атаку митигировать — то почему нет. Но только не стоит преподносить этот метод как единственно верный, он работает, но лишь в некоторых конкретных случаях и его возможности весьма ограничены. Как принять 500 тысяч одновременных запросов на типовой сервер с линуксом? А миллион?
На «типовой сервер» с чем угодно вы не примете миллион запросов. Допустим даже, что у вас есть софт, который сможет это сделать (тут где-то пробегала статья на тему реализации HTTP-сервера на хаскеле, который миллионы) — зачем отказываться от горизонтального масштабирования?
Впрочем, мы уходим от темы :) По остальному не согласиться не могу )
Горизонтальное масштабирование тут ничем помочь не может, точка входа все равно будет одна — балансировщик. Можно, конечно, размазать так или иначе (DNS RR, BGP ANYCAST) по нескольким точкам, но суть проблемы от этого не меняется, если DDoS придет к вам по конкретному destination ip.
может все таки erlang?
> 10К адресов — это совсем незаметно.

Странно, но при 2K уже была видна задержка при работе по SSH. И загрузка процессора была приличная.

После того как подключили ipset, все стало «летать».

> Запросы приходят на Nginx, а он проксирует Апачу.

Тоже думали над таким вариантом.

> Сразу оговорюсь, универсальной таблетки не существует

100%

> Отрывками и комментариями могу поделиться.

Интересно было бы посмотреть.
Наша задача — отловить клиента с «левым» запросом («POST / HTTP/1.0», например) и записать его адрес в файл. Потом адрес скормить IPtables...

Это всё умеет fail2ban, то есть даже скрипт второпях писать не надо. Единственное, он не через ipset работает.
UFO landed and left these words here
Для ограничения поедания апачем всех ресурсов есть более простой способ —
mod_load.c
pastebin.com/rBN2VD6V

устанолвите и потом в конфиге апача добавьте

LoadModule load_module /usr/lib/apache/mod_load.so

MaxLoad 50.00

в современных ядрах это можно сделать и на уровне ядра, включив апач в группу ограниченных ресурсов, если не ошибаюсь
Или cpulimit, что универсальнее: Linux limit CPU usage per process.
Можно ещё настроить limits.conf (/etc/security/limits.conf в Debian), что само по себе тоже полезно. Поскольку нагрузку создаёт не столько Apache, сколько тормоза от множественных параллельных запросов к скриптовому интерпретатору, серверу баз данных и исчерпание оперативной памяти (а в особо критических случаях и свопа).
Я избавился от тупого HTTP флуда с помощью nginx и cookies

if ($cookie_antiflood !~* "что-нибудь") {
    rewrite ^(.*)$ /set_cookie$1 permanent;
    break ;
}
location ~ ^/set_cookie/ {
    add_header Set-Cookie "antiflood=что-нибудь; path=/";
    rewrite ^/set_cookie/(.*)$ /$1 permanent;
    break ;
}


Если идет запрос без специальной cookie, то юзера 301 редиректом отправляем получить cookie и потом посылаем обратно.
Тупые боты (в т.ч. и поисковые) не воспринимают либо редирект, либо cookies.
Для посетителей сайта все работает практически незаметно.
Ботнеты не так тупы, как кажется. И если ботнет не ходит по редиректам, это не значит что он не умеет — просто операторы ботнета не поставили нужную галочку. Тоже видимо касается и кук (хотя именно куки я не проверял), а вот отпарсить страницу чтобы найти в ней JS-редирект — на это у ботнетов ума обычно не хватает
те боты, с которыми я столкнулся не ходили по редиректам.
Аналогичным образом их можно отправлять на капчу и уже там ставить cookie
Ну тогда на вас нападал бюджетный ботнет ^_^
не любите вы поисковых роботов
Тут уж выбор, либо вообще все лежит, либо только для поисковиков
А почему нельзя просто отдавать статический контент и выставлять куку, чтобы второй заход сделал из меня человека, но данные я увидел в любом случае?
Статический контент можно отдавать (хотя от ботов будет расти нагрузка на HDD)
Если объем оперативы больше объема статического контента, то никакой нагрузки на винт не будет — все осядет в кэшах ОС
я бы даже сказал вредная. так делать нельзя… ну разве что про ipset верное замечание есть…
«у вас болит голова. отрубите её и она перестанет болеть. проблема решена».
UFO landed and left these words here
иногда без апача обойтись нельзя, например когда нужен WAF.
когда нужен WAF

может лучше не писать/держать заведомо дырявые приложения?
а кто даст гарантию, что они не дырявые? что если код ревью не выявит баг\бэк дур, который программист умело спрятал? И тем более есть такая вещь, как PCI DSS, по которой WAF обязателен.
Когда нужен WAF, без апача запросто можно обойтись -)
например? mod_security под nginx нету, а более адекватных вэбсерверов кроме апача и nginx нет.
Ты и правда полагаешь, что mod_security — единственный/лучший в мире WAF?
да, я так полагаю, потому как он отвечает требованиям, которые возложены на WAF. Может хватит отвечать вопросом на вопрос?
Я уже оставлял ответ на твой вопрос в комментариях к этому топику.
И какие же требования возложены на WAF? В какой мере mod_security им отвечает? Входит ли в список требований time-lapsed-корреляция и динамическое профилирование, например?
Знаете ли, с вами не особо приятно разговаривать. Во первых вы прямо не ответили на вопрос, сославшись что ответ есть где-то неподалеку, увы, я его не нашел. Во вторых ваша манера тыкать незнакомому человеку.
Поэтому такому человеку как Вы, мне просто лень доказывать прописные истины:
1) что такое WAF и с чем его едят
2) что mod_security — это полноценный WAF, который отвечает многим стандартам защиты информации, например таким как PCI DSS первого уровня.
Во первых вы прямо не ответили на вопрос, сославшись что ответ есть где-то неподалеку, увы, я его не нашел
Да, мой косяк, извини, то была другая тема.

Что такое WAF мне известно, не переживай )
А так часто упоминаемый тобой стандарт PCI DSS, во-первых, не обязывает использовать WAF, предлагае его как один из двух вариантов достижения комплаенса, во-вторых, не выдвигает вообще никаких требований к самому WAF (см. п.6.6 стандарта), поэтому фраза
отвечает многим стандартам защиты информации, например таким как PCI DSS первого уровня.
не несет никакой смысловой нагрузки.

Я ответил на твои вопросы? Ответь и на мои теперь, а то ты поспешил сделать оскорбленный вид и проигнорировать их, понимаю, это распространенная тактика капитулирования, но все же возьми себя в руки, ты же профессионал.
ОК, похоже еще один, которому нечего сказать. Откуда вас столько, только напускающих на себя вид специалистов? Зачем это делать?
Хммм. довольно странная защита от DDOS — блокировать рабочий порт. В чем профит?
Профит — дать возможность зайти админу на сервер находящийся под атакой, плюс дать спокойно отработать скриптам которые забанят очередную пачку ботов.
Т.е. для Вас забанить ботов и залезть на сервер важнее предоставляемого сервиса? Вы точно ничего не путаете?
UFO landed and left these words here
ngrep можно заменить на tshark
tshark -tad -R http \
        -R '(http.request.method contains GET || http.request.method contains POST) && (http.host matches "example.com$") && (http.request.uri matches "^/$")' \
        -T fields -e ip.src \
        'tcp dst port 80'

будет выдавать построчно IP-адреса запросов клиентов, соответствующих заданным критериям (GET/POST метод, имя хоста на сервере, URI)
Что за детский сад?

вы явно не видели 10.000 машин 100мбит ддос, хахаах.
ДДоС на HTTP как правило не старается прогрузить входящий канал, чтобы не отсвечивать лишний раз, да и ресурсы лишние не задействовать. Хотя это от ботнета зависит, есть те, кто и гигабит входящего трафика организует (тут были топики).
А 10 тысяч машин как правило не принимают участие в атаке одновременно (большая часть ботнета — домашние компы в разных частях света) одновременно работает процентов 5-10 от общего числа. И да, 10.000 машин, которые заблокированы файрволлом и долбятся все сразу два раза в секунду своими SYN пакетами дают ровно 100 мбит (на считая оверхеда на ethernet). Но в случае атаки стотысячного ботнета одним сервером со 100 мбитами не спасёшься, это очевидно.
А если ssh порт атакуют, что вы будете делать?
1) Мы используем не стандартный SSH порт;
2) SSH открыт только для выделенной подсети. Это не вебсервер, который должен быть доступен всем.
Не вздумайте спрятать статью в черновики!
Каменты все-же полезные!
memento mori — помни о DDOS-е.
Может поддерживать актуальные списки IP адресов правильных клиентов и в случае DDOS-а давать доступ только им?
Отличная идея. Сделаем.
Правильно ли я понял из статьи, что у вас была следующая ситуация:
1. У вас наружу смотрел apache
2. Не было nginx или другого аналогичного сервера
3. При старте системы очень быстро приходило много http запросов, из-за чего число процессов apache достигало критического для системы значения (50?) и у вас заканчивалась и оперативная память, и swap, из-за чего сервер переставал отвечать на какие-либо запросы?
4. однако, запуск скрипта из crontab все-таки работал?

Если да, то именно последний пункт — «запуск чего-нибудь из crontab» является интересным моментом. Это ценная информация.
Остальное, увы — действительно неправильно настроенный сервер.
Для предотвращения именно этой ситуации (с маленьким ростом нагрузки) проще всего было настроить так:
1. nginx как front-end
2. apache с числом одновременных процессов 5-10

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

если при этом у вас nginx еще отдает статику — это будет дополнительное снижение нагрузки.

Увы, часто меры принимаются постфактум.
для защиты от подобного школо-ддоса и тупых ботов, можете прикрутить к nginx Roboo. JS redirect + secure cookie, а также проверка Flash плеера. Дёшево и сердито.
Хорошо, что вы это написали… но поискав пару минут, вы бы нашли более простые и универсальные методы.
Блокировка сервиса это ни разу не выход.

ps: ipsec то не работает под 3.x…
Я фигею. Отключение сервиса — это теперь защитой от DDOS называется?
Статья откровенно слабая. Был в подобной ситуации, написал быстро вычислялку самых активных айпи, банил их iptables. После 17 тыщ правил в iptables начинает сильно расходоваться системное время (%sy). В общем, правильно говорят, нужен какой-либо железный FW на входе.
ipset 17 тыщ правил превращают в одно…
Я бы для начала посмотрел не на адреса, а на подсети. В таких случаях частенько помогает отключение китайцев. Особенно если ваш сервис для них не нужен. На первое время хватит, чтобы «отдышаться». А вообще брать можно только шириной канала и распределенностью датацентров.
м-да, для вас 100мбит\с это флуд, а для кого-то это нормальная нагрузка… вместо того, чтобы ставить костыли в виде фаервола, вы бы лучше софт привели в порядок. Если вам не нужен WAF, у вас обычный сайт на php(например), то вас один голый nginx устроит(+php-fpm). Ну и провести кодревью не мешало бы еще, если что-то самописное. Ну и заведите себе ipkvm, это не серьезно — его не иметь, если нашлись те, кто вас ддосят. Банить правилами фаервола — это уже последнее дело.
Меня пару раз выручал sleep 120 в скрипте /etc/init.d/httpd
Но я сейчас, честно, не встречал провайдера без KVM-IP… Зато встречал провайдера у которого аплинк 1гбит и канал к серверу 1гб, положили сервер — положили аплинк, мне такой провайдер не могу выдать KVM-IP так как залипшим оказалась его главная железка и уже тут ее ребутали и пытались успеть втиснутся в админку))
UFO landed and left these words here
А можно обратится к автору с просьбой о помощи в похожем деле?
аська 66945401, скайп whoim2
Only those users with full accounts are able to leave comments. Log in, please.