Предотвращение DoS атак

DoS (denial-of-service - отказ службы) атака - это попытка одного человека, или группы людей, нарушить работу онлайн службы. В процессе этой атаки сервер перегружается бесполезным трафиком данных, что приводит к загрузке его ресурсов и нестабильной работе. DoS атака - самый распространенный вид атак в Интернете и может быть легко запущена против вашего сайта в любое время.

Итак ,как вы узнаете, что подверглись DoS атаке? Существует много вариантов DoS атак и некоторые из них определить сложнее, чем другие. Некоторые программ, такие как Apache Web сервер, подверглись изменению своей архитектуры, чтобы осуществлять защиту против этого вида атаки. Метод, описанные в этой статье, позволит вам автоматически определить и защититься от DoS атаки против вашего приложения, независимо от того, какой вы используете веб сервер.

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

Листинг 1:
CREATE TABLE sessions (
id int IDENTITY (1,1) NOT NULL,
urltoken varchar(12),
ipaddress varchar(15),
template varchar(150),
firsthit datetime,
lasthit datetime,
pages int
)
PRIMARY: id
INDEXES: urltoken, lasthit

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

Теперь, для запуска проверки DoS атаки, нам нужно внести в наше приложение немного изменений. Сначала мы добавим в файл Application.cfm код, который будет проверять, есть ли сессия в базе данных. Если есть, то мы обновим текущие данные, а если нет, то добавим новую запись (Листинг 2).

Листинг 2:

Теперь в нашей базе данных есть вся информация о текущих сессиях пользователей. Давайте используем преимущества встроенной поддержки управления сессиями в ColdFusion, чтобы обнаружить атаку. В обычном режиме ColdFusion создает новые CFID и CFTOKEN для каждого нового браузера. Поскольку большинство DoS атак используют программное обеспечение, а не браузер, то ColdFusion не будет создавать новые CFID и CFTOKEN для каждого такого запроса. Нам нужно определять такие запросы.

Мы установим скрипт, выполняемый по расписанию каждые 5 минут, которые будет следить за таблицей активных сессий (по желанию вы можете изменить интервал времени). Наш проверяющий скрипт (Листинг 3) сначала удаляет все записи, которые старше времени, указанного в атрибуте sessiontimeout тега <cfapplication>. В нашем примере продолжительность сессии будет 60 минут. Затем мы посчитываем, с колько приходится URLTOKEN'ов на каждый IP адрес. Следует отметить, что на один IP адрес может приходится несколько URLTOKEN'ов, т.к. посетитель может пользоваться Интернетом, например, через прокси сервер. Таким образом, установим предел количества URLTOKEN'ов на один IP адрес равным 50, что не затронет обычных посетителей. По желанию вы можете регулировать этот предел. В заключении, мы создаем список соответствующих IP адресов и сохраняем его в переменную типа application.

Листинг 3:

Должно быть вы заметили, что последняя строчка, создающая переменную application.DoS, не блокирована тегом <cflock>. Это следует сделать, если множество пользователей или сессий одновременно обращаются к этому коду, но в нашем случае этот код будет запускаться только один раз планировщиком ColdFusion.

И в заключении следует в самом начале файла Application.cfm следует добавить код из Листинга 4. Так мы будем проверять IP адрес, с которого фиксируется очень большое количество запросов. Соответственно таким запросам мы не буем давать обрабатывать всю страницу сайта, тем самым сохраним ресурсы сервера.

Листинг 4:

Ранее мы упомянули, что получаемые нами данные частично можно брать из клиентских переменных. Для этого нужно всего лишь активизировать их, указав lientmanagement="yes" в теге <cfapplication>. Но клиентские переменные имеют некоторые недостатки:

DoS атаки совершенствуются с каждым годом, поэтому необходимо постоянно защищаться от тех повреждений, к которым они могут привести.


По материалам: Defeating DoS Attacks

 


Hosted by uCoz