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

OSCHINA-MIRROR/miracleqi-OpenWAF

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

OpenWAF

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

Содержание

  • OpenWAF;
  • Версия;
  • Обзор;
  • Описание;
  • Установка;
  • Сообщество;
    • Список рассылки на английском языке;
    • Список рассылки на китайском языке;
    • Личный почтовый ящик QQ;
  • Ошибки и патчи;
  • Задачи;
  • Изменения;
  • Авторские права и лицензия;
  • Директивы конфигурации модулей;
  • Переменные Nginx;
  • SecRules;
    • Переменные;
    • Функции преобразования;
    • Операторы;
    • Прочее;
  • Пожертвования.

Версия

Данный документ описывает OpenWAF версии 1.1, выпущенный 8 марта 2021 года.

Файлы Dockerfile (https://github.com/titansec/docker-openwaf) и образы Docker (https://hub.docker.com/r/titansec/openwaf/tags) были обновлены до версии 1.1 8 марта 2021 года.

Обзор

    #nginx.conf
    lua_package_path '/twaf/?.lua;;';
    
    init_by_lua_file /twaf/app/twaf_init.lua;
    
    lua_shared_dict twaf_shm 50m;
    
    upstream test {
        server 0.0.0.1; #just an invalid address as a place holder
        balancer_by_lua_file twaf_balancer.lua;
    }
    
    server {
        listen 443 ssl;
        server_name _;
        
        ssl_certificate_by_lua_file  twaf_ssl_cert.lua;
        rewrite_by_lua_file          /twaf/app/twaf_rewrite.lua;
        access_by_lua_file           /twaf/app/twaf_access.lua;
        header_filter_by_lua_file    /twaf/app/twaf_header_filter.lua;
        body_filter_by_lua_file      /twaf/app/twaf_body_filter.lua
        log_by_lua_file              /twaf/app/twaf_log.lua;
        
        set $twaf_https 1;
        set $twaf_upstream_server "";
        
        ssl_certificate nginx.crt;
        ssl_certificate_key nginx.key;
        
        location / {
            lua_need_request_body on;
            proxy_pass $twaf_upstream_server;
        }
    }
    
    server {
        listen      80;
        server_name  _;
        
        rewrite_by_lua_file       /twaf/app/twaf_rewrite.lua;
        access_by_lua_file        /twaf/app/twaf_access.lua;
        header_filter_by_lua_file /twaf/app/twaf_header_filter.lua;
        body_filter_by_lua_file   /twaf/app/twaf_body_filter.lua
        log_by_lua_file           /twaf/app/twaf_log.lua;
        
        set $twaf_upstream_server "";
        
        location / {
            lua_need_request_body on;
            proxy_pass $twaf_upstream_server;
        }
    }
    #default_config-json

    #main_safe_policy-json

Вернуться к содержанию

Описание

  OpenWAF представляет собой первую комплексную систему защиты веб-приложений (WAF) с открытым исходным кодом. Она основана на анализе HTTP-запросов с использованием API nginx_lua. OpenWAF состоит из двух функциональных механизмов: механизма анализа поведения и механизма правил. Механизм правил в основном анализирует отдельные запросы, а механизм анализа поведения отвечает за отслеживание информации о запросах.
  Механизм правил вдохновлён ModSecurity и freewaf(lua-resty-waf). Правила ModSecurity будут реализованы с помощью lua. Механизм правил может быть основан на спецификации протокола, автоматических инструментах, инъекционных атаках, межсайтовых атаках, утечках информации и других исключениях безопасности, связанных с запросами. Он также поддерживает динамические правила и своевременное устранение уязвимостей.
  Механизм анализа поведения включает в себя нечёткую идентификацию на основе частоты, анти-вредоносный сканер, модуль идентификации человека и компьютера, защиту от CSRF, CC, прав, атак с загрузкой файлов, подделку файлов cookie, кражу цепочки, пользовательские заголовки и страницу ответа на атаку. Модуль проверки на раскрытие информации.

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

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

Базовые модули:

  • openwaf_conf;
  • openwaf_log;
  • openwaf_reqstat;
  • openwaf_core;
  • openwaf_access_rule.

Безопасные модули:

  • openwaf_rule_engine;
  • openwaf_attack_response;
  • openwaf_api;
  • openwaf_anti_mal_crawler;
  • openwaf_anti_cc.

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

Вернуться к TOC

Установка

См. документацию по установке OpenWAF.

Вернуться к TOC

Сообщество

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

Список рассылки OpenWAF-en предназначен для англоговорящих пользователей.

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

Список рассылки OpenWAF-cn предназначен для носителей китайского языка.

Личная почта QQ

290557551@qq.com

Группа QQ

579790127

Вернуться к TOC

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

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

  1. Создайте заявку в системе отслеживания проблем GitHub.
  2. Или отправьте сообщение в сообщество OpenWAF.

Вернуться к TOC

TODO

  • Добавить динамический переключатель модуля access_rule.
  • Поддержка подключения SSO.
  • Динамический токен.
  • APISG (API Security gateway).
  • Mock.

Вернуться к TOC

Изменения

Смотрите список изменений.

Вернуться к TOC

Авторские права и лицензия

Этот модуль лицензирован по лицензии BSD.

Авторское право (C) 2016–2016, Цзянь «Миракл» Ци (齐健) miracleqi25@gmail.com, Titan Co.Ltd.

Все права защищены.

Распространение и использование в исходных и двоичных формах, с изменениями или без них, разрешено при соблюдении следующих условий:

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

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

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРАМИ И УЧАСТНИКАМИ «КАК ЕСТЬ» И БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ И СООТВЕТСТВИЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ УЧАСТНИКИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ЭКСТРАОРДИНАРНЫЕ ИЛИ ПОСЛЕДУЮЩИЕ УБЫТКИ (ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, УЩЕРБ ОТ ПОТЕРИ ДАННЫХ, ИЛИ ПРИБЫЛИ, ИЛИ ИСПОЛЬЗОВАНИЯ), ВОЗНИКШИЕ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ ОНИ БЫЛИ ПРЕДУПРЕЖДЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ. Конфигурация директив модулей

  • twaf_access_rule
  • twaf_anti_hotlink
  • twaf_anti_mal_crawler
  • twaf_reqstat
  • twaf_log
  • twaf_secrules
  • twaf_anti_cc

twaf_access_rule

{
    "twaf_access_rule": {
        "rules": [                                 -- 注意先后顺序
            {                                      
                "user": "user_id",                 -- 用户名ID,非必填,默认值"-"
                "ngx_ssl": false,                  -- nginx认证的开关,非必填,默认值false
                "ngx_ssl_cert": "path",            -- nginx认证所需PEM证书地址
                "ngx_ssl_key": "path",             -- nginx认证所需PEM私钥地址
                "host": "^1\\.1\\.1\\.1$",         -- 域名,支持正则匹配,支持字符串或数组,同时支持IPv4/IPv6
                "port": 80,                        -- 端口号。支持number或数组类型,非必填,默认值80或443
                "path": "\/",                      -- 路径,支持正则匹配,非必填,默认值"/"
                "url_case_sensitive": false,       -- 路径区分大小写,boolean类型,非必填,默认值 false
                "server_ssl": false,               -- 后端服务器ssl开关,boolean类型,非必填,默认值 false
                "forward": "server_5",             -- 后端服务器upstream名称,string类型
                "forward_addr": "1.1.1.2",         -- 后端服务器ip地址,string类型
                "forward_port": "8080",            -- 后端服务器端口号,非必填,默认值80或443
                "uuid": "access_567b067ff2060",    -- 用来标记此规则的uuid,非必填,默认16位随机字符串
                "policy": "policy_uuid"            -- 安全策略ID,string类型,非必填,默认值twaf_default_conf
            }
        ]
    }
}

Правила

Синтаксис: «rules»: таблица По умолчанию: нет Контекст: twaf_access_rule

Таблица типов, правила доступа, соответствие по порядку.

Пользователь

Синтаксис: «пользователь»: строка По умолчанию: - Контекст: twaf_access_rule: правила

Строка типа. Идентификатор пользователя. Соответствует переменной %{USERID}. Необязательно, значение по умолчанию — «-».

Nginx SSL

Синтаксис: «ngx_ssl»: true | false По умолчанию: false Контекст: twaf_access_rule: rules

Тип boolean, переключатель аутентификации на стороне сервера (nginx), который можно использовать вместе с client_ssl для двусторонней аутентификации. Необязательный, значение по умолчанию — false.

Сертификат Nginx SSL

Синтаксис: «ngx_ssl_cert»: «путь» По умолчанию: нет Контекст: twaf_access_rule: rules

Строковый тип, адрес сертификата аутентификации PEM на стороне сервера (nginx). В настоящее время поддерживается только абсолютный адрес.

Ключ Nginx SSL

Синтаксис: «ngx_ssl_key»: «путь» По умолчанию: нет Контекст: twaf_access_rule: rules

Строковый тип, закрытый ключ аутентификации PEM на стороне сервера (nginx). В настоящее время поддерживается только абсолютный адрес.

Хост

Синтаксис: «хост»: «ip | доменное имя regex» По умолчанию: нет Контекст: twaf_access_rule: rules

Строка или массив. Имя хоста. (Поддержка массивов начиная с версии v1.0.0β) Поддерживает регулярные выражения (автоматически игнорирует регистр при сопоставлении). Одновременно поддерживает IPv4/IPv6. (Начиная с версии v1.0.0β поддерживает IPv6) Например:

«хост»: "^1\.\1\.\1\.1$"
«хост»: "test\.com"
«хост»: "^.*\.com$"
«хост»: "www.baidu.com"
«хост»: ["www.baidu.com", "1.1.1.1", "8888::192.168.1.1"]

Порт

Синтаксис: «порт»: число По умолчанию: 80 | 443 Контекст: twaf_access_rule: rules

Числовой или массивный тип, номер порта. (Поддержка массивов начинается с версии v1.0.0β) Необязательно, значения по умолчанию — 80 или 443. Если параметр «хост» является массивом, то и «порт» также должен быть массивом. Например:

«хост»: [«www.baidu.com», «1.1.1.1», «8888::192.168.1.1»]
«порт»: [80, 8088, 8099]

Путь

Синтаксис: «путь»: «регулярное выражение» По умолчанию: нет Контекст: twaf_access_rule: rules

Строчный тип, путь, поддерживает регулярное выражение. Необязательно, значением по умолчанию является "/". Например:

«путь»: "/"
«путь»: "/images"
«путь»: "/[a|b]test"

Url_case_sensitive

Синтаксис: «url_case_sensitive»: «true | false» По умолчанию: false Контекст: twaf_access_rule: rules

Логический тип, чувствительность к регистру пути (поддержка этого параметра начинается с версии v1.0.0β). Необязательно, значение по умолчанию — false (без учёта регистра).

Сервер SSL

Синтаксис: «server_ssl»: «true | false» По умолчанию: false Контекст: twaf_access_rule: rules

Логический тип, переключатель SSL на стороне OpenWAF, подключённой к серверу. Необязательно, значение по умолчанию — false. Например:

upstream test {
    server 1.1.1.1;
}

http {
    server {
        listen 80;
        server_name _;

        location / {
            #server_ssl равно true, что эквивалентно proxy_pass после https
            proxy_pass https://test;
``` **forward**

Синтаксис: *"forward": "upstream_uuid"*

По умолчанию: *нет*

Контекст: *twaf_access_rule:rules*

Тип строки, forward обозначает uuid вышестоящего сервера, то есть имя upstream.

Если вы не используете переменную $twaf_upstream_server, предоставляемую OpenWAF, то «forward», «forward_addr» и «forward_port» не являются обязательными (поддержка необязательных значений начинается с версии v1.0.0β).

**Пример:** если вы используете переменную OpenWAF $twaf_upstream_server и присваиваете ей значение test, то forward будет иметь значение test.
# Например: используя переменную OpenWAF $ twaf_upstream_server, forward имеет значение test
upstream test {
    server 1.1.1.1;
}

server {
    ...
    location / {
        proxy_pass $twaf_upstream_server;
    }
}

---------------------------------

# Например: не используя переменную OpenWAF $ twaf_upstream_server, forward не является обязательным
server {
    ...
    location / {
        proxy_pass http://1.1.1.1;
    }
}

---------------------------------

# Например: не используя переменную OpenWAF $ twaf_upstream_server, forward не является обязательным
server {
    ...
    location / {
        root html;
        index index.htm;
    }
}

**forward_addr**

Синтаксис: *"forward_addr": "ip"*

По умолчанию: *нет*

Контекст: *twaf_access_rule:rules*

Строковый тип, forward_addr обозначает IP-адрес вышестоящего сервера (TODO: поддержка доменных имён).

Пример: если forward_addr имеет значение 1.1.1.1, то
upstream test {
    # например: forward_addr равен 1.1.1.1
    server 1.1.1.1;
}

**forward_port**

Синтаксис: *"forward_port": port*

По умолчанию: 80|443

Контекст: *twaf_access_rule:rules*

Числовой тип, forward_port обозначает номер порта вышестоящего сервера.

Необязательный, по умолчанию 80 или 443.

Пример: если forward_port имеет значение 50001, то
upstream test {
    # например: forward_port равен 50001
    server 1.1.1.1:50001;
}

**uuid**

Синтаксис: *"uuid": "string"*

По умолчанию: random(16)

Контекст: *twaf_access_rule:rules*

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

Необязательно, по умолчанию — 16-символьная случайная строка (по умолчанию 16-символьная случайная строка начиная с версии 1.0.0β). **twaf_anti_hotlink**

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

**twaf_anti_mal_crawler**
---------------------
```txt
{
    "state": false,                                            -- 模块开关,支持 true,false
    "log_state":true,                                          -- 日志开关

    "dict_state": false,                                       -- shared_dict 开关
    "shared_dict_name":"twaf_anti_mal_crawler",                -- shared_dict 名称,若为空,则值为 "twaf_global" 下的 "dict_name"
    "shared_dict_key": "remote_addr",                          -- shared_dict 键值
    "timeout":300,                                             -- shared_dict 保存状态有效时长(单位秒)
    "timer_flush_expired":200,                                 -- shared_dict 清除过期信息的间隔时间(单位秒),若为空,则值为 "twaf_global" 下的 "timer_flush_expired"

    "cookie_state":true,                                       -- cookie机制开关
    "crawler_cookie_name":"TWAF_crawler",                      -- 爬虫cookie名称
    "mal_cookie_name":"TWAF_mcrawler",                         -- 恶意爬虫cookie名称

    "force_scan_robots_state":true,                            -- 页面注入诱捕路径的开关
    "force_scan_times": 3,                                     -- 注入诱捕路径的页面个数
    "trap_uri":"/abc/abc.html",                                -- 诱捕路径
    "trap_args":"id=1",                                        -- 诱捕参数

    "action":"DENY",                                           -- 执行动作,支持 "ALLOW", "DENY", "REDIRECT", "ROBOT", "RESET_CONNECTION", "PASS" 等
    "action_meta": 403                                         -- 执行动作的附属信息,若 action 为 DENY,action_meta为响应码,若 action 为 REDIRECT,action_meta 为重定向 url
}
  • state — синтаксис: state true|false|$dynamic_state, значение по умолчанию: false. Контекст: twaf_anti_mal_crawler. Модуль-переключатель, по умолчанию выключен (false), поддерживает динамический переключатель.

  • log_state — синтаксис: log_state true|false|$dynamic_state, значение по умолчанию: true. Контекст: twaf_anti_mal_crawler. Переключатель безопасного журнала, по умолчанию включён (true, запись), поддерживает динамический переключатель.

  • dict_state — синтаксис: dict_state true|false, значение по умолчанию: false. Контекст: twaf_anti_mal_crawler. Общий словарь-переключатель. Когда dict_state включён (true), определённый IP будет записан в памяти и доступ к нему в течение времени timeout будет заблокирован (и время timeout сбрасывается).

  • shared_dict_name — синтаксис: shared_dict_name , значение по умолчанию: nil. Контекст: twaf_anti_mal_crawler. Имя общего словаря. Если пусто, то значение равно «dict_name» в «twaf_global».

  • shared_dict_key — синтаксис: shared_dict_key |, значение по умолчанию: remote_addr. Контекст: twaf_anti_mal_crawler. Ключ общего словаря. Поддерживает массивы.

  • timeout — синтаксис: timeout , значение по умолчанию: 300. Контекст: twaf_anti_mal_crawler. Время сохранения состояния в общем словаре (в секундах).

  • timer_flush_expired — синтаксис: timer_flush_expired , значение по умолчанию: 200. Контекст: twaf_anti_mal_crawler. Интервал времени для очистки просроченной информации в общем словаре (в секундах), если пусто, то используется значение «timer_flush_expired» в «twaf_global».

  • cookie_state — синтаксис: cookie_state true|false|$dynamic_state, значение по умолчанию: true. Контекст: twaf_anti_mal_crawler. Отправлять ли cookie, по умолчанию включено (true), поддерживается динамический переключатель.

  • crawler_cookie_name — синтаксис: crawler_cookiename , значение по умолчанию: «TWAF_crawler». Контекст: twaf_anti_mal_crawler. Название cookie для сканера.

  • mal_cookie_name — синтаксис: mal_cookiename , значение по умолчанию: «TWAF_mcrawler». Контекст: twaf_anti_mal_crawler. Название вредоносного cookie.

  • force_scan_robots_state — синтаксис: force_scan_robots_state true|false, значение по умолчанию: true. Контекст: twaf_anti_mal_crawler. Переключатель сканирования с помощью роботов. Некоторые инструменты сканирования не посещают /robots.txt, поэтому на страницах, которые они посещают, внедряется запрещённый каталог скрытых ссылок. trap_uri

Синтаксис: trap_uri

Значение по умолчанию: /abc/abc.html

Контекст: twaf_anti_mal_crawler

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

trap_args

Синтаксис: trap_args

Значение по умолчанию: id=1

Контекст: twaf_anti_mal_crawler

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

twaf_reqstat

    "twaf_reqstat": {
        "state":true,                       -- 统计模块总开关
        "safe_state":true,                  -- 安全信息统计开关
        "access_state":true,                -- 访问信息统计开关
        "upstream_state":true,              -- upstream信息统计开关
        "shared_dict_name":"twaf_reqstat",  -- shm名称
        "shared_dict_key":"policy_id"       -- shm键值。依据此值进行分类统计
    }
    
    PS: 当前统计模块是全局模块,仅支持在twaf_default_conf中进行全局配置,不支持在自定义策略中进行配置

state

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

Значение по умолчанию: true

Контекст: twaf_reqstat

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

access_state

Синтаксис: access_state true|false|$dynamic_state

Значение по умолчанию: true

Контекст: twaf_reqstat

Переключатель статистики информации о доступе, поддерживает динамическое включение, по умолчанию включено.

safe_state

Синтаксис: safe_state true|false|$dynamic_state

Значение по умолчанию: true

Контекст: twaf_reqstat

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

upstream_state

Синтаксис: upstream_state true|false|$dynamic_state

Значение по умолчанию: true

Контекст: twaf_reqstat

Переключатель информации о пересылке, поддерживает динамическое включение, по умолчанию включён.

shared_dict_name

Синтаксис: shared_dict_name string

Значение по умолчанию: twaf_reqstat

Контекст: twaf_reqstat

Указывает имя shared_dict. Перед этим в файле конфигурации nginx необходимо настроить lua_shared_dict .

shared_dict_key

Синтаксис: shared_dict_key string

Значение по умолчанию: policyid

Контекст: twaf_reqstat

Строковый тип. Указывает значение ключа shared_dict. На основе этого значения выполняется классификация статистики.

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

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

Если значение установлено на access_id, то собирается информация, связанная с каждым правилом доступа, о доступе, безопасности и пересылке.

twaf_log

"twaf_log": {
        "access_log_state":true,                         -- 访问日志总开关
        "security_log_state":true,                       -- 安全日志总开关
        "flush_limit":32768,                             -- 缓冲,当存储的日志大于阈值时发送日志
        "size_limit": 200,                               -- 控制日志中每一项的字符上限,如'raw_header'或请求体响应体,可能会使udp日志报错
        "drop_limit":65507,                              -- 缓冴上限,达到此值,丢弃当前日志,发送缓存并清空缓存,当sock_type为udp时,drop_limit值最大为65507(65508会报错message too long)
        "periodic_flush": 2,                             -- flush间隔周期。单位:秒。日志会在达到flush_limit或periodic_flush时输出
        "max_retry_times":5,                             -- 最大容错次数
                                                      -- -- 以下为socket输出日志配置
        "socket_access_log_state": true,                 -- socket模式的访问日志开关
        "socket_security_log_state": true,               -- socket模式的安全日志开关
        "sock_type":"udp",                               -- 支持tcp和udp两种协议
        "content_type":"JSON",                           -- sock支持JSON和INFLUXDB两种日志格式
        "host":"127.0.0.1",                              -- 日志服务器地址
        "port":60055,                                    -- 日志服务器端口号
        "ssl":false,                                     -- 是否开启ssl协议
        "access_log":{},                                 -- 访问日志格式
        "security_log":{},                               -- 安全日志格式
                                                      -- -- 以下为file输出日志配置
        "file_access_log_state": true,                   -- file模式的访问日志开关
        "file_security_log_state": true,                 -- file模式的安全日志开关
        "file_flush": false,                             -- 是否实时写入文件
        "file_content_type": "W3C",                      -- file模式时日志格式,当前仅支持W3C
        "file_access_log_path":
``` **access_log_state**

Синтаксис: *"access_log_state": true|false*

Значение по умолчанию: *false*

Контекст: *twaf_log*

Тип boolean. Общий переключатель для доступа к журналу, по умолчанию закрыт.

**security_log_state**

Синтаксис: *"security_log_state": true|false*

Значение по умолчанию: *true*

Контекст: *twaf_log*

Тип boolean. Общий переключатель журнала событий безопасности, по умолчанию открыт.

**flush_limit**

Синтаксис: *"flush_limit": number*

Значение по умолчанию: *32768*

Контекст: *twaf_log*

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

В версиях до v0.0.6 значение по умолчанию равно 0, что означает немедленную отправку журнала без кэширования.

Начиная с версии v1.0.0β, значение по умолчанию составляет 32768.

Условие управления выводом журнала также связано с параметром periodic_flush.

**size_limit**

Синтаксис: *"size_limit": number*

Значение по умолчанию: *200*

Контекст: *twaf_log*

Численный тип. Управляет верхним пределом длины каждого элемента в журнале. Единица измерения — байт.

Если длина заголовка raw или тела запроса или ответа слишком велика, это может привести к ошибкам в UDP-журнале.

**drop_limit**

Синтаксис: *"drop_limit": number*

Значение по умолчанию: *65507*

Контекст: *twaf_log*

Численный тип. Верхний предел буфера. Когда достигается это значение, текущий журнал отбрасывается, отправляется буфер и буфер очищается. Максимальное значение drop_limit при sock_type = udp составляет 65507 (65508 вызовет ошибку message too long).

**periodic_flush**

Синтаксис: *"periodic_flush": number*

Значение по умолчанию: *2*

Контекст: *twaf_log*

Численный тип. Интервал времени между сбросами журнала. Единица — секунда.

Журнал будет выводиться при выполнении условия flush_limit или periodic_flush.

**max_retry_times**

Синтаксис: *"max_retry_times": number*

Значение по умолчанию: *5*

Контекст: *twaf_log*

Численный тип. Максимальное количество попыток повторной передачи.

**socket_access_log_state**

Синтаксис: *"socket_access_log_state": true|false*

Значение по умолчанию: *true*

Контекст: *twaf_log*

Логический тип. Переключатель журнала доступа в режиме сокета.

**socket_security_log_state**

Синтаксис: *"socket_security_log_state": true|false*

Значение по умолчанию: *true*

Контекст: *twaf_log*

Логический тип. Переключатель журнала безопасности в режиме сокета.

**sock_type**

Синтаксис: *"sock_type": tcp|udp*

Значение по умолчанию: *udp*

Контекст: *twaf_log*

Протокол передачи журнала, по умолчанию UDP.

**content_type**

Синтаксис: *"content_type": JSON|INFLUXDB*

Значение по умолчанию: *JSON*

Контекст: *twaf_log*

Формат журнала, по умолчанию JSON.

**host**

Синтаксис: *"host": string*

Значение по умолчанию: *"127.0.0.1"*

Контекст: *twaf_log*

IP-адрес сервера приёма журнала.

**port**

Синтаксис: *"port": number*

Значение по умолчанию: *60055*

Контекст: *twaf_log*

Номер порта сервера приёма журнала.

**ssl**

Синтаксис: *"ssl": true|false*

Значение по умолчанию: *false*

Контекст: *twaf_log*

Флаг включения SSL, по умолчанию false.

**access_log**

Синтаксис: *"access_log": table*

Значение по умолчанию: *false*

Контекст: *twaf_log*

Таблица типа. Формат журнала доступа. Подробности см. в описании security_log.

**security_log**

Синтаксис: *"security_log": table*

Значение по умолчанию: *false*

Контекст: *twaf_log*

Формат журнала безопасности.

Если content_type равен JSON, формат журнала:

[ variable_key_1, variable_key_2, ... ]

Если content_type равен INFLUXDB, формат журнала:

{ "db":MEASUREMENT名称, "tags":[variable_key_1, variable_key_2, ...], "fileds"[variable_key_1, variable_key_2, ...], "time":true|false }


Подробности см. в модуле правил [twaf_secrules](https://github.com/titansec/OpenWAF#variables).
#Пример формата журнала
    #Формат JSON
    "security_log": [
        "remote_addr",
        "remote_port",
        "userid",
        "dev_uuid",
        "original_dst_addr",
        "original_dst_port",
        "remote_user",
        "time_local",
        "msec",
        "request_method",
        "request_uri",
        "request_protocol",
        "status",
        "bytes_sent",
        "http_referer",
        "http_user_agent",
        "gzip_ratio",
        "http_host",
        "raw_header",
        "%{request_headers.host}"
    ]

    #Формат INFLUXDB
    "security_log": {
        "db":"test",                  -- MEASUREMENT名称
        "tags":[],                    -- tags keys
        "fileds":[                    -- fileds keys
            "remote_addr",
            "remote_port",
            "userid",
            "dev_uuid",
            "original_dst_addr",
**remote_user**,
**time_local**,
**msec**,
**request_method**,
**request_uri**,
**request_protocol**,
**status**,
**bytes_sent**,
**http_referer**,
**http_user_agent**,
**gzip_ratio**,
**http_host**,
**raw_header**,
**%{request_headers.host}** — список переменных, которые используются в формате JSON и INFLUXDB для access_log и security_log.

Для получения значения host используется конфигурация **%{request_headers.host}**.

* *file_access_log_state*: true|false — переключатель доступа к файлу журнала. Значение по умолчанию: true.

* *file_security_log_state*: true|false — переключатель безопасности файла журнала. Значение по умолчанию: true.

* *file_flush*: true|false — определяет, будет ли информация записываться в файл немедленно. Значение по умолчанию: false.

* *file_content_type*: W3C — формат журнала при использовании файлового режима. В настоящее время поддерживается только W3C.

* *file_access_log_path*: path — путь к файлу журнала доступа. Значение по умолчанию: /var/log/openwaf_access.log.

* *file_security_log_path*: path — путь к файлу безопасного журнала. Значение по умолчанию: /var/log/openwaf_security.log.

* *access_log_w3c*: string — формат W3C для файла журнала доступа.

Значение по умолчанию: «%{remote_addr} - %{remote_user} [%{time_local}] \"%{request_method} %{request_uri} %{request_protocol}\" %{response_status} %{bytes_sent} \"%{http_referer}\" \"%{http_user_agent}\" %{userid} %{server_addr}:%{server_port} \"%{http_host}\" %{request_time} %{policyid} %{unique_id} %{api_id}».

* *security_log_w3c*: string — формат W3C для безопасного файла журнала.

Значение по умолчанию: «%{remote_addr} - %{remote_user} [%{time_local}] \"%{request_method} %{request_uri} %{request_protocol}\" %{response_status} %{bytes_sent} \"%{http_referer}\" \"%{http_user_agent}\" %{userid} %{server_addr}:%{server_port} \"%{http_host}\" %{request_time} %{policyid} %{category} %{severity} %{action} %{id} %{rule_name} %{unique_id} %{api_id}».

Переменные подробно описаны в модуле правил twaf_secrules.

* *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*: [{}] — признак исключён без условий.
} ```txt
{
    "twaf_limit_conn": {
        "state": false,                                       -- CC防护模块开关
        "log_state": true,                                    -- CC日志开关
        "trigger_state": true,                                -- 触发开关
        "clean_state": true,                                  -- 清洗开关
        "trigger_thr": {                                      -- 触发阈值(关系为“或”)
            "req_flow_max": 1073741824,                       -- 每秒请求流量,单位B
            "req_count_max": 10000                            -- 每秒请求数
        },
        "clean_thr": {                                        -- 清洗阈值
            "new_conn_max": 40,                               -- 单一源ip每秒新建连接数
            "conn_max": 100,                                  -- 单一源ip防护期间内连接总数
            "req_max": 50,                                    -- 单一源ip每秒请求总数
            "uri_frequency_max": 3000                         -- 单一路径每秒请求总数
        },
        "attacks": 1,                                        -- 在一次CC攻击过程中,某ip触发清洗值的次数大于attacks,则此ip会一直被拦截,直到CC攻击结束
        "timer_flush_expired": 10,                            -- 清理shared_dict过期数据的时间间隔
        "interval": 10,                                       -- 进入CC防护后发送日志的时间间�л,单位秒
        "shared_dict_name": "twaf_limit_conn",                -- 存放其他信息的shared_dict
        "shared_dict_key": "remote_addr",                     -- shared_dict的键值
        "action": "DENY",                                     -- 触发CC防护执行的动作
        "action_meta": 403,
        "timeout": 30                                         -- 清洗时长(当再次触发清洗值时,重置)
    }
}
``` **twaf_limit_conn**

*string*, хранит информацию о текущем CC-защитнике в shared_dict.  

**shared_dict_key**  

Синтаксис: *"shared\_dict\_key": string|table*  

По умолчанию: *«remote\_addr»*  

Контекст: *twaf\_limit\_conn*  

Тип *string* или *table*, ключ значения shared_dict, поддерживает переменные nginx. Поддерживает строки и массивы.
"shared_dict_key": "remote_addr"

"shared_dict_key": ["remote_addr", "http_user_agent"]

**action**  

Синтаксис: *"action": string*  

По умолчанию: *"DENY"*  

Контекст: *twaf\_limit\_conn*  

Строка, действие CC-защиты по умолчанию «DENY».  

**action_meta**  

Синтаксис: *"action\_meta": number|string*  

По умолчанию: *403*  

Контекст: *twaf\_limit\_conn*  

Число или строка, дополнительная информация о действии, по умолчанию 403.  

**timeout**  

Синтаксис: *"timeout": number*  

По умолчанию: *30*  

Контекст: *twaf\_limit\_conn*  

Целое число, время очистки, если в течение N секунд не достигается пороговое значение, CC-очистка завершается. Если во время очистки снова достигается пороговое значение, время сбрасывается до 30 секунд.

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

Переменные Nginx  

$twaf_https  

Синтаксис: *set $twaf\_https 0|1*  

По умолчанию: *0*  

Контекст: *server*  

Используется для обозначения того, был ли запрос передан через SSL-шифрование.  

«set $twaf_https 1» означает, что запрос был передан через SSL.  

«set $twaf_https 0» означает, что запрос не был передан через SSL.

server { listen 443 ssl; set $twaf_https 1; ... }

server { listen 80; set $twaf_https 0; ... }


$twaf_upstream_server  

Синтаксис: *set $twaf\_upstream\_server ""*  

По умолчанию: *нет*  

Контекст: *server*  

Указывает адрес бэкэнд-сервера, просто инициализируйте его пустой строкой. Его значение определяется «server_ssl» и «forward».

upstream server_1 { ... }

upstream server_2 { ... }

server { ...

set $twaf_upstream_server "";
location / {
    ...
    proxy_pass $twaf_upstream_server;
}

}

Если "server_ssl" имеет значение true, а "forward" — "server_1", это эквивалентно proxy_pass https://server_1;

Если "server_ssl" имеет значение false, а "forward" — "server_2", это эквивалентно proxy_pass http://server_2;


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

SecRules  

Переменные  

* [ARGS](#args)  
* [ARGS\_COMBINED\_SIZE](#args_combined_size)  
* [ARGS\_GET](#args_get)  
* [ARGS\_GET\_NAMES](#args_get_names)  
* [ARGS\_NAMES](#args_names)  
* [ARGS\_POST](#args_post)  
* [ARGS\_POST\_NAMES](#args_post_names)  
* [BYTES\_IN](#bytes_in)  
* [CONNECTION\_REQUESTS](#connection_requests)  
* [DURATION](#duration)  
* [FILES](#files)  
* [FILES\_NAMES](#files_names)  
* [GEO](#geo)  
* [GEO\_CODE3](#geo_code3)  
* [GEO\_CODE3](#geo_code)  
* [GEO\ID](#geo_id)  
* [GEO\CONTINENT](#geo_continent)  
* [GEO\NAME](#geo_name)  
* [GZIP\RATIO](#gzip_ratio)  
* [HTTP\COOKIE](#http_cookie)  
* [HTTP\HOST](#http_host)  
* [HTTP\REFERER](#http_referer)  
* [HTTP\USER\AGENT](#http_user_agent)  
* [IP\VERSION](#ip_version)  
* [MATCHED\VAR](#matched_var)  
* [MATCHED\VARS](#matched_vars)  
* [MATCHED\VAR\NAME](#matched_var_name)  
* [MATCHED\VARS\NAMES](#matched_var_names)  
* [ORIGINAL\DST\ADDR](#original_dst_addr)  
* [ORIGINAL\DST\PORT](#original_dst_port)  
* [POLICYID](#policyid)  
* [QUERY\STRING](#query_string)  
* [RAW\HEADER](#raw_header)  
* [RAW\HEADER\TRUE](#raw_header_true)  
* [REMOTE\ADDR](#remote_addr)  
* [REMOTE\HOST](#remote_host)  
* [REMOTE\PORT](#remote_port)  
* [REMOTE\USER](#remote_user)  
* [REQUEST\BASENAME](#request_basename)  
* [REQUEST\BODY](#request_body)  
* [REQUEST\COOKIES](#request_cookies)  
* [REQUEST\COOKIES\NAMES](#request_cookies_names)  
* [REQUEST\FILENAME](#request_filename)  
* [REQUEST\HEADERS](#request_headers)  
* [REQUEST\HEADERS\NAMES](#request_headers_names)  
* [REQUEST\LINE](#request_line)  
* [REQUEST\METHOD](#request_method)  
* [REQUEST\PROTOCOL](#request_protocol)  
* [HTTP\VERSION](#http_version)  
* [URI](#uri)  
* [URL](#url)  
* [REQUEST\URI](#request_uri)  
* [RESPONSE\BODY](#response_body)  
* [RESPONSE\HEADERS](#response_headers)  
* [RESPONSE\STATUS](#response_status)  
* [SCHEME](#scheme)  
* [SERVER\ADDR](#server_addr)  
* [SERVER\NAME](#server_name)  
* [SERVER\PORT](#server_port)  
* [SESSION](#session)  
* [SESSION\DATA](#session_data)  
* [TIME](#time)  
* [TIME\DAY](#time_day)  
* [TIME\EPOCH](#time_epoch)  
* [TIME\HOUR](#time_hour)  
* [TIME\MIN](#time_min)  
* [TIME\MON](#time_mon)  
* [TIME\SEC](#time_sec)  
* [TIME\WDAY](#time_wday)  
* [TIME\YEAR](#time_year)  
* [TIME\LOCAL](#time_local)  
* [TX](#tx)  
* [UNIQUE\ID](#unique_id)  
* [UPSTREAM\CACHE\STATUS](#upstream_cache_status)  
* [USERID](#userid) **Переменные:**

* **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»}.

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

Пример: GET http://www.baidu.com?name=miracle&age=5. Значение ARGS_COMBINATED_SIZE равно 15, а не 18.

* **ARGS_GET** — таблица с параметрами строки запроса.

Пример: GET http://www.baidu.com?name=miracle&age=5. Значение ARGS_GET: {«name»: «miracle», «age»: «5»}.

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

Пример: GET http://www.baidu.com?name=miracle&age=5. Значение ARGS_GET_NAMES: [«name», «age»].

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

Пример: POST http://www.baidu.com?name=miracle&age=5. Тело запроса: time=123456&day=365. Значение ARGS_NAMES: [«name», «age», «time», «day»].

* **ARGS_POST** — таблица с параметрами тела запроса.

Пример: POST http://www.baidu.com/login.html. Тело запроса: time=123456&day=365. Значение ARGS_POST: {«time»: «123456», «day»: «365»}.

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

Пример: POST http://www.baidu.com/login.html. Тело запроса: time=123456&day=365. Значение ARGS_POST_NAMES: [«time», «day»].

* **BYTES_IN** — количество полученных байтов информации.

* **CONNECTION_REQUESTS** — текущее количество запросов в соединении.

* **DURATION** — время обработки транзакции в микросекундах.

* **FILES** — исходные имена файлов, полученные из тела запроса, с расширением.

* **FILES_NAMES** — имена файлов без расширения.

* **GEO** — таблица с информацией о стране, включая код3, код, идентификатор, континент, название и т. д.

* **GEO_CODE3** — трёхбуквенный код страны.

* **GEO_CODE** — двухбуквенный код страны.

* **GEO_ID** — идентификатор страны.

* **GEO_CONTINENT** — континент страны.

* **GEO_NAME** — полное название страны.

* **GZIP_RATIO** — коэффициент сжатия.

* **HTTP_COOKIE** — поле cookie в заголовке запроса.

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

* **HTTP_REFERER** — поле referer в заголовке запроса.

* **HTTP_USER_AGENT** — поле user-agent в заголовке запроса.

* **IP_VERSION** — IPv4 или IPv6.

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

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

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

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

* **ORIGINAL_DST_ADDR** — адрес сервера, адрес WAF в режиме прокси-сервера, адрес бэкэнда в прозрачном режиме. **ORIGINAL_DST_PORT** — строка, серверный порт, номер порта для режима работы с прокси-сервером приложения (application proxy) в качестве брандмауэра веб-приложений (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.1, 2.

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

**URL** — строка, унифицированный указатель ресурса (Uniform Resource Locator), соединение схемы (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** — строка, название сервера.

**SERVER_PORT** — число, порт сервера.

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

**SESSION_DATA** — таблица, данные сессии, переменная, предоставляемая сторонним модулем lua-resty-session. **length of the input string in bytes**

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

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

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

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

* *remove_whitespace* — удаляет все пробельные символы \s, включая горизонтальные позиционирующие символы ('\t'), клавишу возврата ('\r'), перевод строки ('\n'), вертикальные позиционирующие символы('\v') или страницу ('\f');

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

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

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

* *uri_decode* — отменяет экранирование str как экранированного компонента URI;

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

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

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

**Operators**

* *begins_with* — возвращает true, если строка параметра найдена в начале входных данных;

* *contains* — возвращает true, если строка параметра найдена где-либо во входных данных;

* *contains_word* — возвращает true, если строка параметра (с границами слов) найдена где-либо во входных данных;

* *detect_sqli* — этот оператор;

* *detect_xss* — этот оператор.

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

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

**ends_with**

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

**equal**

Выполняет сравнение строк и возвращает true, если строка параметров идентична строке ввода. Эквивалентно modsecurity eq и streq.

Например:

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


**greater_eq**

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

**greater**

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

**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;

С версии v1.0.0β поддерживает IPv6, например: 8888::192.168.1.1.

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 8888::192.168.1.1 8888::1:1


**less_eq**

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

**less**

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

**num_range**

Определяет, находится ли значение в числовом диапазоне. Сочетается с transform length, эквивалентно modsecurity validateByteRange.

Пример:

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


**regex**

Проводит сопоставление регулярного выражения с предоставленным параметром. Regex эквивалентен rx + capture, то есть regex включает в себя функции modsecurity rx и capture.

Описание capture в modsecurity: при использовании вместе с оператором регулярного выражения (@rx) действие захвата создаст копии захватов регулярного выражения и поместит их в коллекцию переменных транзакций. В OpenWAF нет отдельной команды capture, но используется regex с включенной по умолчанию функцией capture. **parse**: {
    "specific": "2"
},
**operator**: "greater_eq",
**pattern**: "%{TX.1}",
**parse_pattern**: true,
**op_negated**: true
].

str_match эквивалентен contains.

*str_range* проверяет, находится ли значение в заданном диапазоне строк. Например, для проверки временного интервала:

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


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

Другие:
* allow — останавливает обработку текущей фазы и пропускает все остальные фазы.
* allow_phase — останавливает обработку текущей фазы.
* deny — останавливает обработку правил и прерывает транзакцию.
* id — останавливает обработку правил и прерывает транзакцию.
* nolog — не регистрирует события в журнале.
* op_negated — инвертирует результат оператора.
* parse — выполняет дополнительную обработку переменных.
* pass — продолжает обработку со следующим правилом после успешного сопоставления.
* warn — генерирует предупреждение.
* audit — выполняет аудит.
* phase — фаза обработки запроса.
* proxy_cache — управляет кэшем прокси.
* pf — модуль фильтрации пакетов.
* pset — набор параметров.
* redirect — перенаправляет запрос на другой URL.
* charactor_version — версия символа.
* severity — уровень серьёзности.
* setvar — устанавливает переменную.
* meta — метаданные.
* ngx_var — переменная nginx.
* transform — преобразует значение переменной.
* tag — помечает запрос.
* release_version — номер версии выпуска.
* robot — определяет, является ли пользователь роботом.
* add_resp_headers — добавляет заголовки ответа. **Текст запроса:**

{ "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.


**Перевод текста запроса:**

{ "id": "ххх_01", "opts": { "nolog": false, "setvar": [ { "column": "TX", "key": "score", "value": 5, "incr": true } ] }, ... }

В правиле «ххх_01» значение элемента score переменной TX увеличивается на 5. Если элемент score отсутствует в TX, сначала устанавливается значение 0 и затем увеличивается на 5.

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

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


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

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

Введение

Первый комплексный open-source WAF с более широкими защитными функциями и разнообразными стратегиями защиты. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/miracleqi-OpenWAF.git
git@api.gitlife.ru:oschina-mirror/miracleqi-OpenWAF.git
oschina-mirror
miracleqi-OpenWAF
miracleqi-OpenWAF
master