Перейти к содержанию

Добавление правил в профиле приложений

Чтобы добавить правило, перейдите во вкладку Правила.

Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.

Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.

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

Добавление правила

Описание ветки

Описание ветки состоит из набора условий для различных параметров HTTP‑запроса, которым он должен удовлетворять, чтобы применились правила, относящиеся к данной ветке. В форме создания правила каждая строка в секции Если в запросе означает отдельное условие, состоящее из трех полей: point, тип и аргумент сравнения. Правила, описанные в ветке, применяются к запросу, только если выполнены все условия.

Для настройки набора условий вы можете использовать как конструктор URI, так и расширенную форму.

Конструктор URI

Конструктор URI позволяет задать набор условий для срабатывания правила с помощью одной строки. В строке задаются метод и адрес запроса, к которому будет применяться правило:

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

  • Адрес запроса необходимо ввести в специальное поле. Строка может иметь следующий формат:

    Формат Примеры и значения элементов запроса
    Полный URI, включая:
    • Схему (значение не учитывается, можно задать явно в расширенной форме)
    • Домен
    • Порт
    • Путь
    • Параметры URI
    https://example.com:3000/api/user.php?q=action&w=delete
    • [header, 'HOST']example.com:3000
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]php
    • [query, 'q']action
    • [query, 'w']delete
    URI с неполным набором компонентов example.com/api/user
    • [header, 'HOST']example.com
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]

    http://example.com/api/clients/user/?q=action&w=delete
    • [header, 'HOST']example.com
    • [path, 0]api
    • [path, 1]clients
    • [path, 2]
    • [action_name]user
    • [query, 'q']action
    • [query, 'w']delete

    /api/user
    • `[header, 'HOST'] — любое значение
    • [path, 0]api
    • [path, 1]
    • [action_name]user
    • [action_ext]
    URI с * для обозначения компонента с любым значением, кроме пустого example.com/*/create/*.*
    • [header, 'HOST']example.com
    • [path, 0] — любое значение, кроме пустого
    • [path, 1]create
    • [path, 2]
    • [action_name] — любое значение, кроме пустого
    • [action_ext] — любое значение, кроме пустого
    • Совпадет с example.com/api/create/user.php.
      Не совпадет с example.com/create/user.php и example.com/api/create.
    URI с ** для обозначения любого количества компонентов, в том числе отсутствия example.com/**/user
    • [header, 'HOST']example.com
    • [action_name]user
    • [action_ext]
    • Совпадет с example.com/api/create/user и example.com/api/user.
      Не совпадет с example.com/user, example.com/api/user/index.php и example.com/api/user/?w=delete.

    example.com/api/**/*.*
    • [header, 'HOST']example.com
    • [path, 0]api
    • [action_name] — любое значение, кроме пустого
    • [action_ext] — любое значение, кроме пустого
    • Совпадет с example.com/api/create/user.php и example.com/api/user/create/index.php.
      Не совпадет с example.com/api, example.com/api/user и example.com/api/create/user.php?w=delete.
    URI с регулярным выражением в качестве значения компонента (регулярное выражение необходимо указывать в {{}}) example.com/user/{{[0-9]}}
    • [header, 'HOST']example.com
    • [path, 0]user
    • [path, 1]
    • [action_name][0-9]
    • [action_ext]
    • Совпадет с example.com/user/3445.
      Не совпадет с example.com/user/3445/888 и example.com/user/3445/index.php.

Строка, введенная в конструкторе URI, автоматически преобразовывается в набор условий для следующих элементов запроса:

  • method

  • header. С помощью конструктора URI можно задать только заголовок HOST.

  • path, action_name, action_ext. Перед сохранением правила убедитесь, что значения этих элементов определены одним из следующих способов:

    • Явное значение для определенного номера path + action_name + action_ext (опционально)
    • Явное значение для action_name + action_ext (опционально)
    • Явное значение для определенного номера path без action_name и action_ext
  • query

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

Расширенная форма редактирования

Point

Поле point содержит параметр, значение которого необходимо взять для сравнения. В данный момент поддерживаются не все point'ы, которые может анализировать WAF‑нода.

  • application — ID приложения

  • proto — версия HTTP‑протокола (1.0, 1.1, 2.0, ...)

  • scheme — http или https

  • uri — часть URL запроса без адреса домена (например, /blogs/123/index.php?q=aaa для запроса, отправленного на адрес http://example.com/blogs/123/index.php?q=aaa)

  • path, action_name, action_ext — иерархическая часть URI, где:

    • path — массив с частями URI, разделенными /, кроме последней. Если URI состоит только из одной части, массив будет пустым.
    • action_name — последняя часть URL после / и до первой точки (.). Всегда присутствует в запросе, даже если значение — пустая строка.
    • action_ext — последняя часть URI после первой точки (.). Может отсутствовать в запросе.
  • query — параметры URL (параметры строки запроса)

  • header — заголовки запроса

  • method — методы запроса. Если значение не задано в явном виде, правило применяется к запросам, отправленным по любой схеме.

Тип условия EQUAL (=)

Значение point'а должно точно совпадать с аргументом сравнения. Например, с example совпадет только example.

Тип условия EQUAL для значения заголовка HOST

Чтобы правила покрывали больше запросов, мы ввели ограничение на использование типа условия EQUAL с заголовком HOST. Вместо типа EQUAL мы рекомендуем использовать IEQUAL, который допускает значения параметра в любом регистре.

Если у вас есть созданное правило с типом условия EQUAL, он будет автоматически заменен на IEQUAL.

Тип условия IEQUAL (Aa)

Значение point'а должно совпадать с аргументом сравнения в любом регистре. Например, с example совпадет example, ExAmple, exampLe и т.д.

Тип условия REGEX** (.*)

Значение point'а должно соответствовать регулярному выражению.

Синтаксис регулярных выражений

Для поиска совпадений строк с регулярными выражениями применяется библиотека PIRE, которая поддерживает стандартный синтаксис регулярных выражений с некоторыми особенностями. Синтаксис описан ниже и в README‑файле в репозитории PIRE.

Синтаксис регулярных выражений

Символы, которые не требуют экранирования:

  • Строчная латиница: a b c d e f g h i j k l m n o p q r s t u v w x y z
  • Прописная латиница: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  • Цифры: 0 1 3 4 5 6 7 8 9
  • Специальные символы: ! " # % ' , - / : ; < = > @ ] _ ` }
  • Пробелы

Символы, которые необходимо поместить в [] вместо экранирования через \:

  • . $ ^ { [ ( | ) * + ? \ & ~

Символы, которые необходимо конвертировать в ASCII по стандарту ISO‑8859:

  • Символы UTF‑8 (например, русская буква т в ASCII — т)

Группы символов:

  • . для всех символов кроме перехода на новую строку
  • () для группировки регулярных выражений, поиска совпадения со значением в (), установки приоритета условий в регулярном выражении
  • [] для одного из символов в [] (чувствительно к регистру); группа может использоваться для специфичных случаев:
    • для игнорирования регистра (например, [cC])
    • [a-z] для совпадения с любой буквой из строчной латиницы
    • [A-Z] для совпадения с любой буквой из прописной латиницы
    • [0-9] для совпадения с любой цифрой
    • [a-zA-Z0-9\.] для совпадения с любой буквой из строчной или прописной латиницы, цифрой или точкой

Логические операторы:

  • ~ для инверсии (=NOT). При этом инвертируемое выражение и логический оператор должны быть помещены в (), например: (~(a))
  • | для дизъюнкции (=OR)
  • & для конъюнкции (=AND)

Символы для обозначения границ строки:

  • ^ для начала строки
  • $ для конца строки

Квантификаторы:

  • * для 0 или более повторений предшествующего регулярного выражения
  • + для 1 или более повторений предшествующего регулярного выражения
  • ? для 0 или 1 повторения предшествующего регулярного выражения
  • {m} для m повторений предшествующего регулярного выражения
  • {m,n} для повторений предшествующего регулярного выражения от m до n раз; если n опущено, от m до бесконечности повторений

Комбинации символов, которые работают с особенностями:

  • ^.*$ эквивалентно ^.+$ (пустая строка не совпадет с ^.*$)
  • ^.?$, ^.{0,}$, ^.{0,n}$ эквивалентно ^.+$

Временно не поддерживаются:

  • Классы символов: \W для небуквенного символа, \w для буквенного символа, \D для нецифрового символа, \d для цифрового символа, \S для непробельного символа, \s для пробела

Не поддерживаются:

  • Трехзначный восьмеричный код: \NNN, \oNNN, \ONNN
  • \cN задание управляющих символов через \c (например, \cC для CTRL+C)
  • \A для начала строки
  • \z для конца строки
  • \b для границы строки (до или после пробельного символа)
  • Ленивые квантификаторы: ??, *?, +?
  • Условные конструкции

Тестирование регулярных выражений

Для проверки регулярных выражений вы можете использовать утилиту cpire на поддерживаемой версии Debian или Ubuntu:

  1. Добавьте репозиторий Валарм:

    sudo apt update
    sudo apt install dirmngr
    curl -fsSL https://repo.wallarm.com/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node stretch/3.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt install dirmngr
    curl -fsSL https://repo.wallarm.com/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node stretch/3.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node stretch-backports/3.4/' | sudo tee --append /etc/apt/sources.list.d/wallarm.list"
    # for correct Wallarm node operation, uncomment the following line in /etc/apt/sources.list`:
    # deb http://deb.debian.org/debian stretch-backports main contrib non-free
    sudo apt update
    
    sudo apt update
    sudo apt install dirmngr
    curl -fsSL https://repo.wallarm.com/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.wallarm.com/debian/wallarm-node buster/3.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    curl -fsSL https://repo.wallarm.com/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.wallarm.com/ubuntu/wallarm-node bionic/3.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
    sudo apt update
    curl -fsSL https://repo.wallarm.com/wallarm.gpg | sudo apt-key add -
    sh -c "echo 'deb http://repo.wallarm.com/ubuntu/wallarm-node focal/3.4/' | sudo tee /etc/apt/sources.list.d/wallarm.list"
    sudo apt update
    
  2. Установите утилиту cpire:

    sudo apt install libcpire-utils
    
  3. Запустите улититу cpire:

    cpire-runner -r '<YOUR_REGULAR_EXPRESSION>'
    
  4. Введите строку для проверки совпадения с регулярным выражением. Утилита вернет ответ:

    • 0, если строка совпадает с регулярным выражением
    • FAIL, если строка не совпадает с регулярным выражением
    • Сообщение об ошибке, если регулярное выражение невалидное

    Особенности обработки символа \

    Если в регулярном выражении есть символ \, экранируйте его через [] и \ (например, [\\]).

Примеры регулярных выражений, добавленных через Консоль управления Валарм

  • Для совпадения со строкой, которая содержит /.git

    /[.]git
    
  • Для совпадения со строкой, которая содержит .example.com

    [.]example[.]com
    
  • Для совпадения со строкой, которая содержит /.example.*.com

    /[.]example[.].*[.]com$
    
  • Для совпадения с любым IP‑ адресом кроме 1.2.3.4 и 5.6.7.8

    ^(~((1[.]2[.]3[.]4)|(5[.]6[.]7[.]8)))$
    
  • Для совпадения со строкой, которая заканчивается на /.example.com.php

    /[.]example[.]com[.]php$
    
  • Для совпадения со строкой, которая содержит sqlmap с буквами любого регистра: sqLmAp, SqLMap и т.д.

    [sS][qQ][lL][mM][aA][pP]
    
  • Для совпадения со строкой, которая содержит одно или несколько значений: admin\.exe, admin\.bat, admin\.sh, cmd\.exe, cmd\.bat, cmd\.sh

    (admin|cmd)[\].(exe|bat|sh)
    
  • Для совпадения со строкой, которая содержит одно или несколько значений: onmouse с буквами любого регистра, onload с буквами любого регистра, win\.ini, prompt

    [oO][nN][mM][oO][uU][sS][eE]|[oO][nN][lL][oO][aA][dD]|win[\].ini|prompt
    
  • Для совпадения со строкой, которая начинается с Mozilla, но не содержит 1aa875F49III

    ^(Mozilla(~(.*1aa875F49III.*)))$
    
  • Для совпадения со строкой, которая имеет одно из значений: python‑requests/, PostmanRuntime/, okhttp/3.14.0, node-fetch/1.0

    ^(python-requests/|PostmanRuntime/|okhttp/3.14.0|node-fetch/1.0)
    

Тип условия ABSENT ()

В запросе не должно быть указанного point'а. Аргумент сравнения в этом случае не используется.

Правило

В секции Тогда располагается описание добавляемого правила обработки запросов.

Поддерживаются следующие правила: