22:00 18.07.2008 | Все новости раздела "Другая Россия / НБП"

Индустрия вывода из строя сайтов при помощи DDoS (Distributed Denial of Service - распределенная атака на отказ в обслуживании) активно развивается и имеет крупный денежный оборот

Атаки на веб-сайты при помощи атак на отказ сетью зомбированных компьютеров прочно вошли в жизнь интернета в последние годы. Индустрия вывода из строя сайтов при помощи DDoS (Distributed Denial of Service - распределенная атака на отказ в обслуживании) активно развивается и имеет крупный денежный оборот. Если ранее зомбированные компьютеры злоумышленникам было выгоднее использовать для рассылки почтового спама, то теперь спрос на вывод сайтов из строя потребовал данные мощности для своего обеспечения. Наверняка многие вебмастеры, если и не сталкивались с этим явлениям на своем опыте, то наверняка слышали и читали.

Мы рассмотрим лишь самый поверхностый способ противодействия таким атакам. Для более серьезной борьбы потребуется выделенный сервер и специальное оборудование, поэтому будем опираться на минимальные требования: скриптовый интерпретатор PHP и база данных MySQL. Этот "суповой набор" доступен на большинстве хостингов и является основной средой обитания сайтов самых разных габаритов.

Безусловно, мы не сможем прикладными средствами отразить атаку, в которой задействованы сотни и тысячи атакующих машин. Каждая из них непрерывно генерирует запросы, ни чем не отличающиеся от запросов реальных пользователей. Однако наша основная задача - снизить нагрузку на сервер, минимизировав обработку таких запросов в движке. Подумаем: какие действия приходится выполнять серверу, получив один-единственный запрос от пользователя?

    считать файлы скриптов в память, запустив интерпретатор PHP;
    если файлы соединены включениями друг в друга (include, require), что чаще всего происходит, необходимо загрузить все эти скрипты;
    установить соединение с MySQL и выполнить все необходимые запросы, а их число обычно десятки и иногда сотни;
    сгенерированный код HTML вывести, предварительно собрав в буфер.

На эти операции расходуются десятки мегабайт оперативной памяти, при этом, для каждого запроса зачастую выделяются дополнительные области памяти и ресурсы процессора. В случае наводнения сервера многочисленными запросами начинает катастрофически не хватать оперативной памяти, что приводит вначале к замедлению обработки запросов, а после и перехода системы в сомнамбулическое состояние. Этот переход чреват полным отказом сервера в обслуживании, в т.ч. и интерфейсов управления. Кроме того, будет установлено чрезмерное число соединений с сервером MySQL и он так же откажется обслуживать новые запросы. Вероятно, что и процессорного времени окажется недостаточно для работы с сервером и он потерпит крах.

Но, все же, не все так печально. Мы можем здорово сократить затраты оперативной памяти и процессора, а также базы данных. Для этого рассмотрим два способа, которые можно использовать совместно: кэширование выводимых данных и введения механизма сессий для отсечения зазомбированных машин.

Хорошей иллюстрацией может послужить пример реального случая большого числа единовременных соединений от биржи ссылок Sape.ru:

    [root@xxx ~]# netstat | grep 217.107.36.73 | wc -l
    205

    mysql CPU % usage: ~98.

Как видим, число соединений от Sape.ru (217.107.36.73) превысило две сотни, из-за чего практически все процессорное время было съедено MySQL.

Кэширование данных

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

    $hash="/var/www/html/cache/".md5($SERVER_NAME.$REQUEST_URI);
    if(file_exists($hash)&&(time()-filemtime($hash)

    Источник: Нацбол

      Обсудить новость на Форуме