Назад |
Перейти на главную страницу
Как снизить нагрузку на серверную часть, вызванную вредоносным трафиком
Я хочу уменьшить или смягчить последствия вредоносного трафика уровня 7 (целевые атаки, стандартное злонамеренное автоматическое сканирование), который достигает моего бэкэнда, что делает его очень медленным и даже недоступным. Это касается атак на основе нагрузки, как описано в https://serverfault.com/a/531942/1816
Предположим, что:
- Я использую не очень быстрый бэкэнд / CMS (например, TTFB ~ 1500 мс для каждой динамически генерируемой страницы). Оптимизировать это невозможно или просто очень дорого с точки зрения усилий.
- Я полностью увеличил масштаб, то есть я использую максимально быстрое H / W.
- Я не могу масштабироваться, т.е. CMS не поддерживает репликацию master-to-master, поэтому она обслуживается только одним узлом.
- Я использую CDN перед серверной частью, достаточно мощный, чтобы обрабатывать любой трафик, который кэширует ответы на долгое время (например, 10 дней). Кешированные ответы (обращения) бывают быстрыми и больше не касаются моего серверного интерфейса. Промахи, очевидно, дойдут до моего бэкэнда.
- IP моего бэкэнда неизвестен злоумышленникам / ботам.
- Некоторые варианты использования, например запросы POST или зарегистрированные пользователи (небольшая часть от общего использования сайта), настроены на обход кеша CDN, поэтому они всегда попадают в серверную часть.
- Изменение чего-либо в URL таким образом, чтобы сделать его новым / уникальным для CDN (например, добавление
&_foo=1247895239
) всегда будет попадать в бэкэнд. - Злоумышленник, который сначала изучил систему, очень легко найдет очень медленные варианты использования (например, страницы с разбивкой на страницы до 10.000-го результата), которыми он сможет злоупотребить вместе со случайными параметрами # 7, чтобы поставить серверную часть на колени.
- Я не могу предсказать все известные и действительные URL-адреса и допустимые параметры моего бэкэнда в данный момент времени, чтобы каким-то образом внести запросы в белый список или очистить URL-адрес в CDN, чтобы уменьшить количество ненужных запросов, достигающих бэкэнда. например
/search?q=whatever
и /search?foo=bar&q=whatever
на 100% даст тот же результат, потому что foo=bar
это не то, что использует мой бэкэнд, но я не могу очистить его на уровне CDN. - Некоторые атаки происходят с одного IP-адреса, другие - со многих IP-адресов (например, 2000 или более), которые невозможно угадать или легко отфильтровать по диапазонам IP-адресов.
- И провайдер CDN, и провайдер серверного хоста предлагают какую-то функцию DDoS-атак, но атаки, которые могут вывести из строя мою бэкэнд, очень малы (например, всего 10 запросов в секунду) и никогда не рассматриваются как DDoS-атаки со стороны этих провайдеров.
- У меня есть мониторинг, и я мгновенно получаю уведомления, когда серверная часть подвергается стрессу, но я не хочу вручную запрещать IP-адреса, потому что это нежизнеспособно (я могу спать, работать над чем-то еще, в отпуске или атака может быть со многих разных IP-адресов).
- Я не решаюсь вводить ограничение на количество подключений в секунду для каждого IP-адреса на серверной части, поскольку в какой-то момент я откажу в доступе законным пользователям. Например, представьте себе презентацию / семинар о моем сервисе, проходящую в университете или крупной компании, где десятки или сотни браузеров почти одновременно будут использовать сервис с одного IP-адреса. Если они вошли в систему, то они всегда будут доходить до моего сервера и не будут обслуживаться CDN. Другой случай - пользователи государственного сектора, которые получают доступ к услуге с очень ограниченного количества IP-адресов (предоставленных государством). Таким образом, это откажет в доступе законным пользователям и совсем не поможет атакам со многих IP-адресов, каждый из которых выполняет только пару запросов.
- Я не хочу постоянно заносить в черный список определенные большие диапазоны IP-адресов стран, которые иногда являются источниками атак (например, Китай, Восточная Европа), потому что это несправедливо, неправильно, откажет в доступе законным пользователям из этих регионов, а атаки из других мест не будут подвержен влиянию.
Итак, что я могу сделать, чтобы справиться с этой ситуацией? Есть ли решение, которое я не учел в своих предположениях, которое могло бы помочь?
Я живу в похожей среде (я не управляю этим напрямую, но работаю с командой, которая управляет), и мы нашли два решения, которые хорошо работают вместе. В нашем случае мы размещаем приложение сами, поэтому у нас есть полный контроль над потоком трафика, но идея остается той же.
Некоторые из ваших ограничений довольно жесткие, и я бы сказал, что они противоречивы, но я думаю, что их можно обойти. Я не уверен, что такое ваш CDN, но предполагаю, что это черный ящик, который вы на самом деле не контролируете.
Я бы посоветовал настроить еще один (кэширующий) уровень перед вашим приложением для управления и изменения трафика, мы используем Varnish для этого - в основном кэширование, но также и для уменьшения вредоносного трафика. Я могу быть довольно маленьким, и мне не нужно кешировать, пока CDN, так как он должен видеть очень мало трафика.
- Очистите URI перед их настройкой на серверную часть. Обычно вы не можете сделать это в CDN, но вы можете сделать это со своим человеком на среднем сервере. Разрешить только известные URI и параметры, остальные будут отключены, введены в систему регулирования или немедленно отклонены (404, 500 ...).
- Промахи в кэше приводят к ограничению или прекращению обслуживания. В зависимости от вашего приложения даже один промах кеша в секунду (вероятно, даже меньше чем) на каждый IP-адрес клиента может указывать на вредоносный трафик, особенно если вы видите только промахи кеша из CDN. Для этого необходимо иметь некоторое представление о реальных IP-адресах конечных пользователей, и вы, вероятно, можете ограничить его, чтобы исключить зарегистрированных пользователей или заведомо хорошие диапазоны IP-адресов (которые могут иметь более слабые правила регулирования или не иметь регулирования). CloudFront добавляет заголовки X-Forwarded-For, возможно, в вашем CDN есть что-то подобное. Например, имеется 5 промахов в кэше за 15 секунд на каждый IP-адрес клиента, отклонение с ошибкой, которая не кэшируется в CDN (вероятно, 429) в течение 60 секунд. Чем больше промахов в течение более длительного периода, тем дольше будут баны. Посмотреть здесь https://github.com/varnish/varnish-modules/blob/master/docs/vmod_vsthrottle.rst
Я чувствую твою боль - но перед тобой стоит невыполнимая задача. Ты не можешь съесть свой торт и съесть его.
Обычно я предлагаю fail2ban в качестве инструмента для решения этой проблемы (если ограничение скорости веб-сервера не является вариантом), однако вы не только прямо говорите, что не можете даже поддерживать временный запрет, поскольку ваш трафик идет через CDN, вы нужно построить множество функций для сообщения адреса и применения блокировки.
У вас осталось только 2 варианта действий, которые я вижу:
1) превратить сайт в html-файлы и использовать их как статический контент.
2) найти работу в другом месте