Документация Запланировать пилот

Рекомендации по ограничению скорости запросов

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

Основные сценарии использования ограничения скорости следующие:

Применение детализированного контроля доступа

Ограничивать по user agent

Распространённый сценарий использования: ограничение скорости запросов от отдельных user agent. Следующее правило-пример позволяет мобильному приложению выполнять не более 100 запросов за 10 минут. Вы также можете создать отдельное правило, ограничивающее скорость для настольных браузеров.

Параметр Значение
Критерии соответствия User Agent equals MobileApp
Выражение http.user_agent eq "MobileApp"
Характеристики для подсчёта IP
Скорость (запросы / период) 100 запросов / 10 минут
Действие Managed Challenge

После того как посетитель успешно проходит Managed Challenge, Cloudflare выдаёт cf_clearance файл cookie, чтобы пометить их как проверенных. Однако злоумышленники могут попытаться повторно использовать или передать другим один и тот же действительный cf_clearance для нескольких запросов или устройств, чтобы обойти дополнительные проверки.

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

Параметр Значение
Критерии соответствия URI Path equals /checkout
Выражение http.request.uri.path eq "/checkout"
Характеристики для подсчёта Cookie (cf_clearance)
Скорость (запросы / период) 100 запросов / 10 минут
Действие Block

Разрешить конкретные IP-адреса или ASN

Ещё один сценарий использования при управлении доступом к ресурсам: исключение или включение IP-адресов или номеров автономных систем (ASN) в правило ограничения скорости.

Следующее правило-пример разрешает до 10 запросов в минуту с одного и того же IP-адреса, выполняющих GET запрос для /status, при условии что IP-адрес посетителя не включён в partner_ips Список IP-адресов.

Параметр Значение
Критерии соответствия URI Path equals /status and Request Method equals GET and IP Source Address is not in list partner_ips
Выражение http.request.uri.path eq "/status" and http.request.method eq "GET" and not ip.src in $partner_ips
Характеристики для подсчёта IP
Скорость (запросы / период) 10 запросов / 1 минута
Действие Managed Challenge

Ограничивать по referrer

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

Параметр Значение
Критерии соответствия URI Path equals /status and Request Method equals GET
Выражение http.request.uri.path eq "/status" and http.request.method eq "GET"
Характеристики для подсчёта Header (Referer) 1
Скорость (запросы / период) 100 запросов / 10 минут
Действие Block

Для этого примера правила требуется Advanced Rate Limiting.

Ограничивать по хосту назначения

SaaS-приложения или клиенты, использующие Cloudflare SSL for SaaS может иметь тысячи хостов в пределах одной зоны, из-за чего создавать отдельные правила для каждого хоста непрактично. Чтобы решить эту проблему, можно создать правило ограничения скорости, которое использует хост в качестве характеристики подсчёта.

Следующее правило-пример отслеживает частоту запросов к /login конечную точку для каждого хоста:

Параметр Значение
Критерии соответствия URI Path equals /login and Request Method equals GET
Выражение http.request.uri.path eq "/login" and http.request.method eq "GET"
Характеристики для подсчёта IP and Host
Скорость (запросы / период) 10 запросов / 10 минут
Действие Block

Для этого примера правила требуется Advanced Rate Limiting.

Защита от credential stuffing

Типичный пример использования ограничения скорости: защита конечной точки входа от таких атак, как подстановка учётных данных ↗. В следующем примере показаны три разных правила ограничения скорости с нарастающими штрафами для управления клиентами, отправляющими слишком много запросов.

Правило №1

Параметр Значение
Критерии соответствия Hostname equals example.com and URI Path equals /login and Request Method equals POST
Выражение http.host eq "example.com" and http.request.uri.path eq "/login" and http.request.method eq "POST"
Характеристики для подсчёта IP
Увеличивать счётчик, когда URI Path equals /login and Method equals POST and Response code is in (401, 403)
Выражение для подсчёта http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}
Скорость (запросы / период) 4 запроса / 1 минута
Действие Managed Challenge

Правило №2

Параметр Значение
Критерии соответствия Hostname equals example.com and URI Path equals /login and Request Method equals POST
Выражение http.host eq "example.com" and http.request.uri.path eq "/login" and http.request.method eq "POST"
Характеристики для подсчёта IP
Увеличивать счётчик, когда URI Path equals /login and Request Method equals POST and Response Status Code is in (401, 403)
Выражение для подсчёта http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}
Скорость (запросы / период) 10 запросов / 10 минут
Действие Managed Challenge

Правило №3

Параметр Значение
Критерии соответствия Host equals example.com
Выражение http.host eq "example.com"
Характеристики для подсчёта IP
Увеличивать счётчик, когда URI Path equals /login and Request Method equals POST and Response Status Code is in (401, 403)
Выражение для подсчёта http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}
Скорость (запросы / период) 20 запросов / 1 час
Действие Блокировать на 1 день

Для этих примеров правил требуется тарифный план Business или выше.

Правило №1 разрешает до четырёх запросов в минуту, после чего запускается проверка Managed Challenge. Эта конфигурация даёт легитимным клиентам несколько попыток вспомнить пароль. Если автоматизированный агент отправляет несколько запросов, такой клиент, скорее всего, будет заблокирован непройденной проверкой Managed Challenge. Если же человек получает и проходит проверку по достижении лимита скорости правила №1, правило №2 обеспечивает следующий уровень защиты, разрешая до 10 запросов в течение следующих 10 минут. К клиентам, превышающим этот второй порог, применяется правило №3 (самое строгое), которое блокирует клиента на один день.

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

Можно также использовать два отдельных выражения: выражение подсчёта и выражение правила (противодействия), чтобы определить:

  1. Запросы, используемые для расчёта скорости.
  2. Запросы, к которым фактически было применено действие.

Например, правило №3 вычисляет скорость с учётом POST запросов к /login который вернул 401 или 403 HTTP-код состояния. Однако при превышении лимита скорости Cloudflare блокирует каждый запрос к example.com хоста, сформированных с одного и того же IP-адреса. Дополнительную информацию о выражениях для подсчёта см. в Расчёт частоты запросов.

Защита конечных точек OTP и верификации

Конечные точки для одноразовых паролей (OTP) и проверки (например, /api/otp/validate или /account/verify) часто становятся целью атак методом перебора. Эти конечные точки особенно уязвимы, поскольку злоумышленники отправляют большие объёмы запросов с разными кодами, пытаясь подобрать действительный OTP.

При настройке ограничения скорости для этих конечных точек следуйте этим рекомендациям:

Следующее правило-пример защищает конечную точку проверки OTP, учитывая только неудачные попытки:

Параметр Значение
Критерии соответствия URI Path equals /api/otp/validate and Request Method equals POST
Выражение http.request.uri.path eq "/api/otp/validate" and http.request.method eq "POST"
Характеристики для подсчёта IP
Увеличивать счётчик, когда URI Path equals /api/otp/validate and Request Method equals POST and Response Status Code is in (401, 403)
Выражение для подсчёта http.request.uri.path eq "/api/otp/validate" and http.request.method eq "POST" and http.response.code in {401 403}
Скорость (запросы / период) 5 запросов / 1 минута
Действие Блокировать на 10 минут

Приведённое выше правило примера требует плана Business или выше.

Если ваша конечная точка OTP возвращает 200 для действительных и недействительных кодов (с результатом в теле ответа), вместо этого используйте подсчёт на основе запросов с более низким порогом:

Параметр Значение
Критерии соответствия URI Path equals /api/otp/validate and Request Method equals POST
Выражение http.request.uri.path eq "/api/otp/validate" and http.request.method eq "POST"
Характеристики для подсчёта IP
Скорость (запросы / период) 10 запросов / 1 минута
Действие Managed Challenge

Ограничение количества операций

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

Предотвращение скрапинга контента (через строку запроса)

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

GET https://store.com/merchant?action=lookup_price&product_id=215
Cookie: session_id=12345

Ваша служба безопасности может настроить ограничение на количество запросов цен от одного клиента, чтобы боты, которым удалось обойти Cloudflare Bot Management, не скрапили весь каталог магазина.

Правило №1

Параметр Значение
Критерии соответствия URI Path equals /merchant and URI Query String contains action=lookup_price
Выражение http.request.uri.path eq "/merchant" and http.request.uri.query contains "action=lookup_price"
Характеристики для подсчёта IP
Скорость (запросы / период) 10 запросов / 2 минуты
Действие Managed Challenge

Правило №2

Параметр Значение
Критерии соответствия URI Path equals /merchant and URI Query String contains action=lookup_price
Выражение http.request.uri.path eq "/merchant" and http.request.uri.query contains "action=lookup_price"
Характеристики для подсчёта IP
Скорость (запросы / период) 20 запросов / 5 минут
Действие Block

Эти два правила ограничения скорости соответствуют запросам, выполняющим выбранное действие (в этом примере поиск цены), и используют IP в качестве характеристики подсчёта. Аналогично предыдущий /login пример, эти два правила помогут снизить количество ложных срабатываний в случае постоянных (но легитимных) посетителей.

Чтобы ограничить поиск конкретного product_id через параметр строки запроса, вы можете добавить этот конкретный параметр запроса в качестве характеристики подсчёта, чтобы частота рассчитывалась на основе всех запросов независимо от клиента. Следующее правило-пример ограничивает количество обращений для каждого product_id до 50 запросов за 10 секунд.

Параметр Значение
Критерии соответствия URI Path equals /merchant
Выражение http.request.uri.path eq "/merchant"
Характеристики для подсчёта Запрос (product_id)
Скорость (запросы / период) 50 запросов / 10 секунд
Действие Block

Для этого примера правила требуется Advanced Rate Limiting.

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

Предотвращение скрапинга контента (через тело запроса)

Рассмотрим приложение, которое обрабатывает операцию и её параметры через тело запроса в формате JSON. Например, lookup_price операция может выглядеть следующим образом:

POST https://api.store.com/merchant
Cookie: session_id=12345

Body:
{
  "action": "lookup_price",
  "product_id": 215
}

В этом сценарии можно написать правило, ограничивающее количество действий для отдельных сессий:

Параметр Значение
Критерии соответствия URI Path equals /merchant and JSON String action равно lookup_price
Выражение http.request.uri.path eq "/merchant" and lookup_json_string(http.request.body.raw, "action") eq "lookup_price"
Характеристики для подсчёта Cookie (session_id)
Скорость (запросы / период) 10 запросов / 2 минуты
Действие Managed Challenge

Для этого примера правила требуются Advanced Rate Limiting и проверка payload.

Можно также ограничить количество поисков каждого product_id независимо от клиента, отправляющего запросы, развернув правило, подобное следующему:

Параметр Значение
Критерии соответствия URI Path equals /merchant and JSON field action равно lookup_price
Выражение http.request.uri.path eq "/merchant" and lookup_json_string(http.request.body.raw, "action") eq "lookup_price"
Характеристики для подсчёта JSON field (product_id)
Скорость (запросы / период) 50 запросов / 10 секунд
Действие Block

Для этого примера правила требуются Advanced Rate Limiting и проверка payload.

Ограничивать запросы от ботов

Общий подход к выявлению трафика от ботов заключается в ограничении скорости запросов, вызывающих большой объём 403 или 404 кодов состояния ответа исходного сервера. Обычно это указывает на автоматическую активность со стороны приложений для скрапинга.

В этой ситуации можно настроить правило, похожее на следующее:

Параметр Значение
Критерии соответствия Hostname equals example.com
Выражение http.host eq "example.com"
Характеристики для подсчёта IP
Увеличивать счётчик, когда Response Status Code is in (403, 404)
Выражение для подсчёта http.response.code in {403 404}
Скорость (запросы / период) 5 запросов / 3 минуты
Действие Managed Challenge

Для этого примера правила требуется тарифный план Business или выше.

Чтобы ограничить частоту действий, выполняемых автоматизированными источниками, рекомендуется использовать правила ограничения скорости вместе с Bot Management. С Bot Management вы можете использовать Bot Score в качестве части критериев сопоставления, чтобы применять правило только к автоматизированному или вероятно автоматизированному трафику. Например, можно использовать максимальный показатель (или пороговое значение), равный 30 для вероятно автоматизированного трафика и 10 для автоматизированного трафика.

Если ваше приложение отслеживает сессии с помощью cookie, это cookie можно использовать в качестве контекста ограничения скорости, то есть характеристики подсчёта. Если задать для характеристики ограничения скорости значение Cookie, правило будет группировать запросы с разных IP-адресов, относящиеся к одной сессии, а такая ситуация типична при распределённой атаке ботнета.

Правило №1

Параметр Значение
Критерии соответствия Bot Score меньше 30 и URI Query String содержит action=delete
Выражение cf.bot_management.score lt 30 and http.request.uri.query contains "action=delete"
Характеристики для подсчёта Cookie (session_id)
Скорость (запросы / период) 10 запросов / 1 минута
Действие Managed Challenge

Правило №2

Параметр Значение
Критерии соответствия Bot Score меньше 10 и URI Query String содержит action=delete
Выражение cf.bot_management.score lt 10 and http.request.uri.query contains "action=delete"
Характеристики для подсчёта Cookie (session_id)
Скорость (запросы / период) 20 запросов / 5 минут
Действие Block

Для этих примеров правил требуются Advanced Rate Limiting и Bot Management.

Если приложение не использует файл cookie сессии, вы можете использовать JA3 fingerprints чтобы идентифицировать отдельных клиентов. Отпечаток JA3 представляет собой уникальный идентификатор, доступный клиентам с Bot Management, который позволяет Cloudflare определять запросы, поступающие от одного и того же клиента. У каждого клиента есть связанный отпечаток, независимо от того, автоматизирован он или нет.

Параметр Значение
Критерии соответствия URI Path equals /merchant and Bot Score less than 10
Выражение http.request.uri.path eq "/merchant" and cf.bot_management.score lt 10
Характеристики для подсчёта Отпечаток JA3
Скорость (запросы / период) 10 запросов / 1 минута
Действие Managed Challenge

Для этого примера правила требуются Advanced Rate Limiting и Bot Management.

Защита REST API

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

Предотвращение объёмных атак

Advanced Rate Limiting может смягчать многие типы объёмных атак, например DDoS-атаки, mass assignment и эксфильтрацию данных.

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

Параметр Значение
Критерии соответствия URI Path equals /endpoint1 and Request Method equals POST
Выражение http.request.uri.path eq "/endpoint1" and http.request.method eq "POST"
Характеристики для подсчёта Header (x-api-key)
Скорость (запросы / период) Согласно рекомендациям API Discovery или на основе анализа предыдущего трафика.
Действие Block

Для этого примера правила требуется Advanced Rate Limiting. Для API Discovery требуется дополнительная лицензия.

Характеристикой подсчёта может быть любой заголовок, ключ, токен, файл cookie, параметр запроса или даже поле в теле JSON, поскольку некоторые API передают идентификатор сессии или ID пользователя непосредственно в теле JSON. Дополнительную информацию см. в следующих разделах:

Защита ресурсов

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

GET https://api.store.com/files/<FILE_ID>
Header: x-api-key=9375

Скорее всего, вы захотите ограничить число загрузок, чтобы избежать злоупотреблений, но не станете писать отдельное правило для каждого файла с учётом объёма хранилища данных. В этом случае можно написать, например, такое правило:

Параметр Значение
Критерии соответствия Hostname equals api.example.com and Request Method equals GET
Выражение http.host eq "api.example.com" and http.request.method eq "GET"
Характеристики для подсчёта Путь
Скорость (запросы / период) Согласно рекомендациям API Discovery или на основе анализа предыдущего трафика.
Действие Block

Для этого примера правила требуется Advanced Rate Limiting.

Правило задаёт лимит в 10 загрузок за 10 минут для каждого файла в https://api.store.com/files/*. Используя Path в качестве характеристики правила, вы избавляете себя от необходимости писать новое правило каждый раз, когда загружается новый файл с другим <FILE_ID>. В этом правиле скорость рассчитывается для каждого запроса независимо от исходного IP-адреса или идентификатора сессии.

Path можно также объединить с x-api-key заголовок (или IP-адрес, если у вас нет ключа или токена), чтобы задать максимальное число загрузок для конкретного клиента, определяемого по x-api-key, может использовать в отношении заданного файла:

Параметр Значение
Критерии соответствия Hostname equals api.store.com and Request Method equals GET
Выражение http.host eq "api.example.com" and http.request.method eq "GET"
Характеристики для подсчёта Путь и заголовок (x-api-key)
Скорость (запросы / период) Согласно рекомендациям API Discovery или на основе анализа предыдущего трафика.
Действие Block

Для этого примера правила требуется Advanced Rate Limiting.

Защита GraphQL API

Предотвращение перегрузки сервера для GraphQL API может отличаться от предотвращения перегрузки для RESTful API. Одна из главных сложностей приложений, построенных на GraphQL, заключается в том, что все запросы к серверу обрабатывает единый путь, и каждый запрос обычно представляет собой POST операцию. Это предотвращает использование разных лимитов скорости для разных сценариев использования API в зависимости от метода HTTP и пути URI.

Однако, в отличие от RESTful API, где для этого используются метод и путь, назначение запроса обычно закладывается в тело, которое содержит информацию о том, какие данные клиент хочет получить или изменить (согласно Терминология GraphQL ↗ для изменения данных на стороне сервера) вместе с любыми дополнительными данными, необходимыми для выполнения действия.

Чтобы предотвратить перегрузку сервера, рассмотрите следующие подходы:

  1. Ограничьте, сколько раз конкретный пользователь может вызывать одно и то же имя операции GraphQL.
  2. Ограничьте общую сложность запроса, которую разрешено запрашивать одному пользователю.
  3. Ограничьте сложность запроса для отдельного запроса.

Следующие примеры основаны на приложении, которое принимает отзывы о фильмах. Запрос GraphQL может выглядеть следующим образом:

POST https://moviereviews.example.com/graphql
Cookie: session_id=12345

Body:
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

Ограничьте количество операций

Чтобы ограничить частоту действий, можно использовать следующее правило:

Параметр Значение
Критерии соответствия URI Path equals /graphql and Body contains createReview
Выражение http.request.uri.path eq "/graphql" and http.request.body.raw contains "createReview"
Характеристики для подсчёта Cookie (session_id)
Скорость (запросы / период) 5 запросов / 1 час
Действие Block

Для этого примера правила требуются Advanced Rate Limiting и проверка payload.

Ограничьте общую сложность запроса

Сложность обработки GraphQL-запроса может сильно различаться. Поскольку API использует единую конечную точку, определить сложность каждого запроса до его обработки непросто.

Чтобы защитить исходный сервер от истощения ресурсов, вместо ограничения количества запросов нужно ограничивать объём сложности, необходимой для обработки одного клиента за определённый период времени. Cloudflare Rate Limiting позволяет создавать правила, которые отслеживать сложность с течением времени и блокировать последующие запросы после достижения бюджета сложности или лимита.

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

Например, следующее правило задаёт общий бюджет сложности в размере 1,000 в час:

Параметр Значение
Критерии соответствия URI Path contains /graphql
Выражение http.request.uri.path eq "/graphql"
Характеристики для подсчёта Cookie (session_id)
Оценка за период 1,000
Период 1 час
Имя заголовка ответа score
Действие Block

Для этого примера правила требуются Advanced Rate Limiting и проверка payload.

Когда исходный сервер обрабатывает запрос, он добавляет score HTTP-заголовок к ответу со значением, отражающим объем работы, выполненной источником для его обработки, например, 100. В течение следующего часа тот же клиент может отправлять запросы в пределах дополнительного бюджета 900. Как только этот бюджет будет исчерпан, последующие запросы будут блокироваться до истечения таймаута.

Ограничьте сложность отдельного запроса

Клиенты API Shield могут использовать защиту от вредоносных GraphQL-запросов, чтобы обезопасить свои GraphQL API. Эта защита анализирует GraphQL-трафик и выявляет запросы, способные перегрузить исходный сервер и привести к отказу в обслуживании. Вы можете создавать правила, ограничивающие глубину и размер входящих GraphQL-запросов, чтобы блокировать подозрительно большие или сложные запросы.

См. Документация API Shield ↗ подробнее о защите от вредоносных GraphQL-запросов.

Сноски

  1. В названии HTTP заголовка используется неправильное написание слова "referrer". ↩

Запросите бесплатный пилот

Запланировать пилот