Правила защиты позволяют контролировать входящий трафик, фильтруя запросы к вашему ресурсу. Раньше они работали только во время атаки, а теперь действуют всегда.
Это инструмент тонкой настройки — с помощью правил можно ограничить конкретный тип вредоносного трафика или наоборот, добавить исключения, которые не будет фильтровать защита.
У правил защиты есть допустимая погрешность — единичные запросы могут не попасть под действие правила. Это необходимо, чтобы оптимизировать модуль и сделать его доступным для проектов с большим объемом трафика
Правила защиты
Правила защиты можно включать и выключать в зависимости от ситуации. Правило включает в себя
- Действие, применяемое к запросам, которые соответствуют условиям
- Условия, которые состоят из параметра запроса, значения и логического оператора. Запросы, у которых параметр (например, тип HTTP-запроса) совпадет с заданным значением (например, GET), будут соответствовать условию. Условий может не быть совсем, тогда правило будет действовать для всех запросов
- Приоритет от 0 до 65000 (чем меньше число, тем ниже приоритет)
- Название правила
Количество правил ограничено. Его можно увеличить, изменив тариф или докупив нужное количество правил в магазине
Действие
Действие определяет, что нужно делать с входящими запросом, если он попадает под действие правила (то есть если для него правдиво хотя бы одно из условий). Можно выполнить одно из трех действий:
- Блокировать (drop) — блокирует запрос
- Пропускать (pass) — пропускает запрос в обход основных фильтров, даже если он определен как подозрительный. Используйте для создания исключений. Схема фильтрации L7
- JS challenge — принудительная проверка запроса. После нее реальный пользователь сможет попасть на сайт, а бот будет заблокирован
Условия
Условие состоит из параметра (1), оператора (2) и значения параметра (3).
Каждое условие сверяет параметр запроса с его значением используя оператор. Если условие правдиво (оператор возвращает true), к запросу применяется действие.
Кнопкой AND можно добавить еще один параметр к условию. Правило сработает только если выполнены все параметры в условии (логическое И).
Кнопка Добавить условие создает новое условие. В таком случае правило сработает если выполнены все параметры хотя бы одного условия (логическое ИЛИ).
Параметры
Всего доступно 18 параметров запроса. Для каждого параметра — свой набор допустимых значений и операторов.
Полный список доступных параметров:
Название параметра | Описание | Возможные значения | Операторы |
---|---|---|---|
версия HTTP | версия протокола HTTP | HTTP/2 HTTP/1.1 HTTP/1.0 HTTP/0.9 | in |
тип HTTP-запроса | тип HTTP-запроса, который указывает, какое желаемое действие выполнится для данного ресурса | GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH | in |
адрес (URL address) | часть URI-адреса запроса | equals in contains startsWith endsWith | |
домен (Host) | HTTP-заголовок Host — содержит имя домена, для которого предназначен запрос | equals in contains startsWith endsWith | |
сжатие (Accept-Encoding) | HTTP-заголовок Accept-Encoding — указывает на алгоритм сжатия контента, который принимает клиент | equals in contains startsWith endsWith exists | |
язык (Accept-Language) | HTTP-заголовок Accept-Language — указывает на язык страницы, который принимает клиент | equals in contains startsWith endsWith exists | |
тип контента (Content-Type) | HTTP-заголовок Content-Type — указывает MIME-тип контента, который отправляет или ожидает клиент | equals in contains startsWith endsWith exists | |
источник (Origin) | HTTP-заголовок Origin — показывает откуда будет производиться загрузка. Включает протокол, имя хоста и порт | equals in contains startsWith endsWith exists | |
реферер (Referer) | HTTP-заголовок Referer — показывает откуда будет производиться загрузка. Включает протокол, имя хоста, порт и URL | equals in contains startsWith endsWith exists | |
User-Agent | HTTP-заголовок, который содержит информацию о ПО клиента и его устройстве | equals in contains startsWith endsWith exists | |
тип контента (Sec-Fetch-Dest) | fetch-заголовок Sec-Fetch-Dest — указывает тип контента, который отправляет или ожидает клиент | audio audioworklet document embed empty font frame iframe image manifest object paintworklet report script serviceworker sharedworker style track video worker xslt | in exists |
тип запроса (Sec-Fetch-Mode) | fetch-заголовок Sec-Fetch-Mode — указывает тип (mode) запроса | cors navigate no-cors same-origin websocket | in exists |
происхождение (Sec-Fetch-Site) | fetch-заголовок Sec-Fetch-Site — указывает на происхождение запроса. Позволяет определить нелегитимное перенаправление | cross-site same-origin same-site none | in exists |
сookies | куки, которые хранит пользователь (этот параметр позволяет задать название и значение куки) | equals in contains startsWith endsWith exists | |
время (GMT) | время по Гринвичу (GMT+0), в которое поступил запрос | between | |
страна | код страны (ISO 3166-1 alpha-2), из которой поступил запрос | in | |
номер AS | номер AS | in | |
IP-адрес | IP-адрес, с которого получен запрос | in |
Операторы
Оператор определяет, как соотносится параметр и его значение у каждого конкретного запроса. Если заданное условие выполнено, применяется выбранное действие.
Доступны следующие операторы:
Оператор | Отрицание | Описание |
---|---|---|
равно (equals) | не равно (not equals) | Проверяет, равен ли параметр заданному значению |
равно (in) | не равно (not in) | Проверяет, равен ли параметр одному из заданных значений (можно указать несколько значений) |
содержит (contains) | не содержит (not contains) | Проверяет, встречается ли заданное значение в строке параметра |
начинается с (startsWith) | не начинается с (not startsWith) | Проверяет, начинается ли строка параметра с заданного значения |
кончается на (endsWith) | не кончается на (not endsWith) | Проверяет, кончается ли строка параметра заданным значением |
существует (exists) | не существует (not exists) | Проверяет, указан ли параметр |
в диапазоне (between) | не в диапазоне (not between) | Проверяет, находится ли параметр в диапазоне между двумя числами |
regex | — | Регулярное выражение, которое используется для поиска подстроки или подстрок в тексте. Оно задает маску (паттерн, шаблон) из символов и метасимволов и возвращает true, если значение параметра соответствует этой маске. Использует синтаксис RE2 |
Приоритет
Для каждого правила можно установить Приоритет его срабатывания по отношению к другим правилам — число от 0 до 65000. Чем меньше значение, тем ниже приоритет. Если запрос соответствует нескольким правилам, будет использоваться правило с самым высоким приоритетом.
Не стоит создавать правила с одинаковым приоритетом: сработает только одно, выбранное случайным образом
Пример настройки правила
Когда на защиту ставится сложная инфраструктура, может возникнуть необходимость пропускать некоторые запросы, не подвергая проверке — например, автоматизированные запросы к API. Чтобы защитить такие запросы от блокировки, создадим такое правило:
Пропускать запросы к эндпоинту API (/api/and-point) с доверенного IP — 192.158.1.38
- В личном кабинете откройте услугу «Веб-защита», на вкладке Домены выберите нужный домен. В левом меню выберите Правила защиты
- Нажмите кнопку Создать правило
- Выберите действие Пропускать и назовите правило
- Добавьте условие с параметром адрес (URL address) и оператором равно (in) и укажите в значении нужный URL-адрес. Можно сохранить правило в таком виде — но атакующие могут обнаружить уязвимый адрес и устроить атаку на него. Чтобы не допустить этого, добавим дополнительное условие
- В новом условии выберите параметр IP-адрес и укажите доверенный IP, с которого будут приходить запросы к API
- Задайте высокий приоритет, чтобы созданные впоследствии правила не нарушили его работу
- Установите статус правила. Чтобы оно вступило в силу сразу после создания, выберите Включено. После нажатия кнопки Сохранить новое правило появится в списке.