ГлавнаяРегистрацияВход Приветствую Вас Гость | RSS
   
Меню сайта
Разделы новостей
mp3player
Главная » 2007 » Июль » 7 » Есть ли жизнь под DDoS-ом? (пособие по отбиванию ddos атак)
Есть ли жизнь под DDoS-ом? (пособие по отбиванию ddos атак)
16:31
Методы защиты от масштабных нападений В массовых изданиях тема DDoS освещена со всех сторон. Многие авторы пишут о DDoS-атаках, об их реализациях и о последствиях. Но мало кто задумывается по поводу вопроса защиты от подобных нападений. Когда конечный пользователь сам сталкивается с такой атакой, то, по понятным причинам, он не знает, что делать, и куда бежать. На самом деле, никуда бежать не надо - достаточно прочитать эту статью.

[столкновение с проблемой]

Однажды, имея достаточно крупный ресурс на попечении, я столкнулся с серьезной проблемой. Кто-то заказал масштабную DDoS-атаку на мой проект. Симптомы нападения были налицо: при обращении к web-сайту Апач дико тормозил и возвращал контент лишь через десять минут. При заходе в консоль демон sshd вообще не отвечал на мои запросы. Сперва я подумал, что произошла какая-то фигня на сервере, и попросил мой датацентр перезагрузить машину (сайт проекта располагался на выделенном сервере в USA). После внеплановой перезагрузки с горем пополам мне все-таки удалось войти в консоль. Что я там увидел - не описать словами. Процессор был загружен на 100%, а показатель Load Overage достигал 160. Стоило мне убить процесс httpd, как машинка ожила, и загрузка мигом снизилась до нуля. Стало ясно, что боты бомбят запросами WWW-сервис. Проблему нужно было как-то решать, и только тогда я понял, что рациональных методов защиты от DDoS не существует.

Многие авторы в своих статьях рекомендуют обратиться к провайдеру и попросить администрацию зафаерволить IP-адреса на вышестоящем брандмауэре. Эта идея хороша тем, что юзеру вообще не нужно париться насчет нападений, однако прием работает не всегда. Когда я написал администрации датацентра об атаке, те просто пожали плечами и ответили, что ничего делать не собираются. Мол, у тебя есть свой файрвол, вот и обороняйся сам. Кстати сказать, подобную политику ведут многие хостинги и центры. С виду, ситуация выглядела неизбежной, но нужно было что-то предпринять, ведь оставаться без денег я тоже не хотел.

[модульная защита]

С головой окунувшись в инет, я пытался найти средство защиты от DDoS. Казалось бы, под потоком левых запросов находился всего один сервис, значит, решение проблемы должно быть где-то на поверхности. На одном из ресурсов, я обнаружил ссылку на модуль для Apache под названием mod_dosevasive. По словам разработчика, данный плагин позволяет защититься от крупномасштабной атаки, если последняя нацелена на Apache. Мне предстояло это проверить. Я скачал сам модуль по ссылке www.nuclearelephant.com/projects/dosevasive/mod_dosevasive_1.10.tar.gz и достаточно быстро поставил его на сервер. Оставалось лишь отконфигурировать httpd.conf и забыть о проблемах. По крайней мере, так писалось в README к модулю :).

В конфиг Апача мною было добавлено несколько строк:

[добавка в httpd.conf]


DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSSystemCommand "echo %s >> /var/log/niggerz"


Для большего понимания давай рассмотрим подробнее вышеописанные строки. В первой строке инициализируется размер так называемой хэш-таблицы, которая обрабатывает запросы к WWW-серверу. Затем располагаются счетчики запросов к одной странице и ко всему сайту. Интервал обращения по умолчанию равен одной секунде - это видно из последующих директив. Таким образом, если кто-то обратился к одной странице трижды за одну секунду, IP-адрес неприятеля будет заблокирован. Тот же самый результат произойдет в случае многократного обращения (50 попыток в секунду) к любой странице сайта.

Однако по умолчанию модуль просто возвращает ошибку 403 после блокировки. Даже в этом случае при масштабной атаке нагрузка на сервер может быть очень большой. Чтобы избежать подобного, я настроил модуль на простое добавление адреса в блэк-лист /var/log/niggerz с последующей обработкой этого файла специальным скриптом. Следовало учитывать, что операция записи происходит с правами nobody, поэтому необходимо установить атрибут 666 на файл.

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

[не знаешь сам - спроси товарища]

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

Сценарий был написан на языке Perl и не отличался особой сложностью. Каждую минуту он вызывался по крону и при запуске смотрел результат выполнения команды «netstat -ant|grep ESTABLISHED». Затем устанавливался какой-то предел соединений. Если данный лимит был превышен, IP-адрес заносился в черный список фаервола. Таким образом, мой товарищ не раз защищался от масштабной атаки.

Поблагодарив админа, я решил установить этот сценарий в мою систему. После небольшой переделки, скрипт был готов к использованию и выглядел примерно так:

[простой скрипт для защиты от DDoS]

#!/usr/bin/perl
@output=`netstat -ant|grep ESTABLISHED|awk '{print($4,$5)}'`;
$arg=$ARGV[0];
foreach $line (@output) {
chomp($line);
$line=~/(.*..*..*..*)..* (.*..*..*..*)..*/;
$devs{'63.33.33.33'}="sis0";
$src{$2}=$devs{$1};
$ips{$2}=$ips{$2}+1;
}
foreach $ip (sort keys %ips) {
if ($src{$ip}) {
if ($arg eq '0') { print "($src{$ip}) $ip => $ips{$ip} "; }
if ($ips{$ip} > 7) {
chomp($date=`date +'%d.%m.%y %H:%M:%S'`);
open(f, ">>/var/log/attack.log");
print f "$date -> attack/scan from $ip [$ips{$ip}] ";
close f;
system("/sbin/ipfw -q add 13 deny ip from $ip to me");
}}}

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

[изучаем журналы]

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

И я обнаружил этих ботов всего за несколько минут :). Для этого мне пришлось включить опцию verbose в моем фаерволе ipfw. Это делается простой командой sysctl -w net.inet.ip.fw.verbose=1. Затем я создал небольшое правило, обрабатывающее все пакеты. Данный рулес должен опережать по номеру правило, которое запрещает весь трафик на машину. Я выбрал в качестве идентификатора число 50000. Сама команда добавления выглядела следующим образом:

ipfw add 50000 count log logamount 0 ip from any to me 80

Теперь можно было приступить к анализу файла /var/log/security. Туда, по умолчанию, стали записываться все обращения к серверу на 80 порт. Немного переделав вышеописанный сценарий, я стал перечитывать фиксированный фрагмент лога (командой tail -1000 /var/log/security) и брать оттуда число обращений. Результат не заставил себя долго ждать - всего после 2-3 запусков нагрузка на сервер вновь упала.

Но подобным методом нельзя было защититься на все 100%, потому как за время своей работы скрипт уже успел забанить 20-30 легальных посетителей ресурса :). Это объясняется тем, что обычный пользователь при определенных условиях вполне может превысить мой лимит обращений (при обновлении страницы или при слабом канале).

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

Мне захотелось посмотреть на запросы, которые боты посылают WWW-серверу. Как оказалось практически все реквесты были одинаковыми и неотличимыми от пользовательских. На первый взгляд в запросе фигурировал Referer, правильно оформленное обращение на рандомную, но существующую страницу и реальный UserAgent. Однако последнее поле заставило меня усомниться в правильности запроса. В большинстве залогированных строк UserAgent имел префикс Win 98.x. Видимо это и была единственная отличительная черта обычных реквестов от вражеских. В моей голове уже родился план новой защиты сервера от ботов. И уже через 15 минут я его реализовал в виде компактного Perl-сценария. Грех не привести его исходный код, потому как многим администраторам он пригодится.

[perl-скрипт, спасающий от DDoS]

#!/usr/bin/perl
$num=`cat /var/log/rule`; # В этом файле хранится номер правила
chomp $num;
$cmd='tail -1000 /usr/local/apache/logs/access.log|grep "Win 9x 4."|cut -f1 -d" "|sort -u'; # Выгребаем последние 1000 записей с шаблоном, вырезаем из нее IP-адрес и убиваем дубликаты
@cmd=`$cmd`;
chomp @cmd;
foreach $each (@cmd) {
chomp $each;
$rule=0;
chomp $rule;
open(DB,"/var/log/niggerz");
while() {
if (/$each/) { $rule=1; break } # Если адрес уже есть в базе - завершаем работу
}
close(DB);
unless ($rule) {
system("/sbin/ipfw add $num deny ip from $each to me 80"); # В противном случае - заносим IP в блэк-лист
open(LOG,">>/var/log/dos.log");
print LOG "banned ip $each as rules $num ";
close(LOG);
open(DB,">>/var/log/niggerz");
print DB "$each "; # И добавляем запись в лог и в базу ниггеров :).
close(DB);
$num++;
}}
`echo $num > /var/log/rule`; # Обновляем номер правила

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

Скрипт antiddos.pl запускается через crontab каждую минуту. Этого вполне хватает, чтобы отразить атаку 2-3 тысяч ботов, как было в моем случае. Единственный минус в работе сценария заключается в том, что он не может быстро восстановить работоспособность сервера. Иными словами, при излишне активной атаке (20-30 запросов в один момент времени), сервер все равно уходит в анабиозное состояние, но возвращается из него через 3-4 минуты :).

[админ спит, атака идет]

Если ты думаешь, что я поставил сценарий и забыл о ботах, то ошибаешься :). Несмотря на то, что за трафик я не платил (а боты нагоняли в день около 500 мегабайт мусора), я захотел справедливости. Поэтому моей задачей было отписать в abuse всем network-администраторам тех сетей, на которых крутились боты, тем самым разрушив ботнет. В течение часа с помощью команды whois, bash-евых средств автоматизации и какой-то матери :), я собрал почтовые адреса на 90% ботов. Моя задача упрощалась тем, что в большинстве случаях атака велась из одной подсети. Таким образом, мне понадобилось написать всего 400 жалоб, чтобы сообщить обо всех уязвимых машинах. Задача была выполнена всего за три часа, и уже через день я получил добрую половину ответов от админов, которые обещали обезвредить заразную машину. Всего через неделю поток флуда на мой сервер полностью прекратился. Видимо, ботмастер понял, что со мной опасно иметь дело, или заказчик флуда перестал платить деньги за атаку. В любом случае я одержал победу над злодеями, чему до сих пор очень рад.

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

[похожие файрволы]

Если ты счастливый обладатель Linux, то переделать скрипты не составит особого труда. Следует лишь вместо ipfw использовать фаервол iptables. Однако нужно помнить, что слово setup, которое отвечает за тип ESTABLISHED-соединения, должно быть заменено на конструкцию "-m state --state ESTABLISHED".

Следует также внедрить механизм сохранения правил после перезагрузки. Здесь существует два варианта - либо пользоваться сервисными командами (наподобие, /sbin/service iptables save), либо заносить правило в список вручную. При последнем приеме не забывай, что список правил iptables обычно хранится в /etc/sysconfig/iptables.

[компетентное мнение]

Большинство DDoS-атак базируется на особенностях работы протокола TCP/IP, в частности, на способе обработки входящих пакетов с флагом SYN. Эти атаки достаточно сложно предотвратить, особенно, если система подразумевает общедоступные входящие соединения. Тем более, что для проведения таких атак не требуется высокая квалификация атакующего и средства для их проведения легкодоступны. Также осложняет борьбу с такими атаками тот факт, что они, как правило, проводятся со множества адресов, зачастую находящихся в разных сегментах Сети и принадлежащих разным операторам связи. Поэтому какого-то стопроцентного способа борьбы с нападениями попросту не существует.

На данный момент самое действенное средство борьбы с этим типом атак - это контроль со стороны оператора связи, который должен обеспечивать их быстрое обнаружение и блокирование этого трафика на входе в свой сегмент сети. Операторы связи пытаются предотвращать подобные атаки путем установки фильтров, которые отсекают такой трафик в автоматическом режиме. Особенно эта практика распространена у зарубежных операторов связи. Причем зачастую от действия таких фильтров страдают обычные пользователи, так как достаточно сложно отличить трафик DDoS-атаки от некоего приложения, устанавливающего одновременно несколько соединений с каким-либо узлом.

Краснов Алексей. Системный администратор компании Медиател (www.mediatel.ru).

INFO

Чтобы включить файрвол, необходимо выполнить команду sysctl -w net.inet.ip.fw.enable=1. Но не забывай, что во FreeBSD политикой по умолчанию является Deny, поэтому перед активацией фаервола нужно добавить правило ipfw add 65000 allow ip from any to any.

Примечания

http://ru.wikipedia.org/wiki/DDoS - Про атаки и не только
Категория: Web-мастеру | Просмотров: 2788 | Добавил: VVS | Рейтинг: 0.0/0 |
Всего комментариев: 3
3 Ereramale  
0
ОДНОКЛАССНИКИ ЗНАКОМСТВА

2 LoferoftEdget  
0
ygfkj

1 tyryrtyrty  
0
fssdfsdf

Имя *:
Email *:
Код *:
Поиск
Форма входа
Наш опрос
Чего Вам не хватает на сайте?
Всего ответов: 21
Друзья сайта
Статистика
Возраст