1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/miracleqi-openwaf_rule_engine

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README_CN.md 46 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 06:33 4d91a2c

OpenWAF Rule Engine — это правиловый движок OPENWAF.

Содержание

  1. Name.
  2. Version.
  3. Synopsis.
  4. Description.
  5. Community.
  6. Bugs and Patches.
  7. Changes.
  8. Modules Configuration Directives.
  9. Rule Directives.
  10. Variables.
  11. Transformation Functions.
  12. Operators.
  13. Others.

Версия

Этот документ описывает OpenWAF Rule Engine v0.0.1.161026_beta, выпущенный 26 октября 2016 года.

Синопсис

[Вернуться к TOC]

Описание

Идея этого движка правил пришла из ModSecurity и freewaf (lua-resty-waf). Он реализует механизм правил ModSecurity с использованием Lua. На основе этого движка можно проводить проверку на соответствие протоколам, использовать автоматические инструменты, обнаруживать атаки внедрения, межсайтовые атаки, утечку информации, аномальные запросы и другие меры безопасности. Поддерживается динамическое добавление правил, своевременное исправление уязвимостей.

[Вернуться к TOC]

Сообщество

Список рассылки на английском языке

Для англоговорящих существует список рассылки OpenWAF-en.

Список рассылки на китайском языке

Существует список рассылки на китайском языке для OpenWAF-cn.

Личный адрес QQ

290557551@qq.com

[Вернуться к TOC]

Ошибки и патчи

Пожалуйста, сообщайте об ошибках, пожеланиях или патчах, создавая тикет в системе отслеживания ошибок GitHub или публикуя сообщения в сообществе TWAF.

[Вернуться к TOC]

Изменения

[Вернуться к TOC]

Директивы конфигурации модулей

    "twaf_secrules":{
        "state": true,                                              -- общий переключатель
        "reqbody_state": true,                                      -- переключатель проверки тела запроса
        "header_filter_state": true,                                -- переключатель фильтрации заголовков ответов
        "body_filter_state": true,                                  -- переключатель фильтрации тел ответов
        "system_rules_state": true,                                 -- переключатель проверки системных правил
        "reqbody_limit":134217728,                                  -- предел размера тела запроса, больше которого проверка не производится
        "respbody_limit":524288,                                    -- предел размера тела ответа, больше которого проверка не производится
        "pre_path": "/opt/OpenWAF/",                                -- путь установки OpenWAF
        "path": "lib/twaf/inc/knowledge_db/twrules",                -- путь к базе знаний правил в OpenWAF
        "user_defined_rules":[ ],                                   -- пользовательские правила, массив
        "rules_id":{                                                -- исключение признаков
            "111112": [{"REMOTE_HOST":"a.com", "URI":"^/ab"}],      -- если информация совпадает с массивом, соответствующее правило становится недействительным, ключ массива - имя переменной, значение поддерживает регулярные выражения
            "111113": {},                                           -- признак не исключён
            "111114": [{}]                                          -- признак исключён без условий
        }
    }

state

Синтаксис: state true|false

По умолчанию: true

Контекст: twaf_secrules

Общий переключатель правил.

reqbody_state

Синтаксис: reqbody_state true|false

По умолчанию: true

Контекст: twaf_secrules

Переключатель проверки тела запроса.

header_filter_state

Синтаксис: header_filter_state true|false

По умолчанию: true

Контекст: twaf_secrules

Переключатель фильтрации заголовков ответов.

body_filter_state

Синтаксис: body_filter_state true|false

По умолчанию: false

Контекст: twaf_secrules

Переключатель фильтрации тел ответов, по умолчанию выключен, при включении требуется добавить сторонний модуль [ngx_http_twaf_header_sent_filter_module пока не открыт].

system_rules_state

Синтаксис: system_rules_state true|false

По умолчанию: true

Контекст: twaf_secrules

Переключатель проверки системных правил.

Правила в каталоге lib/twaf/inc/knowledge_db/twrules являются системными правилами. Помимо системных правил, есть также пользовательские правила в модуле twaf_secrules user_defined_rules. Системные правила редко меняются, а пользовательские правила добавляются и удаляются в зависимости от бизнеса, например, динамическая конфигурация кеша, сжатия, контроля времени и белых и чёрных списков.

reqbody_limit

Синтаксис: reqbody_limit number

По умолчанию: 134217728

Контекст: twaf_secrules

Предел размера тела запроса, проверка не выполняется, если размер тела запроса превышает установленный предел. reqbody_limit

Значение reqbody_limit должно быть меньше значения client_body_buffer_size в nginx для того, чтобы оно вступило в силу.

respbody_limit

Синтаксис: respbody_limit число.
По умолчанию: 134217728 (128 МБ).
Контекст: twaf_secrules.

Максимальный размер тела ответа. По умолчанию равен 134 217 728 Б (128 Мб). Если размер тела ответа превышает установленное значение, то проверка не производится.

pre_path

Синтаксис: pre_path строка.
По умолчанию: /opt/OpenWAF/.
Контекст: twaf_secrules.

Путь установки OpenWAF.

path

Синтаксис: path строка.
По умолчанию: lib/twaf/inc/knowledge_db/twrules.
Контекст: twaf_secrules.

Путь к базе данных с правилами в OpenWAF.

user_defined_rules

Синтаксис: user_defined_rules <массив>.
По умолчанию: [].
Контекст: twaf_secrules.

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

Пользовательские правила действуют в рамках конкретной стратегии и используются для изменения правил, таких как временное управление временем или изменение заголовков ответов.

"user_defined_rules":[
    {
        "id": "1000001",
        "release_version": "858",
        "charactor_version": "001",
        "disable": false,
        "opts": {
            "nolog": false
        },
        "phase": "access",
        "action": "deny",
        "meta": 403,
        "severity": "high",
        "rule_name": "relative time",
        "desc": "С понедельника по пятницу с 8:00 до 18:00 запрещено посещение каталога /test",
        "match": [{
            "vars": [{
                "var": "URI"
            }],
            "operator": "begins_with",
            "pattern": "/test"
        },
        {
            "vars": [{
                "var": "TIME_WDAY"
            }],
            "operator": "equal",
            "pattern": ["1", "2", "3", "4", "5"]
        },
        {
            "vars": [{
                "var": "TIME"
            }],
            "operator": "str_range",
            "pattern": ["08:00:00-18:00:00"]
        }]
    },
    {
        "id": "1000002",
        "release_version": "858",
        "charactor_version": "001",
        "disable": false,
        "opts": {
            "nolog": false
        },
        "phase": "access",
        "action": "deny",
        "meta": 403,
        "severity": "high",
        "rule_name": "iputil",
        "desc": "Для IP-адресов из указанного диапазона доступ запрещён",
        "match": [{
            "vars": [{
               "var": "REMOTE_ADDR"
            }],
            "operator": "ip_utils",
            "pattern": ["1.1.1.0/24","2.2.2.2-2.2.20.2"]
        }]
    }
]

rules_id

Синтаксис: rules_id таблица.
По умолчанию: нет.
Контекст: twaf_secrules.

Используется для исключения признаков.

Вернуться к TOC

Директивы правил

-- формат lua
    {
        id = "xxxxxx",                             -- ID-метка (уникальная), тип string
        release_version = "858",                   -- версия библиотеки признаков, тип string
        charactor_version = "001",                 -- версия правил признаков, тип string
        severity = "low",                          -- уровень серьёзности, в OPENWAF используется "low", "medium","high" и т. д., тип string
        rule_name = "test",                        -- название признака, тип string
        disable = false,                           -- отключить это правило, тип boolean
        opts = {                                   -- остальные действия
            nolog = false,                         -- не записывать журнал, true или false, по умолчанию false
            add_resp_headers = {                   -- настраиваемые заголовки ответов
                key_xxx = "value_xxx"              -- имя заголовка ответа = значение заголовка ответа
            }
            setvar = {{                            -- установить переменные, массив
                column = "test",                   -- ключ первого уровня переменной, например: TX, session и т.д., тип string
                key = "test",                      -- ключ второго уровня переменной, например: score, id и т. д., тип string
                incr = true,                       -- аналогично действию modsec +=, true or false, по умолчанию false
                value = 5,                         -- значение переменной, тип number
                time = 3000                        -- время ожидания (мс), тип number
            }}
        },
        phase = "test",                            -- этап выполнения («доступ», «фильтр заголовка», «фильтр тела»), поддерживает массивы и строки
        action = "test",                           -- действие, ALLOW, DENY и т. д., тип string
        desc = "test",                             -- описание
        tags = {"test1", "test2"},                 -- метки
        match = {                                  -- массив, отношения между match — «и», аналогично функции chain в действии modsecurity,
            {

*Примечание: в запросе присутствуют фрагменты кода на языке JSON, однако они не были переведены.* Переменные:
* ARGS;
* ARGS_COMBINED_SIZE;
* ARGS_GET;
* ARGS_GET_NAMES;
* ARGS_NAMES;
* ARGS_POST;
* ARGS_POST_NAMES;
* BYTES_IN;
* CONNECTION_REQUESTS;
* DURATION;
* FILES;
* FILES_NAMES;
* GEO;
* GEO_CODE3;
* GEO_ID;
* GEO_CONTINENT;
* GEO_NAME;
* GZIP_RATIO;
* HTTP_COOKIE;
* HTTP_HOST;
* HTTP_REFERER;
* HTTP_USER_AGENT;
* IP_VERSION;
* MATCHED_VAR;
* MATCHED_VARS;
* MATCHED_VAR_NAME;
* MATCHED_VARS_NAMES;
* ORIGINAL_DST_ADDR;
* ORIGINAL_DST_PORT;
* POLICYID;
* QUERY_STRING;
* RAW_HEADER;
* RAW_HEADER_TRUE;
* REMOTE_ADDR;
* REMOTE_HOST;
* REMOTE_PORT;
* REMOTE_USER;
* REQUEST_BASENAME;
* REQUEST_BODY;
* REQUEST_COOKIES;
* REQUEST_COOKIES_NAMES;
* REQUEST_FILENAME;
* REQUEST_HEADERS. **REQUEST_HEADERS_NAMES**
* REQUEST_LINE
* REQUEST_METHOD
* REQUEST_PROTOCOL
* HTTP_VERSION
* URI
* URL
* REQUEST_URI
* RESPONSE_BODY
* RESPONSE_HEADERS
* RESPONSE_STATUS
* SCHEME
* SERVER_ADDR
* SERVER_NAME
* SERVER_PORT
* SESSION
* SESSION_DATA
* TIME
* TIME_DAY
* TIME_EPOCH
* TIME_HOUR
* TIME_MIN
* TIME_MON
* TIME_SEC
* TIME_WDAY
* TIME_YEAR
* TIME_LOCAL
* TX
* UNIQUE_ID
* UPSTREAM_CACHE_STATUS
* USERID

**Back to Var**

**Back to TOC**

## ARGS

Таблица типа, все параметры запроса, включая ARGS_GET и ARGS_POST.

Например: POST http://www.baidu.com?name=miracle&age=5

Тело запроса: time=123456&day=365.

Значение переменной ARGS: {"name": "miracle", "age": "5", "time": "123456", "day": "365"}.

**Back to Var**

**Back to TOC**

## ARGS_COMBINED_SIZE

Числовой тип, общая длина параметров запроса, включает только длину ключа и значения, без учёта символов «&» или «=».

Например: GET http://www.baidu.com?name=miracle&age=5.

Значение переменной ARGS_COMBINED_SIZE: 15, а не 18.

**Back to Var**

**Back to TOC**

## ARGS_GET

Таблица типа, параметры строки запроса.

Например: GET http://www.baidu.com?name=miracle&age=5.

Значение переменной ARGS_GET: {"name": "miracle", "age": "5"}.

**Back to Var**

**Back to TOC**

## ARGS_GET_NAMES

Таблица типа, значения ключей параметров строки запроса.

Например: GET http://www.baidu.com?name=miracle&age=5.

Значение переменной ARGS_GET_NAMES: ["name", "age"].

**Back to Var**

**Back to TOC**

## ARGS_NAMES

Таблица типа, значения ключей параметров строки запроса и параметров POST.

Например: POST http://www.baidu.com?name=miracle&age=5.

Тело запроса: time=123456&day=365.

Значение переменной ARGS_NAMES: ["name", "age", "time", "day"].

**Back to Var**

**Back to TOC**

## ARGS_POST

Таблица типа, параметры POST.

Например:

POST http://www.baidu.com/login.html.

Тело запроса: time=123456&day=365.

Значение переменной ARGS_POST: {"time": "123456", "day": "365"}.

**Back to Var**

**Back to TOC**

## ARGS_POST_NAMES

Таблица типа, значения ключей параметров POST.

Например:

POST http://www.baidu.com/login.html.

Тело запроса: time=123456&day=365.

Значение переменной ARGS_POST_NAMES: ["time", "day"].

**Back to Var**

**Back to TOC**

## BYTES_IN

Числовой тип, количество принятых байтов информации.

**Back to Var**

**Back to TOC**

## CONNECTION_REQUESTS

Числовой тип, текущее количество запросов в соединении.

**Back to Var**

**Back to TOC**

## DURATION

Строковый тип, время обработки транзакции, единица измерения — секунды (s).

**Back to Var**

**Back to TOC**

## FILES

Таблица типа, исходные имена файлов, полученные из тела запроса (с расширениями файлов).

**Back to Var**

**Back to TOC**

## FILES_NAMES

Таблица типа, имена файлов для загрузки (без расширений файлов).

**Back to Var**

**Back to TOC**

## GEO

Таблица типа, содержит информацию о полях code3, code, id, continent, name и других.

**Back to Var**

**Back to TOC**

## GEO_CODE3

Строка типа, трёхбуквенное сокращение страны.

**Back to Var**

**Back to TOC**

## GEO_CODE

Строка типа, двухбуквенное сокращение страны.

**Back to Var**

**Back to TOC**

## GEO_ID

Числовой тип, идентификатор страны.

**Back to Var**

**Back to TOC**

## GEO_CONTINENT

Строка типа, континент, на котором находится страна.

**Back to Var**

**Back to TOC**

## GEO_NAME

Строка типа, полное название страны.

**Back to Var**

**Back to TOC**

## GZIP_RATIO

Строка типа, коэффициент сжатия.

**Back to Var**

**Back to TOC**

## HTTP_COOKIE

Строка типа, поле cookie в запросе.

**Back to Var**

**Back to TOC**

## HTTP_HOST

Строка типа, значение поля host в запросе, доменное имя: порт (по умолчанию 80).

**Back to Var**

**Back to TOC**

## HTTP_REFERER

Строка типа, поле referer в запросе.

**Back to Var**

**Back to TOC**

## HTTP_USER_AGENT

Строка типа, поле user-agent в запросе. **SERVER_PORT**

число, серверный порт.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**SESSION**

таблица, переменная, предоставляемая сторонним модулем lua-resty-session.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**SESSION_DATA**

таблица, информация о сессии, предоставляемая сторонним модулем lua-resty-session.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME**

строка, формат: hour:minute:second.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_DAY**

число, день (1–31).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_EPOCH**

число, временная метка, количество секунд с 1970 года.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_HOUR**

число, час (0–23).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_MIN**

число, минута (0–59).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_MON**

число, месяц (1–12).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_SEC**

число, секунда (0–59).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_WDAY**

число, неделя (0–6).

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_YEAR**

число, год, четырёхзначное число, например: 1997.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TIME_LOCAL**

строка, текущее время, например: 26/Aug/2016:01:32:16 -0400.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**TX**

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

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**UNIQUE_ID**

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

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**UPSTREAM_CACHE_STATUS**

хранит статус доступа к кэшу ответов (0.8.3). Статус может быть «MISS», «BYPASS», «EXPIRED», «STALE», «UPDATING», «REVALIDATED» или «HIT».

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

**USERID**

строка, полученный из правил доступа идентификатор.

[Back to Var](#variables)

[Back to TOC](#table-of-contents)

Transformation Functions
========================
* [base64_decode](#base64_decode)
* [sql_hex_decode](#sql_hex_decode)
* [base64_encode](#base64_encode)
* [counter](#counter)
* [compress_whitespace](#compress_whitespace)
* [hex_decode](#hex_decode)
* [hex_encode](#hex_encode)
* [html_decode](#html_decode)
* [length](#length)
* [lowercase](#lowercase)
* [md5](#md5)
* [normalise_path](#normalise_path)
* [remove_nulls](#remove_nulls)
* [remove_whitespace](#remove_whitespace)
* [replace_comments](#replace_comments)
* [remove_comments_char](#remove_comments_char)
* [remove_comments](#remove_comments)
* [uri_decode](#uri_decode)
* [uri_encode](#uri_encode)
* [sha1](#sha1)
* [trim_left](#trim_left)
* [trim_right](#trim_right)
* [trim](#trim)

[Back to TFF](#transformation-functions)

[Back to TOC](#table-of-contents)

## base64_decode

Декодирует строку, закодированную в Base64.

Примечание: обратите внимание на порядок выполнения transform.

Например:
{
   "id": "xxxx",
   ...
   "transform": ["base64_decode", "lowercase"],
   ...
}
Сначала выполняется декодирование Base64, затем строчные буквы, если поменять порядок, это повлияет на результат.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-contents)

## sql_hex_decode

Расшифровывает данные SQL hex.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-contents)

## base64_encode

Кодирует входную строку с помощью кодировки Base64.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-contents)

## counter

Счётчик, аналогичный символу '&' в modsecurity.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-contents)

## compress_whitespace

Преобразует все символы пробела (0x20, \f, \t, \n, \r, \v, 0xa0) в пробелы (ASCII 0x20), сжимая несколько последовательных пробелов в один.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-content)

## hex_decode

Декодирует строку, которая была закодирована тем же алгоритмом, что и hexEncode.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-content)

## hex_encode

Заменяет каждый входной байт двумя шестнадцатеричными символами.

[Назад к TFF](#transformation-functions)

[Вернуться к TOC](#table-of-content)

## html_decode ##

Декодирует... **length** — ищет длину входной строки в байтах.

**lowercase** — преобразует все символы в строчные.

**md5** — вычисляет хеш MD5 на основе данных во входных данных. Вычисленный хеш находится в необработанной двоичной форме, и его необходимо закодировать в текст для печати (или регистрации). Функции хеширования обычно используются в сочетании с hex_encode (например: «transform»: [«md5», «hex_encode»).

**normalise_path** — удаляет множественные косые черты, ссылки на каталог самого себя и обратные ссылки на каталоги (кроме случаев, когда они находятся в начале ввода) из входной строки.

**remove_nulls** — удаляет все нулевые байты из входных данных.

**remove_whitespace** — удаляет все пробельные символы из входных данных, включая горизонтальные («\t»), вертикальные («\v») и другие («\r», «\n», «\f»).

**replace_comments** — заменяет содержимое комментариев /*...*/ одним пробелом.

**remove_comments_char** — удаляет распространённые символы комментариев (/*, */, --, #).

**remove_comments** — удаляет содержимое комментариев /*...*/.

**uri_decode** — отменяет экранирование str как экранированного компонента URI. Пример: «b%20r56+7» после преобразования uri_decode становится b r56 7.

**uri_encode** — экранирует str как компонент URI.

**sha1** — вычисляет хэш SHA1 на основе входной строки. Вычисленный хэш находится в необработанной двоичной форме, и его необходимо закодировать в текст для печати (или регистрации). Функции хеширования обычно используются в сочетании с hex_encode (например, «transform»: ["sha1", "hex_encode"]).

**trim_left** — удаляет пробелы с левой стороны входной строки.

**trim_right** — удаляет пробелы с правой стороны входной строки.

**trim** — удаляет пробелы с обеих сторон входной строки.

Операторы:
* **begins_with** — возвращает true, если строка параметров найдена в начале входных данных.
* **contains** — возвращает true, если строка параметров найдена где-либо во входных данных. Если оператор равен contains, а pattern равен массиву, это эквивалентно pm в modsecurity. Однако OpenWAF не игнорирует регистр, в отличие от modsecurity. Пример: {«id»: «xxx», ... «operator»: «contains», «pattern»: [«abc», «def»], ...}.
* **contains_word** — возвращает true, если входная строка (с границами слов) найдена где-либо в входных данных.
* **detect_sqli** — этот оператор...

К сожалению, не удалось перевести часть текста, так как он содержит специальные символы или непечатаемые символы. **detect_xss**

Этот оператор использует LibInjection для обнаружения атак XSS.

**ends_with**
Возвращает истину, если строка параметра найдена в конце ввода.

**equal**
Выполняет сравнение строк и возвращает истину, если строка параметров идентична строке ввода. 

Эквивалентно modsecurity eq и streq.
Например:

{ "id": "xxx", ... "operator": "equal", "pattern": [12345, "html", "23456"] ... }


**greater_eq**
Выполняет численное сравнение и возвращает истину, если значение ввода больше или равно предоставленному параметру.
Возвращает ложь, если предоставляется значение, которое не может быть преобразовано в число.

**greater**
Выполняет численное сравнение и возвращает истину, если значение ввода больше, чем параметр оператора.
Возвращает ложь, если предоставляется значение, которое не может быть преобразовано в число.

**ip_utils**
Быстро выполняет сопоставление IPv4 или IPv6 данных переменной REMOTE_ADDR. Может обрабатывать следующие форматы:
* Полный адрес IPv4: 192.168.1.100;
* Сетевой блок/адрес CIDR: 192.168.1.0/24;
* Регион IPv4-адреса: 1.1.1.1–2.2.2.2.

ip_utils с pf эквивалентен modsecurity ipMatchF и ipMatchFromFile.
Например:
Правило выглядит следующим образом:

{ "id": "xxxx", ... "operator": "ip_utils", "pf": "/tmp/ip_blacklist.txt", ... } "/tmp/ip_blacklist.txt" содержимое файла следующее: 192.168.1.100 192.168.1.0/24 1.1.1.1-2.2.2.2


**less_eq**
Выполняет численное сравнение и возвращает истину, если значение ввода меньше или равно параметру оператора.
Возвращает ложь, если предоставляется значение, которое не может быть преобразовано в число.

**less**
Выполняет численное сравнение и возвращает истину, если значение ввода меньше параметра оператора.
Возвращает ложь, если предоставляется значение, которое не может быть преобразовано в число.

**pf**
pattern — это параметр операции operator.
pf указывает на pattern from file, и они взаимно исключают друг друга (они не могут появляться одновременно), в настоящее время поддерживается только абсолютный путь.
pf с contains эквивалентен modsecurity pmf или pmFromFile.
pf с ip_utils эквивалентен modsecurity ipMatchF или ipMatchFromFile.

**regex**
Выполняет сопоставление регулярного выражения с шаблоном, предоставленным в качестве параметра.
regex также имеет функцию захвата modsecurity.
Описание modsecurity capture выглядит следующим образом: при использовании вместе с оператором регулярного выражения (@rx) действие захвата создаст копии захватов регулярного выражения и поместит их в коллекцию переменных транзакций.
В OpenWAF нет инструкции capture, но используется regex по умолчанию с включенной функцией захвата. **op_negated**: true
        }
    ]
}

[Вернуться к OPERATORS](#operators)

[Вернуться к TOC](#table-of-contents)

## str_match

Эквивалентно contains.

[Вернуться к OPERATORS](#operators)

[Вернуться к TOC](#table-of-contents)

## validate_url_encoding

Проверяет наличие URL-кодированных символов в предоставленной входной строке.

[Вернуться к OPERATORS](#operators)

[Вернуться к TOC](#table-of-contents)

## num_range

Определяет, находится ли значение в числовом диапазоне.

Он работает вместе с transform «length», что аналогично функции modsecurity «validateByteRange».

{ "id": "xxx", ... "operator": "num_range", "pattern": [10, "13", "32-126"], "transform": "length", ... }


[Вернуться к OPERATORS](#operators)

[Вернуться к TOC](#table-of-contents)

## str_range

Определяет, содержится ли строка в заданном диапазоне строк.

Например, для проверки временного интервала:

{ "id": "xxx", ... "operator": "str_range", "pattern": ["01:42:00-04:32:00"], ... }


[Вернуться к OPERATORS](#operators)

[Вернуться к TOC](#table-of-contents)


Others
======

* [allow](#allow)
* [deny](#deny)
* [id](#id)
* [nolog](#nolog)
* [op_negated](#op_negated)
* [parse](#parse)
* [pass](#pass)
* [phase](#phase)
* [proxy_cache](#proxy_cache)
* [redirect](#redirect)
* [charactor_version](#charactor_version)
* [severity](#severity)
* [setvar](#setvar)
* [meta](#meta)
* [transform](#transform)
* [tag](#tag)
* [release_version](#release_version)
* [robot](#robot)
* [add_resp_headers](#add_resp_headers)


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-contents)

## allow

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

"action": "allow"


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## deny

Останавливает обработку правила и прерывает транзакцию.

"action": "deny", "meta": 403


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## id

Останавливает обработку правила и прерывает транзакцию.

"id": "xxxxxxx"


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## nolog

Не регистрирует журнал.

"opts": { "nolog": true }


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## op_negated

Инвертирует результат оператора.

"match": [{ "vars": [{ "var": "HTTP_USER_AGENT" }], "transform": "length", "operator": "less_eq", "pattern": 50, "op_negated": true }]

Равнозначно:

"match": [{ "vars": [{ "var": "HTTP_USER_AGENT" }], "transform": "length", "operator": "greater", "pattern": 50 }]

Если длина заголовка запроса user_agent больше 50, то правило совпадает.


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## parse

Выполняет дополнительный анализ переменной.

Если запрос GET http://www.baidu.com?name=miracle&age=5, то:

"match": [{ "vars": [{ "var": "ARGS_GET" }], ... }] Полученное значение: {"name": "miracle", "age": "5"}

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "specific": "name" } }] }] Полученное значение: ["miracle"]

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "specific": ["name", "age"] } }] }] Полученное значение: ["miracle", "5"]

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "ignore": "name" } }] }] Полученное значение: {"age": "5"}

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "ignore": ["name", "age"] } }] }] Полученное значение: []

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "keys": true } }] }] Полученное значение: ["name", "age"]

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "values": true } }] }] Полученное значение: ["miracle", "5"]

"match": [{ "vars": [{ "var": "ARGS_GET", "parse": { "all": true } }] }] Полученное значение: ["name", "age", "miracle", "5"]


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## pass

Продолжает обработку со следующим правилом, несмотря на успешное совпадение.

"action": "pass"


[Вернуться к OTHERS](#others)

[Вернуться к TOC](#table-of-content)

## phase

Этап выполнения правила, может принимать значения «access», «header_filter», «body_filter» или их комбинацию.

{ "id": "xxx_01", "phase": "access", ... } Правило «xxx_01» выполняется на этапе access.

{ "id": "xxx_02", "phase":


...

Выполняется правило xxx_02 на этапе доступа и на этапе header_filter один раз.

**Прокси-кэш**

{ ... phase = "header_filter", -- 缓存开关需在header_filter阶段配置 action = "pass", -- 无需拦截请求 opts = { nolog = true, -- 不需记录日志 proxy_cache = { state = true|false, -- 缓存开关 expired = 600 -- 缓存时长(单位秒),默认600秒 } } ... }

Если state равно true и полученное состояние кэша — «MISS» или «EXPIRED», то содержимое ответа будет помещено в кэш, и будет установлен срок действия кэша. Если state равно false, то соответствующий элемент кэша (включая файл кэша) будет очищен.

Например:

# В конфигурации nginx.conf есть следующие настройки proxy cache:
http {
    proxy_cache_path  /opt/cache/OpenWAF-proxy levels=2:2 keys_zone=twaf_cache:101m max_size=100m use_temp_path=off;
    proxy_cache_key $host$uri;
    proxy_cache twaf_cache;
    proxy_ignore_headers X-Accel-Expires Cache-Control Set-Cookie;
    proxy_no_cache $twaf_cache_flag;

    server {
        set $twaf_cache_flag 1;         #по умолчанию не кэшируется
    }
}

# Конфигурация в формате Lua:
{ 
    id = "test_x01",                      -- id уникален во всём мире
    opts = {
        nolog = true,
        proxy_cache = {
            state = true,
            expired = 300
        }
    },
    phase = "header_filter", 
    action = "pass",
    match = {{
        vars = {{
            var = "URI"
        },{
            var = "REQUEST_HEADERS",
            parse = {
                specific = "Referer"
            }
        }},
        operator = "equal",
        pattern = {"/xampp/", "%{SCHEME}://%{HTTP_HOST}/xampp/"},
        parse_pattern = true
    }}
}
Это правило будет кэшировать страницы с URI, равным '/xampp/', со сроком обновления 300 секунд.

Если условие соответствия в match основано на коде ответа, это эквивалентно инструкции proxy_cache_valid в Nginx. Если условие соответствия основано на методе запроса, это эквивалентно инструкции proxy_cache_methods в Nginx. Если условием соответствия является тип ресурса, это эквивалентно инструкции proxy_cache_content_type в Nginx (это официальная инструкция, которая была расширена путём модификации исходного кода Nginx от Miracle Qi).

PS: Инструкция proxy_cache_content_type является официальной инструкцией и представляет собой расширение функций Nginx, добавленное путём модификации исходного кода от Miracle Qi.

**Перенаправление**

"action": "redirect",
"meta": "/index.html"

**Версия символа**

Указывает версию этого правила, аналогично функции rev в ModSecurity.

"charactor_version": "001"

**Серьёзность**

Присваивает правилу уровень серьёзности, который используется в OWASP ModSecurity Core Rule Set (CRS):

EMERGENCY: генерируется при корреляции данных оценки аномалий, когда есть входящая атака и исходящая утечка.
ALERT: генерируется при корреляции, когда есть входящая атака и исходящая ошибка приложения.
CRITICAL: Аномальная оценка 5. Это самый высокий уровень серьёзности без корреляции. Обычно он генерируется правилами веб-атак (файлы уровня 40).
ERROR: Ошибка — аномальная оценка 4. В основном генерируется правилами утечки на исходящем уровне (файлы уровня 50).
WARNING: Аномальная оценка 3. Генерируется правилами вредоносного клиента (файлы уровня 35).
NOTICE: Аномальная оценка 2. Генерируется политикой протокола и файлами аномалий.
INFO
DEBUG

Также можно настроить уровни серьёзности, такие как low, medium, high, critical и т. д.

"severity": "high"

**Setvar**

Создаёт, удаляет или обновляет переменную.

{
    "id": "xxx_01",
    "opts":{
        "nolog": false,
        "setvar": [{
            "column": "TX",
            "key": "score",
            "value": 5,
            "incr": true
        }]
    },
    ...
}
В правиле «xxx_01» значение члена score переменной TX увеличивается на 5. Если в TX нет члена score, оно инициализируется значением 0, а затем увеличивается на 5.

{
    "id": "xxx_02",
    "opts":{
        "nolog": false,
        "setvar": [{
            "column": "TX",
            "key": "score",
            "value": 5
        }]
    },
    ...
}

В правиле «xxx_02» значение члена score в переменной TX устанавливается равным 5.

**Мета**

Дополнительная информация о действии.

Если действие — deny, мета — код ответа.
"action": "deny",
"meta": 403

Если действие — redirect, мета — адрес перенаправления.
"action": "redirect",
"meta": "/index.html"

**Преобразование**

Это действие используется для указания конвейера преобразования, который будет использоваться для преобразования значения каждой переменной, используемой в правиле, перед этим. ## tag

Назначает тег (категорию) правилу.

Поддержка массивов "tag": ["xxx_1", "xxx_2"] Поддержка строк "tag": "xxx_3"


## release_version

Версия набора правил, аналогична функции ver в ModSecurity для Action.

"release_version": "858"


## robot

Распознавание человека и машины.

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

"action": "robot"


## add_resp_headers

Добавление, удаление или изменение заголовков ответа.

Например, скрытие поля server:

«opts»: { «add»_resp_headers»: { «server»: "" } }


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/miracleqi-openwaf_rule_engine.git
git@api.gitlife.ru:oschina-mirror/miracleqi-openwaf_rule_engine.git
oschina-mirror
miracleqi-openwaf_rule_engine
miracleqi-openwaf_rule_engine
master