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

OSCHINA-MIRROR/miracleqi-openwaf_rule_engine

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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.

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

290557551@qq.com

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

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

Пожалуйста, сообщайте об ошибках, пожеланиях или патчах, используя следующие способы:

  1. Создайте заявку в системе отслеживания ошибок GitHub.
  2. Или отправьте сообщение в сообщество 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"}],      -- 匹配中数组中信息则对应规则失效,数组中key为变量名称,值支持正则
            "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

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

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

respbody_limit

Синтаксис: respbody_limit число

По умолчанию: 134217728 (128 МБ)

Контекст: twaf_secrules

Ограничивает размер тела ответа. По умолчанию составляет 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

Правила, определяемые пользователем. Стратегия применяет их после системных правил. Системные правила применяются ко всем стратегиям и загружаются при запуске движка или через 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": "Доступ к каталогу /test запрещён с понедельника по пятницу с 8:00 до 18:00.",
        "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 or false, по умолчанию false
            add_resp_headers = {                   -- пользовательские заголовки ответа
                key_xxx = "value_xxx"              -- имя заголовка ответа = значение заголовка ответа
            }
            setvar = {{                            -- установить переменные, массив
                column = "test",                   -- ключ переменной первого уровня, например: TX, session и т. д., тип string
                key = "test",                      -- ключ переменной второго уровня, например: score, id и т.д., тип string
                incr = true,                       -- аналогично modsec в += операции, true или false, по умолчанию false
                value = 5,                         -- значение переменной, тип number
                time = 3000                        -- время ожидания (мс), тип number
            }}
        },
        phase = "test",                            -- этап выполнения («доступ», «фильтр заголовка», «фильтр тела»), поддерживает массивы и строки
        action = "test",                           -- действие, ALLOW, DENY и т. д., тип string
        desc = "test",                             -- описание
        tags = {"test1", "test2"},                 -- метки
        match = {                                  -- массив, отношения между match — «и», аналогично функции chain в действии modsecurity
            {
              

В этом тексте продолжается описание структуры и параметров системы управления безопасностью веб-приложений. Переведённый текст:

**Переменные:**
* 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. **IP_VERSION** — строка, IPv4 или IPv6.

**MATCHED_VAR** — неопределённый тип, текущая переменная соответствия.

**MATCHED_VARS** — таблица, все переменные в одной строке соответствия.

**MATCHED_VAR_NAME** — строка, имя текущей переменной соответствия.

**MATCHED_VARS_NAMES** — таблица, имена всех переменных в одной строке соответствия.

**ORIGINAL_DST_ADDR** — строка, адрес сервера, для режима применения прокси-сервера — это адрес WAF, для прозрачного режима — адрес внутреннего сервера.

**ORIGINAL_DST_PORT** — строка, порт сервера, для режима применения прокси-сервера — это порт WAF, для прозрачного режима — порт внутреннего сервера.

**POLICYID** — строка, идентификатор политики.

**QUERY_STRING** — строка, необработанные параметры запроса.

**RAW_HEADER** — строка, информация заголовка запроса с запросом строки.

**RAW_HEADER_TRUE** — строка, информация заголовка запроса без запроса строки.

**REMOTE_ADDR** — строка, клиентский адрес.

**REMOTE_HOST** — строка, доменное имя.

**REMOTE_PORT** — число, номер порта.

**REMOTE_USER** — строка, имя пользователя для аутентификации.

**REQUEST_BASENAME** — строка, имя файла запроса. Например: GET http://www.baidu.com/test/login.php, значение REQUEST_BASENAME — /login.php.

**REQUEST_BODY** — неопределённый тип, тело запроса.

**REQUEST_COOKIES** — таблица, файлы cookie в запросе.

**REQUEST_COOKIES_NAMES** — таблица, названия файлов cookie в запросе.

**REQUEST_FILENAME** — строка, относительный путь запроса (relative request URL). Например: GET http://www.baidu.com/test/login.php, значение REQUEST_FILENAME — /test/login.php.

**REQUEST_HEADERS** — таблица, информация заголовков запроса.

**REQUEST_HEADERS_NAMES** — таблица, ключи информации заголовков запроса.

**REQUEST_LINE** — строка, строка запроса.

**REQUEST_METHOD** — строка, метод запроса.

**REQUEST_PROTOCOL** — строка, протокол HTTP-запроса, например: HTTP/1.1.

**HTTP_VERSION** — строка, версия протокола HTTP-запроса, например: 1.1.

**URI** — строка, путь запроса, без имени домена и параметров. Например: GET http://www.baid.com/test/login.php?name=miracle, значение URI — /test/login.php.

**URL** — строка, унифицированный указатель ресурса, соединение SCHEME, HTTP_HOST и URI. Например: GET http://www.baid.com/test/login.php?name=miracle, значение URL — http://www.baid.com/test/login.php.

**REQUEST_URI** — строка, путь запроса с параметрами, но без имени домена. Например: GET http://www.baid.com/test/login.php?name=miracle, значение REQUEST_URI — /test/login.php?name=miracle.

**RESPONSE_BODY** — строка, тело ответа.

**RESPONSE_HEADERS** — таблица, информация заголовков ответа.

**RESPONSE_STATUS** — функция, код состояния ответа.

**SCHEME** — строка, http или https. Например: GET http://www.baidu.com/, значение SCHEME — http.

**SERVER_ADDR** — строка, адрес сервера.

**SERVER_NAME** — строка, название сервера. **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** — удаляет пробелы как с левой, так и с правой сторон входной строки.

*В запросе также описаны операторы, но их перевод не входит в рамки запроса.* **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, и pattern взаимоисключают друг друга (они не могут появляться одновременно), в настоящее время поддерживается только абсолютный путь.

Комбинация pf и contains эквивалентна modsecurity pmf или pmFromFile.

Комбинация pf и ip_utils эквивалентна modsecurity ipMatchF или ipMatchFromFile.

**regex**

Сопоставляет шаблон, предоставленный в качестве параметра.

У regex также есть функция захвата modsecurity.

Описание modsecurity для захвата выглядит следующим образом: при использовании вместе с оператором регулярного выражения (@rx) действие захвата создаст копии захватов регулярного выражения и поместит их в коллекцию переменных транзакций.

В OpenWAF нет инструкции capture, но используется regex по умолчанию с включенной функцией захвата.

Например:

{ "id": "000031", "release_version": "858", "charactor_version": "001", "opts": { "nolog": false }, "phase": "access", "action": "deny", "meta": 403, "severity": "low", "rule_name": "protocol.reqHeader.c", "desc": "协议规范性约束,检测含有不合规Range或Request-Range值的HTTP请求", "match": [ { "vars": [ { "var": "REQUEST_HEADERS", "parse": { "specific": "Range" } }, { "var": "REQUEST_HEADERS", "parse": { "specific": "Request-Range" } } ], "operator": "regex", "pattern": "(\d+)\-(\d+)\," }, { "vars": [{ "var": "TX", "parse": { "specific": "2" } }], "operator": "greater_eq", "pattern": "%{TX.1}", "parse_pattern": 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-content)

## str_range

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

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

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


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

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

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-content)

## 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 правило выполняется один раз на этапе access и один раз на этапе header_filter".

Вернуться к ДРУГИМ

Вернуться к TOC

proxy_cache

{
    ...
    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",                      -- уникальный идентификатор
    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.
Если условие match фильтруется по методу запроса, это эквивалентно инструкции proxy_cache_methods в Nginx.
Если условием match является тип ресурса, это эквивалентно инструкции proxy_cache_content_type в Nginx.

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

Вернуться к ДРУГИМ

Вернуться к TOC

redirect

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

Вернуться к ДРУГИМ

Вернуться к TOC

charactor_version

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

"charactor_version": "001"

Вернуться к ДРУГИМ

Вернуться к TOC

severity

Присваивает уровень серьёзности правилу, в котором оно используется.

Данные, используемые ниже, используются основным набором правил ModSecurity (CRS):

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

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

"severity": "high"

Вернуться к ДРУГИМ

Вернуться к TOC

setvar

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

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

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

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

Вернуться к ДРУГИМ

Вернуться к TOC

meta

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

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

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

Вернуться к ДРУГИМ

Вернуться к TOC

transform

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

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

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

release_version

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

"release_version": "858"

robot

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

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

"action": "robot"

add_resp_headers

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

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

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

Комментарии ( 0 )

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

Введение

openwaf_rule_engine — это правиловый движок OPENWAF. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
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