OpenWAF Rule Engine — это правиловый движок OPENWAF.
Содержание
Версия
Этот документ описывает OpenWAF Rule Engine v0.0.1.161026_beta, выпущенный 26 октября 2016 года.
Синопсис
[Вернуться к TOC]
Описание
Идея этого движка правил пришла из ModSecurity и freewaf (lua-resty-waf). Он реализует механизм правил ModSecurity с использованием Lua. На основе этого движка можно проводить проверку на соответствие протоколам, использовать автоматические инструменты, обнаруживать атаки внедрения, межсайтовые атаки, утечку информации, аномальные запросы и другие меры безопасности. Поддерживается динамическое добавление правил, своевременное исправление уязвимостей.
[Вернуться к TOC]
Сообщество
Для англоговорящих существует список рассылки OpenWAF-en.
Существует список рассылки на китайском языке для OpenWAF-cn.
[Вернуться к 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 true|false
По умолчанию: true
Контекст: twaf_secrules
Общий переключатель правил.
Синтаксис: reqbody_state true|false
По умолчанию: true
Контекст: twaf_secrules
Переключатель проверки тела запроса.
Синтаксис: header_filter_state true|false
По умолчанию: true
Контекст: twaf_secrules
Переключатель фильтрации заголовков ответов.
Синтаксис: body_filter_state true|false
По умолчанию: false
Контекст: twaf_secrules
Переключатель фильтрации тел ответов, по умолчанию выключен, при включении требуется добавить сторонний модуль [ngx_http_twaf_header_sent_filter_module пока не открыт].
Синтаксис: system_rules_state true|false
По умолчанию: true
Контекст: twaf_secrules
Переключатель проверки системных правил.
Правила в каталоге lib/twaf/inc/knowledge_db/twrules являются системными правилами. Помимо системных правил, есть также пользовательские правила в модуле twaf_secrules user_defined_rules. Системные правила редко меняются, а пользовательские правила добавляются и удаляются в зависимости от бизнеса, например, динамическая конфигурация кеша, сжатия, контроля времени и белых и чёрных списков.
Синтаксис: 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.
Используется для исключения признаков.
Директивы правил
-- формат 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 )