Как включить защиту от DDoS?

DDoS (распределенные атаки типа «отказ в обслуживании») обычно блокируются на уровне сервера, верно?

Есть ли способ заблокировать его на уровне PHP или хотя бы уменьшить?

Если нет, то какой самый быстрый и распространенный способ остановить DDoS-атаки?


person coderama    schedule 23.01.2013    source источник
comment
Поскольку нет ничего лучше, здесь есть список модулей Apache, которые потенциально может помочь. Однако это кажется не очень богатым, и два проекта из четырех (по запросу «dos») кажутся указывающими в никуда.   -  person Audrius Meskauskas    schedule 30.01.2013
comment
Что-то вроде этого? mod-antiloris.sourceforge.net   -  person K-Gun    schedule 30.01.2013
comment
DDOS считается успешным, когда система больше не может обрабатывать все запросы, которые ей бросает атака. Если вы добавите в свое приложение код, который проверяет каждый запрос на наличие DDOS-атаки, то этот код на самом деле приносит больше вреда, чем пользы, потому что он просто требует немного больше ресурсов для каждого запроса. Это будет работать только в очень ограничительной среде, где анонимный запрос в любом случае не разрешен.   -  person Hugo Delsing    schedule 04.02.2013


Ответы (10)


DDOS — это семейство атак, которые перегружают ключевые системы в центре обработки данных, включая:

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

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

  1. Обратитесь к своему хостинг-центру, чтобы понять, какие услуги они предлагают, включая фильтрацию IP-адресов и портов при их сетевых подключениях к Интернету и услуги брандмауэра, которые они предлагают. Это очень важно: многие сайты удаляются из Интернета хостинговой компанией, поскольку хостинговая компания занимается устранением сбоев в работе всего центра обработки данных, вызванных DDOS для одного клиента. Кроме того, во время DDOS-атаки вы будете очень тесно сотрудничать с персоналом хостинг-центра, поэтому знайте их номера экстренных служб и будьте с ними в хороших отношениях :) Они должны иметь возможность блокировать целые международные регионы, полностью блокировать определенные услуги или сеть. протоколы и другие защитные меры широкого спектра или, в качестве альтернативы, разрешить только IP-адреса из белого списка (в зависимости от вашей бизнес-модели)
  2. Находясь в хостинг-центре, используйте сеть доставки контента для распространения ( в основном статические) сервисы рядом с вашими конечными пользователями и скрывают ваши настоящие серверы от архитекторов DDOS. Полная CDN слишком велика для DDOS, чтобы вывести из строя все узлы во всех странах; если DDOS нацелен на одну страну, по крайней мере, другие пользователи все еще в порядке.
  3. Держите все свои системы и программные пакеты обновленными с помощью последних исправлений безопасности — я имею в виду все из них:

    • Managed switches - yup these sometimes need updating
    • Маршрутизаторы
    • Брандмауэры
    • Балансировщики нагрузки
    • Операционные системы
    • Веб-серверы
    • Языки и их библиотеки
  4. Убедитесь, что у вас есть хороший брандмауэр или устройство безопасности, настроенное и регулярно проверяемое квалифицированным экспертом по безопасности. Строгие правила брандмауэра — хорошая защита от многих простых атак. Также полезно иметь возможность управлять пропускной способностью, доступной для каждой открытой службы.

  5. Подготовьте хорошие инструменты мониторинга сети. Это поможет вам понять:

    • That you're under attack rather than simply being under heavy load
    • Откуда исходит атака (включая страны, с которыми вы обычно не ведете дела) и
    • Что на самом деле представляет собой атака (порты, сервисы, протоколы, IP-адреса и содержимое пакетов)
  6. Атака может заключаться в простом интенсивном использовании законных служб веб-сайта (например, попадание «легальных» URI, выполняющих запросы, или вставка/обновление/удаление данных) — тысячи или миллионы запросов, поступающих с десятков или миллионов различных IP-адресов, приведут сайт к его колени. В качестве альтернативы, запуск некоторых служб может быть настолько дорогим, что только несколько запросов вызывают DOS - подумайте о действительно дорогом отчете. Поэтому вам нужен хороший мониторинг происходящего на уровне приложений:

    • Which services have been invoked and what arguments/data are sent (i.e. logging in your application)
    • Какие пользователи выполняют вызовы и с каких IP-адресов (т.е. входят в ваше приложение)
    • Какие запросы и вставки/обновления/удаления выполняет БД
    • Средняя нагрузка, загрузка ЦП, дисковый ввод-вывод, сетевой трафик на всех компьютерах (и виртуальных машинах) в вашей системе.
    • Убедитесь, что всю эту информацию легко получить и что вы можете сопоставить журналы с разных компьютеров и служб (т.е. убедитесь, что все компьютеры синхронизированы по времени с помощью ntp).
  7. Разумные ограничения и ограничения в вашем приложении. Например, вы можете:

    • Use a QoS feature in the load balancer to send all anonymous sessions to separate application servers in your cluster, while logged-on users use another set. This prevents an application-level anonymous DDOS taking out valuable customers
    • Использование сильной CAPCHA для защиты анонимных сервисов
    • Время ожидания сеанса
    • Установите ограничение сеанса или ограничение скорости для определенных типов запросов, таких как отчеты. Убедитесь, что вы можете отключить анонимный доступ, если это необходимо
    • Убедитесь, что у пользователя есть ограничение на количество одновременных сеансов (чтобы взломанная учетная запись не регистрировалась миллион раз)
    • Имейте разных пользователей приложения базы данных для разных служб (например, использование транзакций или использование отчетов) и используйте управление ресурсами базы данных, чтобы не допустить, чтобы один тип веб-запроса подавлял все другие.
    • Если возможно, сделайте эти ограничения динамическими или, по крайней мере, настраиваемыми. Таким образом, пока вы подвергаетесь атаке, вы можете установить агрессивные временные ограничения («дросселирование» атаки), например, только один сеанс для каждого пользователя и запретить анонимный доступ. Это, конечно, не очень хорошо для ваших клиентов, но намного лучше, чем отсутствие обслуживания вообще.
  8. И последнее, но не менее важное: напишите документ План реагирования на DOS и проведите его внутреннюю проверку всеми соответствующими сторонами: бизнесом, руководством, командой разработчиков ПО, ИТ-группой и экспертом по безопасности. Процесс написания документа заставит вас и вашу команду обдумать проблемы и поможет вам подготовиться, если самое худшее произойдет в 3 часа ночи вашего выходного дня. Документ должен охватывать (среди прочего):

    • What is at risk, and the cost to the business
    • Меры, принятые для защиты активов
    • Как обнаруживается атака
    • Планируемый ответ и процедура эскалации
    • Процессы для поддержания системы и этого документа в актуальном состоянии

Итак, преамбула в сторону, вот несколько конкретных ответов:

DDOS обычно блокируются на уровне сервера, верно?

На самом деле нет — большинство самых страшных DDOS-атак являются низкоуровневыми (на уровне IP-пакетов) и обрабатываются правилами маршрутизации, брандмауэрами и устройствами безопасности, разработанными для борьбы с DDOS-атаками.

Есть ли способ заблокировать его на уровне PHP или хотя бы уменьшить?

Некоторые DDOS-атаки нацелены на само приложение, отправляющее действительные URI и HTTP-запросы. Когда скорость запросов возрастает, ваши серверы начинают работать с перебоями, и у вас может возникнуть сбой в связи с соглашением об уровне обслуживания. В этом случае есть вещи, которые вы можете сделать на уровне PHP:

  • Мониторинг на уровне приложений: убедитесь, что каждая служба/страница регистрирует запросы таким образом, чтобы вы могли видеть, что происходит (чтобы вы могли предпринять действия для смягчения атаки). Некоторые идеи:

    • Имейте формат журнала, который можно легко загрузить в инструмент журнала (или Excel или аналогичный) и проанализировать с помощью инструментов командной строки (grep, sed, awk). Помните, что DDOS будет генерировать миллионы строк журнала. Вам, скорее всего, потребуется разрезать ваши журналы (особенно в отношении URI, времени, IP и пользователя), чтобы понять, что происходит, и вам нужно будет сгенерировать такие данные, как:

      • What URIs are being accessed
      • Какие URI чаще всего выходят из строя (вероятный показатель конкретных URI, которые атакуют злоумышленники)
      • Какие пользователи получают доступ к сервису
      • Со скольких IP-адресов каждый пользователь получает доступ к сервису?
      • К каким URI обращаются анонимные пользователи
      • Какие аргументы используются для данного сервиса
      • Аудит конкретных действий пользователей
    • Запишите IP-адрес каждого запроса. НЕ реверсируйте DNS — по иронии судьбы, затраты на это облегчают атаку DDOS для злоумышленников.

    • Зарегистрируйте весь URI и метод HTTP, например, «GET http://example.com/path/to/service?arg1=ddos"
    • Зарегистрируйте идентификатор пользователя, если он есть
    • Записывать важные аргументы HTTP
  • Разумные ограничения скорости: вы можете ввести ограничения на количество запросов, которые данный IP-адрес или пользователь может сделать за определенный период времени. Может ли законный клиент делать более 10 запросов в секунду? Могут ли анонимные пользователи вообще получать доступ к дорогостоящим отчетам?

  • CAPTCHA для анонимного доступа: внедрите CAPTCHA для всех анонимных запросов, чтобы убедиться, что пользователь является человеком, а не DDOS-ботом.

Какой самый быстрый и распространенный способ остановить DDOS-атаки?

Самое быстрое, наверное, поддаться на шантаж, хотя это может и нежелательно.

В противном случае первое, что вам нужно сделать, это связаться с вашим хостинг-провайдером и/или поставщиком CDN и работать с ними (если они уже не связались с вами и не спросили, что, черт возьми, происходит...). Когда происходит DDOS, это, вероятно, побочно затронет других клиентов хостинг-провайдера, и провайдер может оказаться под значительным давлением, чтобы закрыть ваш сайт просто для защиты своих ресурсов. Будьте готовы поделиться своими логами (любой и всей информацией) с провайдером; эти журналы в сочетании с их сетевыми мониторами могут предоставить достаточно информации, чтобы заблокировать/смягчить атаку.

Если вы ожидаете DDOS, очень хорошей идеей будет квалифицировать вашего хостинг-провайдера по уровню защиты, который он может предоставить. У них должен быть опыт DDOS и инструменты для его смягчения — понимать их инструменты, процессы и процедуры эскалации. Также узнайте, какую поддержку оказывает хостинг-провайдер от их вышестоящих провайдеров. Эти услуги могут означать более авансовые или ежемесячные затраты, но рассматривайте это как страховой полис.

Находясь под атакой, вам нужно будет захватить свои журналы и добыть их — попытайтесь определить схему атаки. Вам следует рассмотреть возможность отключения анонимного доступа и ограничения атакуемых сервисов (т. е. уменьшить ограничение скорости приложения для сервиса).

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


Дуг МакКлин дает отличный совет по адресу: https://stackoverflow.com/a/1029613/1395668

person Andrew Alcock    schedule 30.01.2013

Согласно PHP-части вопроса;

Хотя я не полагаюсь на PHP для этого, его можно реализовать, но необходимо учитывать все эти возможности или больше;

  1. Злоумышленник может менять IP для каждого запроса
  2. Злоумышленник может передать параметры в URI, которые целевому сайту не нужны.
  3. Злоумышленник может перезапустить сеанс до истечения срока...

Простое псевдо;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>
person K-Gun    schedule 30.01.2013

Уровень php находится слишком поздно в цепочке запросов.

Размещение вашего сервера Apache за устройством с открытым исходным кодом может быть хорошим вариантом для вас.

http://tengine.taobao.org/ содержит некоторую документацию и исходный код дополнительных модулей, направленных на предотвращение DDOS. Это расширение nginx, поэтому вы можете легко настроить его в качестве обратного прокси-сервера для вашего экземпляра apache.

См.: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ о том, как бороться с DoS-атаками.

Совсем забыл, http://www.cloudflare.com — один из лучших бесплатных брандмауэров для веб-приложений, у них есть бесплатный и платные планы и спасет вашу задницу от DDOS, мы используем его для многих наших сайтов с высоким трафиком только из-за его возможностей кэширования. Это круто!

person j_mcnally    schedule 04.02.2013

Вы не можете сделать это на уровне PHP. DDOS — это своего рода атака, которая отправляет слишком много запросов на ваш веб-сервер. Ваш веб-сервер отклонит запрос до того, как он вызовет ваш PHP-скрипт.

Если вы используете Apache, вот несколько советов от Apache: http://httpd.apache.org/docs/trunk/misc/security_tips.html

person ndlinh    schedule 29.01.2013

С DDoS лучше всего справляются очень дорогие специализированные сетевые устройства. Хосты, как правило, плохо справляются с защитой от DDoS-атак, потому что они подвержены относительно низкой производительности, исчерпанию состояния, ограниченной пропускной способности и т. д. Использование iptables, модов apache и подобных сервисов может помочь в некоторых ситуациях, если у вас нет доступа к оборудованию для защиты от DDoS-атак. или служба защиты от DDoS-атак, но она далека от идеала и по-прежнему подвергает вас риску атаки.

person ryan    schedule 29.01.2013
comment
Нам нужно решение, а если идеального решения нет, нужны частичные решения. Такой совет никому не нужен, вы просто не можете этого сделать. - person Audrius Meskauskas; 30.01.2013
comment
очень дорогие специализированные сетевые устройства? Нет, это просто неправда - person Nico Haase; 05.05.2021

Есть плагины, которые вы можете использовать в apache для ddos/dos. Хорошее начало здесь http://www.debianadmin.com/how-to-protect-apache-against-dosddos-or-brute-force-attacks.html

Если вы на LEMP, вы можете проверить здесь. http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

Это хорошие недорогие отправные точки.

person JasonG    schedule 05.02.2013

Как насчет чего-то подобного на стороне PHP:

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}
person NVG    schedule 19.02.2015
comment
В этом коде есть некоторые ошибки: 10 жестко прописано, strtotime не нужен в серверных и сеансовых переменных, а $_SESSION['ban_up'] == 1 должно быть = 1. - person Jason Silver; 27.07.2018
comment
Как насчет — хороший вопрос, так как это даже не пытается устранить DDoS-атаки. - person Nico Haase; 05.05.2021

НЕ используйте защиту на основе PHP, это ужасно и вряд ли окажет какое-либо влияние! Настройте свой веб-сервер для запросов с ограничением скорости, например, в Nginx, используя модуль limit_req (http://nginx.org/en/docs/http/ngx_http_limit_req_module.html)

Хотя я бы рекомендовал использовать CloudFlare для борьбы с атаками на уровне 4, но не на уровне 7, если вы не готовы платить.

person JustLloyd    schedule 24.04.2015
comment
да, у меня тоже отлично сработало, мой опыт здесь softwareengineeringsolutions.co.uk/ - person E Ciotti; 13.08.2018

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

Параметры конфигурации HTTP-сервера Apache, которые могут помочь предотвратить проблемы DDOS:

Директива RequestReadTimeout позволяет ограничить время, которое может потребоваться клиенту для отправки запроса.

Дайте 10 секунд на получение запроса, включая заголовки, и 30 секунд на получение тела запроса:

RequestReadTimeout header=10 body=30

Подождите не менее 10 секунд, чтобы получить тело запроса. Если клиент отправляет данные, увеличьте время ожидания на 1 секунду для каждых 1000 полученных байт без верхнего предела времени ожидания (за исключением ограничения, заданного косвенно LimitRequestBody):

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

Директива KeepAliveTimeout также может быть снижена на сайтах, подверженных DoS-атакам. Некоторые сайты даже полностью отключают поддержку активности через KeepAlive, что, конечно, имеет другие недостатки в производительности. Значения различных директив, связанных с тайм-аутом, предоставленных другими модулями, должны быть проверены.

Директивы LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine и LimitXMLRequestBody должны быть тщательно настроены, чтобы ограничить потребление ресурсов, вызванное вводом клиента. Настройте директиву MaxRequestWorkers, чтобы позволить серверу обрабатывать максимальное количество одновременных подключений без исчерпания ресурсов.

person Raja Rama Mohan Thavalam    schedule 15.08.2017

Этапы защиты от DDOS:

  • Самое первое, что важно, это сначала определить ddos-атаку. Выявление DDoS-атаки на более раннем этапе означает большую пользу для вашего сервера.
  • Получение лучшей пропускной способности для вашего сервера. Всегда держите более чем достаточную пропускную способность, необходимую для вашего сервера. Это не предотвратит DDOS-атаку, но займет больше времени. Благодаря чему вы получите дополнительное время для действий.
  • Если у вас есть собственный веб-сервер, вы можете защитить параметры сети, ограничив скорость вашего маршрутизатора, добавить фильтры для отбрасывания пакетов к различным источникам атак, более агрессивно тайм-аут полуоткрытых соединений. Также установите более низкие пороги отбрасывания SYN, ICMP и UDP.
  • Если вы не имеете большого представления об этих вещах, то быстро обратитесь к своим хостинг-провайдерам. Они могут сделать все возможное, чтобы предотвратить DDOS-атаки.
  • Существуют также специальные услуги по предотвращению DDOS, предоставляемые Cloudflare и многими другими компаниями. Благодаря чему они могут помочь вам предотвратить DDOS-атаки. Также многие компании предлагают дешевую защиту от DDoS-атак и защиту от Dos-атак.
person IamNOOB    schedule 29.11.2016