Конфигурирование цепочек#

Механизм работы#

Механизм цепочек действий выглядит следующим образом:

  1. Каждая объявленная цепочка есть дерево действий, в общем случае независимая друг от друга.

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

  3. Цепочки гарантировано будут выполнены последовательно только в том случае, если не существует ни одного отложенного (асинхронного) действия ни в одной из них. В настоящий момент существуют определенные асинхронные действия - AntivirusFileChecker и ICAPFileChecker.

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

  5. Если результат выполнения действий не зависит друг от друга, то их не следует размещать в одной цепочке.

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

  7. Действия манипулятора с переменными могут располагаться в любом месте цепочки, однако при этом следует учитывать, что требования в п. 6 должны выполняться.

Конфигурирование цепочек#

Пример конфигурационного файла с использованием цепочек приведен в разделе.

Рассмотрим структуру и назначение элементов.

Элемент chains объявляется внутри элементов — сервисов и является корневым для всех цепочек действий. В зависимости от того, к какому объекту, request или response, применяется цепочка действий, объявляется секция request_chains или response_chains, при этом обе секции могут быть объявлены одновременно. В каждой из этих секций может быть объявлен список цепочек, каждый элемент из которых имеет следующие параметры:

Параметр

Возможные значения

Обязательность

Описание

action

Одно из перечисленных действий выше

да

Действие, которое является корневым в данной цепочке (с которого начинается обработка)

actions

Список дочерних действий, каждый элемент которого также является действием

нет

Действия, которые будут выполнены после выполнения корневого действия. Максимальный уровень вложенности в настоящий момент = 10

message

Сообщение, которое поступает на вход корневому действию. Может быть либо выражением из переменных nginx, либо использовать значения \(clj_request_body* - для тела запроса, либо *\)clj_response_body (может быть использовано только для response_chains)

нет

Обязательно для тех действий, у которых заполнен столбец «Вход» в таблице на страницах «Проверяющие действия», «Преобразователи сообщений» и «Манипуляторы с переменными». Важно! Контроль того, определен message или нет, осуществляется только в runtime — если на вход действию придет незаполненное сообщение, то будет сгенерирована ошибка

phase

Фаза обработки, одно из значений — rewrite/access

нет

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

audit

Список условий и параметров аудита событий безопасности

нет

При включении security логирования в профиле для каждого действия можно настроить события аудита. Полное описание настроке - на странице Аудит событий цепочек

И для цепочки обработки запросов, и для цепочки обработки ответов могут быть заданы дополнительные параметры.

Для request_chains в секции request_chain_properties:

Параметр

Возможные значения

Обязательность

Описание

error_state_code

HTTP-статус ответа

нет

HTTP статус ответа, который будет возвращаться в случае ошибки — по умолчанию - 500

failed_check_state_code

HTTP-статус ответа

нет

HTTP статус ответа, который будет возвращаться в случае блокировки запроса/ответа проверяющим действием, по умолчанию — 403

max_buffer_size

1; Kb; Мб

нет

Объем памяти для внутренней буферизации (служебное значение, менять не рекомендуется)

max_inmemory_size

kb/Мб

нет

Максимальный размер памяти, который одномоментно может взять из памяти любое действие — по умолчанию 1Mb

output_buffer_size

kb/Мб

нет

Размер буфера для записи в файл в случае, если размер тела превышает max_inmemory_size

input_buffer_size

kb/Мб

нет

Размер буфера для чтения тела запроса/ответа

temp_file_path

/tmp

нет

Директория для хранения временных файлов

resp_gen_rules_file

путь к файлу

нет

YAML файл правила, который описывает, как заполнять файл паттерна

resp_gen_content_type

путь к файлу

нет

Тип контента для заголовка ответа

resp_gen_pattern_file

„application/json“

нет

Файл паттерна

chains_tracing

-

нет

Последовательность параметров Параметр chains_tracing

required_action_request

-

нет

Последовательность параметров Параметр required_action_request

Для response_chains в секции response_chain_properties:

Параметр

Возможные значения

Обязательность

Описание

error_state_code

HTTP-статус ответа

нет

HTTP статус ответа, который будет возвращаться в случае ошибки — по умолчанию - 500

failed_check_state_code

HTTP-статус ответа

нет

HTTP статус ответа, который будет возвращаться в случае блокировки запроса/ответа проверяющим действием, по умолчанию — 403

max_buffer_size

1; Kb; Мб

нет

Объем памяти для внутренней буферизации (служебное значение, менять не рекомендуется)

max_inmemory_size

kb/Мб

нет

Максимальный размер памяти, который одномоментно может взять из памяти любое действие — по умолчанию 1Mb

skip_on_error_stage_before

on/off

нет

Определяет, выполнять ли цепочку действий, если цепочка на фазе запроса завершилась с ошибкой или блокировкой запроса

use_post_processor

true/false

нет

Определяет, использовать ли пост-обработку для генерации ответа

(deprecated) resp_gen_modify

on/off

нет

Включение переопределения тела ответа для ответов с backend (успешно прошедших проверку и не с ошибочным статусом)

chains_tracing

-

нет

Последовательность параметров Параметр chains_tracing

required_action_request

-

нет

Последовательность параметров Параметр required_action_request

Переменные#

Полный список переменных, используемых в цепочках действий, приведен в разделе Переменные цепочек действий.

  1. Для получения информации о результате выполнения цепочек определены следующие переменные:

Переменная

Описание

Возможные значения

clj_request_chain_result

Результат выполнения цепочки действий над запросом

complete — выполнено без ошибок; deny — заблокировано; error — ошибка

clj_error_action

Действие, вызвавшее блокировку/ошибку (начиная с версии 2.2)

—

clj_processing_phase

Фаза выполнения цепочки

request, response

clj_response_chain_result

Результат выполнения цепочки действий над ответом

complete — выполнено без ошибок; deny — заблокировано; error — ошибка

  1. При описании цепочек, если предполагается заполнять какие-либо переменные, отличные от встроенных, то необходимо объявлять их либо с префиксом clj_ либо объявлять их в конфигурации с использованием директивы set_variable в секции optional сервиса.

  2. Переменные для доступа к содержимому данных запроса/ответа:

Переменная

Описание

clj_message_mime_type

MIME-тип текущего сообщения

clj_request_body

Тело запроса

clj_response_body

Тело ответа

Конфигурирование действий#

Рассмотрим определение действия:

- action: AnyAction
    conditions:
      {список условий}
    params:
      {список параметров}
    {actions:}

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

Каждое условие состоит из трех элементов:

  • var — переменная или выражение из переменных

  • val — значение с которым будет сравниваться значение var. В качестве val может использоваться:

    • константа;

    • переменная, их сочетания или сочетания с константами;

    • данные из файла.

  • operator — операция сравнения, одно из значений:

    • «=» — равенство (при сравнении строк используется посимвольное сравнение);

    • «>» — больше, для числовых значений;

    • «<» — меньше, для числовых значений;

    • «>=» — больше или равно, для числовых значений;

    • «<=» — меньше или равно, для числовых значений;

    • «in» — вхождение в перечисление;

    • «not_in» — отсутствие вхождения;

    • «!=» — неравенство значений;

    • «~» — регулярное выражение с учетом регистра символов;

    • «~*» — регулярное выражение без учета регистра символов;

    • «!~» — негативное регулярное выражение с учетом регистра символов;

    • «!~*» — негативное регулярное выражение без учета регистра символов.