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

OSCHINA-MIRROR/miracleqi-OpenWAF

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_CN.md 60 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 06:55 8caed57

OpenWAF

OpenWAF — это первая всесторонняя открытая система защиты веб-приложений (WAF), которая предлагает более полный спектр защитных функций и разнообразные стратегии защиты.

Содержание

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

Основные модули включают:

Функциональные модули включают:

Модули конфигурации директив:

  • twaf_access_rule — правила доступа.

  • twaf_anti_hotlink — защита от хотлинков.

  • twaf_anti_mal_crawler — защита от вредоносных сканеров.

  • twaf_reqstat — статистика запросов.

  • twaf_log — логирование.

  • twaf_secrules — правила безопасности.

  • twaf_anti_cc — защита от CC-атак. forward: «test»,
    forward_addr: «1.1.1.2»,
    forward_port: «8080»,
    uuid: «access_567b067ff2060»,
    policy: «policy_uuid».

  • user: string,
    по умолчанию — «-».

  • ngx_ssl: true|false,
    по умолчанию — false.

  • ngx_ssl_cert: «path»,
    по умолчанию — none.

  • ngx_ssl_key: «path»,
    по умолчанию — none.

  • host: «ip|domain name regex»,
    поддерживает регулярные выражения и IPv4/IPv6,
    по умолчанию — none.

  • port: number или массив,
    если host — массив, то port тоже должен быть массивом,
    по умолчанию 80 или 443.

  • path: «regex»,
    строка, поддерживает регулярные выражения,
    по умолчанию — /.

  • url_case_sensitive: «true|false»,
    boolean,
    по умолчанию false (без учёта регистра).

  • server_ssl: «true|false»,
    boolean,
    по умолчанию false.

  • forward: «upstream_uuid»,
    string,
    необязательный параметр.

  • forward_addr: «ip»,
    string,
    необязательный параметр.

  • forward_port: необязательный параметр,
    значение по умолчанию: 80 или 443. state:

true|false|$dynamic_state

default: false

context: twaf_anti_mal_crawler

Модуль-переключатель, по умолчанию выключен (false), поддерживает динамическое переключение.

log_state:

true|false|$dynamic_state

default: true

context: twaf_anti_mal_crawler

Переключатель безопасности журнала, по умолчанию включён (true, запись), поддерживает динамическое включение.

dict_state:

true|false

default: false

context: twaf_anti_mal_crawler

Shared dict-переключатель. Когда dict_state имеет значение true, определённый IP будет записан в памяти и будет заблокирован при следующем обращении (и время ожидания будет сброшено).

shared_dict_name:

default: nil

context: twaf_anti_mal_crawler

Имя shared dict. Соответствует настройке конфигурации nginx, не рекомендуется изменять. Если пусто, значением будет «dict_name» в «twaf_global».

shared_dict_key:

|

default: remote_addr

context: twaf_anti_mal_crawler

Ключ shared dict. Поддерживает массивы.

timeout:

default: 300

context: twaf_anti_mal_crawler

Время сохранения состояния shared dict (в секундах).

timer_flush_expired:

default: 200

context: twaf_anti_mal_crawler

Интервал очистки просроченной информации shared dict (в секундах), если пусто, то значением будет «timer_flush_expired» в «twaf_global».

cookie_state:

true|false|$dynamic_state

default: true

context: twaf_anti_mal_crawler

Отправка cookie, по умолчанию включена (true), поддерживает динамическое включение/отключение.

crawler_cookie_name:

«TWAF_crawler»

default: «TWAF_crawler»

context: twaf_anti_mal_crawler

Название cookie для сканера.

mal_cookie_name:

«TWAF_mcrawler»

default: «TWAF_mcrawler»

context: twaf_anti_mal_crawler

Название вредоносного cookie.

force_scan_robots_state:

true|false

default: true

context: twaf_anti_mal_crawler

Включение/отключение сканирования robots.txt. Некоторые инструменты сканирования не обращаются к /robots.txt, поэтому на страницах, которые они посещают, внедряется запрещённый каталог.

force_scan_times:

default: 3

context: twaf_anti_mal_crawler

Количество страниц для внедрения запрещённого каталога.

trap_uri:

default: /abc/abc.html

context: twaf_anti_mal_crawler

Ловушка URI, посещение этой страницы идентифицирует вредоносное сканирование.

trap_args:

default: id=1

context: 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:

true|false|$dynamic_state

default: true

context: twaf_reqstat

Общий переключатель модуля статистики, поддерживает динамическое переключение, по умолчанию включено. true|false|$dynamic_state*

default: true

context: twaf_reqstat

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

upstream_state

syntax: upstream_state true|false|$dynamic_state

default: true

context: twaf_reqstat

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

shared_dict_name

syntax: shared_dict_name string

default: twaf_reqstat

context: twaf_reqstat

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

shared_dict_key

syntax: shared_dict_key string

default: policyid

context: twaf_reqstat

Тип string. Указывает значение ключа shm. Классификация и статистика выполняются на основе этого значения. Например, если значение установлено как policyid, то будет собираться статистика по каждому правилу политики, касающаяся доступа, безопасности и upstream информации. Если значение установлено как userid, то будет собираться статистика для каждого пользователя, касающаяся доступа, безопасности и upstream информации. Если значение установлено как access_id, то будет собираться статистика, касающаяся каждого правила доступа, касающаяся доступа, безопасности и upstream информации.

Вернуться к twaf_reqstat

Вернуться к TOC

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": "/var/log/openwaf_access.log",      -- file模式的访问日志路径
        "file_security_log_path": "/var/log/openwaf_security.log",  -- file模式的安全日志路径
        "access_log_w3c": "",                            -- file模式访问日志的w3c格式
        "security_log_w3c": ""                           -- file模式安全日志的w3c формат
}

access_log_state

syntax: "access_log_state": true|false

default: false

context: twaf_log

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

security_log_state

syntax: "security_log_state": true|false

default: true

context: twaf_log

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

flush_limit

syntax: "flush_limit": number

default: 32768

context: twaf_log

Числовой тип. Размер буфера, отправка происходит только тогда, когда размер накопленного журнала превышает пороговое значение, значение по умолчанию — 32768. В версиях до v0.0.6 значение по умолчанию равно 0, что означает немедленную отправку журнала без кэширования. Начиная с версии v1.0.0β, значение по умолчанию было изменено на 32768. Условия вывода журнала также связаны с параметром periodic_flush.

size_limit

syntax: "size_limit": number

default: 200

context: twaf_log

Числовой тип. Управляет верхним пределом длины каждой записи в журнале. Единица измерения: байт. Если 'raw_header' или тело запроса/ответа слишком длинные, это может вызвать ошибку в UDP-журнале.

drop_limit

syntax: "drop_limit": number

default: 65507

context: twaf_log

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

periodic_flush

syntax: "periodic_flush": number

default: 2

context: twaf_log

Числовой тип. Интервал времени между сбросами журнала. Единица измерения: секунды. Журнал сбрасывается, когда выполняется одно из условий: — Достигнут предел flush_limit. — Прошёл интервал времени, указанный в периодическом сбросе. flush_limit или periodic_flush условия вывода

max_retry_times

Синтаксис: "max_retry_times": число

По умолчанию: 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": строка

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

Контекст: twaf_log

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

port

Синтаксис: "port": число

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

Контекст: twaf_log

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

ssl

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

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

Контекст: twaf_log

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

access_log

Синтаксис: "access_log": таблица

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

Контекст: twaf_log

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

security_log

Синтаксис: "security_log": таблица

По умолчанию: 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.

file_access_log_state

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

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

Контекст: twaf_log

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

file_security_log_state

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

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

Контекст: twaf_log

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

file_flush

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

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

Контекст: twaf_log

Логический тип. Флаг записи в файл в реальном времени.

file_content_type

Синтаксис: "file_content_type": W3C

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

Контекст: twaf_log

Строка. Формат журнала в файловом режиме, в настоящее время поддерживается только W3C.

file_access_log_path

Синтаксис:

Здесь приведён перевод текста без технической информации. Размер тела ответа: по умолчанию 134217728B (128MB). Если размер тела ответа превышает установленный лимит, то проверка не производится.

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

Расположение базы знаний в OpenWAF: lib/twaf/inc/knowledge_db/twrules.

Пользовательские правила: массив user_defined_rules, по умолчанию пустой. Стратегия использует пользовательские правила перед системными правилами. Системные правила применяются ко всем стратегиям и загружаются при запуске движка или через 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, по умолчанию пустая. Используется для исключения признаков.

Идентификаторы наборов правил: таблица ruleset_ids, по умолчанию пустая. Тип таблицы. Набор правил используется для различных стратегий защиты. Введён с версии v1.0.0β. Если значение ruleset_ids пустое, то применяются все загруженные правила. Если ruleset_ids — пустой массив, то никакие правила не действуют.

    "ruleset_ids": [       -- Два набора правил set_123456789 и set_987654321.
        "set_123456789",
        "set_987654321"
    ]
    
    PS: 
Конкретная конфигурация текущего набора правил поддерживается только через rule_set API.
``` **remote_addr** — ключ в shared_dict.

**action**: «DENY» — действие, выполняемое при срабатывании CC защиты.  

**action_meta**: 403 — дополнительная информация о выполняемом действии.  

**timeout**: 30 — время очистки (при повторном срабатывании значение сбрасывается).  

 **Правила**  

* **syntax**: «state»: true|false — синтаксис правила.  
* **default**: false — значение по умолчанию.  
* **context**: twaf_limit_conn — контекст правила.  

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

 * **log_state**  

* **syntax**: «log_state»: true|false — синтаксис правила.  
* **default**: true — значение по умолчанию.  
* **context**: twaf_limit_conn — контекст правила.  

Тип boolean, переключатель журнала CC защиты, включён по умолчанию.  

* **trigger_state**  

* **syntax**: «trigger_state»: true|false — синтаксис правила.  
* **default**: true — значение по умолчанию.  
* **context**: twaf_limit_conn — контекст правила.  

Тип boolean, переключатель запуска CC защиты, включен по умолчанию. Если выключить, то механизм запуска отключается и сразу переходит в состояние очистки CC.  

* **clean_state**  

* **syntax**: «clean_state»: true|false — синтаксис правила.  
* **default**: true — значение по умолчанию.  
* **context**: twaf_limit_conn — контекст правила.  

Тип boolean, общий выключатель CC защиты, включён по умолчанию. При выключении (только для тестирования) механизм очистки отключается, и модуль CC не может перехватывать запросы.  

* **trigger_thr**  

* **syntax**: «trigger_thr»: table — синтаксис правила.  
* **default**: {«req_flow_max»:1073741824, «req_count_max»:10000} — значение по умолчанию.  
* **context**: twaf_limit_conn — контекст правила.  

Таблица с пороговыми значениями запуска. Когда достигается одно из пороговых значений, включается очистка CC. В настоящее время существует два пороговых значения:  
```txt
    "trigger_thr":{                                      -- 触发阈值(关系为“或”)
        "req_flow_max":1073741824,                       -- 每秒请求流量,单位B,默认1GB/s
        "req_count_max":10000                            -- 每秒请求数,默认10000个/秒
    }
  • clean_thr

  • syntax: «clean_thr»: table — синтаксис правила.

  • default: {«new_conn_max»:40, «conn_max»:100, «req_max»:50, «uri_frequency_max»:3000} — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

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

    "clean_thr":{                                        -- 清洗阈值(关系为“或”)
        "new_conn_max":40,                               -- 单一源ip每秒新建连接数,默认40个/秒
        "conn_max":100,                                  -- 单一源ip防护期间内连接总数,默认100个
        "req_max":50,                                    -- 单一源ip每秒请求总数,默认50个/сек
        "uri_frequency_max":3000                         -- 单一路径每秒请求总数,默认3000个/сек
    }
  • Атаки

  • syntax: «attacks»: number — синтаксис правила.

  • default: 1 — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Во время одной атаки CC, если количество раз, когда достигается пороговое значение очистки, превышает attacks, этот IP будет постоянно блокироваться до тех пор, пока атака CC не закончится. До этого во время атаки CC, когда достигалось пороговое значение очистки, происходила блокировка. Если пороговое значение не было достигнуто, даже если ранее произошла блокировка, доступ к серверу мог быть восстановлен. Правильная настройка этого параметра может значительно повысить производительность защиты CC. Чтобы восстановить предыдущую защиту CC, просто установите attacks равным 0. Этот параметр появился в версии OpenWAF-0.0.6 и версии twaf_anti_cc 0.0.3.

  • timer_flush_expired

  • syntax: «timer_flush_expired»: number — синтаксис правила.

  • default: 10 — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Число, обозначающее интервал времени для очистки просроченных данных в shared_dict, по умолчанию 10 секунд.

  • interval

  • syntax: «interval»: number — синтаксис правила.

  • default: 10 — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Число, указывающее интервал времени между отправкой журналов после включения защиты CC, по умолчанию 10 секунд.

  • shared_dict_name

  • syntax: «shared_dict_name»: string — синтаксис правила.

  • default: «twaf_limit_conn» — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Строка, содержащая имя shared_dict для хранения текущей информации о защите CC.

  • shared_dict_key

  • syntax: «shared_dict_key»: string|table — синтаксис правила.

  • default: «remote_addr» — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Строка или таблица, представляющая собой ключ shared_dict и поддерживающая переменные nginx. Поддерживаются строки и массивы.

    "shared_dict_key": "remote_addr"
    
    "shared_dict_key": ["remote_addr", "http_user_agent"]
  • Действие

  • syntax: «action»: string — синтаксис правила.

  • default: «DENY» — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

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

  • action_meta

  • syntax: «action_meta»: number|string — синтаксис правила.

  • default: 403 — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

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

  • timeout

  • syntax: «timeout»: number — синтаксис правила.

  • default: 30 — значение по умолчанию.

  • context: twaf_limit_conn — контекст правила.

Число, представляющее собой время очистки. Если в течение N секунд пороговое значение больше не достигается, очистка CC завершается. Во время очистки, если пороговое значение снова достигается, время сбрасывается на 30 секунд. 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 — метод запроса, например, GET или POST.

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.

TIME — время в формате hour:minute:second.

TIME_DAY — день месяца (от 1 до 31).

TIME_EPOCH — временная метка в секундах с 1970 года.

TIME_HOUR — час (от 0 до 23).

TIME_MIN — минута (от 0 до 59).

TIME_MON — месяц (от 1 до 12).

TIME_SEC — секунда (от 0 до 59).

TIME_WDAY — день недели (от 0 до 6).

TIME_YEAR — год (четыре цифры).

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

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

UNIQUE_ID — идентификатор, генерируемый случайным образом. По умолчанию это 34-битная строка, которая может быть настроена на длину 16 или 32 бита. UPSTREAM_CACHE_STATUS

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

USERID

строка, полученная из конфигурации правил доступа.

Transformation Functions

  • base64_decode;
  • sql_hex_decode;
  • base64_encode;
  • counter;
  • compress_whitespace;
  • hex_decode;
  • hex_encode;
  • html_decode;
  • length;
  • lowercase;
  • md5;
  • normalise_path;
  • remove_nulls;
  • remove_whitespace;
  • replace_comments;
  • uri_decode;
  • uri_encode;
  • sha1;
  • trim_left;
  • trim_right;
  • trim.

base64_decode

Декодирует строку в кодировке Base64.

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

Например: { "id": "xxxx", ... "transform": ["base64_decode", "lowercase"], ... }

Сначала выполняется декодирование Base64, затем — приведение строки к нижнему регистру. Если поменять порядок, это повлияет на результат.

sql_hex_decode

Декодирование данных SQL hex.

base64_encode

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

counter

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

compress_whitespace

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

hex_decode

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

hex_encode

Кодирует строку (возможно, содержащую двоичные символы), заменяя каждый входной байт двумя шестнадцатеричными символами.

html_decode

Декодирует символы, закодированные как сущности HTML.

length

Определяет длину входной строки в байтах.

lowercase

Переводит все символы в нижний регистр.

md5

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

normalise_path

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

remove_nulls

Удаляет все нулевые байты из ввода.

remove_whitespace

Удаляет все пробельные символы из ввода. Удаляются пробельные символы \s, включая горизонтальные («\t»), вертикальные («\v») и другие.

replace_comments

Заменяет содержимое комментариев /.../ одним пробелом. remove_comments_char

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

remove_comments

Убирает содержимое комментариев /.../.

uri_decode

Раскодирует строку как экранированный компонент URI. Пример: «b%20r56+7» после преобразования uri_decode будет «br56 7».

uri_encode

Кодирует строку в компонент URI.

sha1

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

trim_left

Удаляет пробелы в начале входной строки.

trim_right

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

trim

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

Операторы

begins_with

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

contains

Возвращает true, если строка параметра найдена где-либо во вводе. Оператор равен contains и шаблон равен массиву, что эквивалентно pm в modsecurity. Примечание: modsecurity игнорирует регистр, а OpenWAF не игнорирует регистр.

Пример: { "id": "xxx", ... "operator": "contains", "pattern": ["abc", "def"], ... }

contains_word

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

detect_sqli

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

detect_xss

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

ends_with

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

equal

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

Пример: { "id": "xxx", ... "operator": "equal", "pattern": [12345, "html", "23456"] ... }

greater_eq

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

greater

Проводит численное сравнение и возвращает true, если входное значение больше параметра оператора. Возвращает false, если предоставлено значение, которое не может быть преобразовано в число. Выполняет быстрое сопоставление данных переменной REMOTE_ADDR по IPv4 или IPv6. Может обрабатывать следующие форматы:

  • Полный адрес 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

Вернуться к OPERATORS

Вернуться в TOC

less_eq

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

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

Вернуться к OPERATORS

Вернуться в TOC

less

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

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

Вернуться к OPERATORS

Вернуться в TOC

num_range

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

Он сочетается с transform length, что аналогично modsecurity validateByteRange.

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

Вернуться к OPERATORS

Вернуться в TOC

regex

Выполняет регулярное выражение для предоставленного шаблона.

В 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": "Протокольное ограничение, обнаружение HTTP-запросов, содержащих недопустимые значения Range или Request-Range", "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, "op_negated": true } ] }

Вернуться к OPERATORS

Вернуться в TOC

str_match

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

Вернуться к OPERATORS

Вернуться в TOC

str_range

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

Пример: проверка временного диапазона:

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

Вернуться к OPERATORS

Вернуться в TOC

validate_url_encoding

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

Вернуться к OPERATORS

Вернуться в TOC

Другие

  • allow;
  • allow_phase;
  • deny;
  • id;
  • nolog;
  • op_negated;
  • parse;
  • pass;
  • warn;
  • audit;
  • phase;
  • proxy_cache;
  • pf;
  • pset;
  • redirect;
  • charactor_version;
  • severity;
  • setvar;
  • meta;
  • ngx_var;
  • transform;
  • tag. Текст запроса:

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 секунд.

Перевод текста запроса на русский язык:

Прокси-кэш twaf_cache. Прокси игнорирует заголовки X-Accel-Expires, Cache-Control и Set-Cookie. Прокси не кэширует данные с помощью переменной $twaf_cache_flag.

Сервер:
    Установить значение переменной $twaf_cache_flag в 1 (по умолчанию данные не будут кэшироваться).

}

Конфигурация в формате Lua

{ id: «test_x01», # глобальный уникальный идентификатор opts: { nolog: true, # отключить логирование proxy_cache: { # настройки прокси-кэша state: true, # включить кэш expired: 300 # срок действия кэша — 300 секунд } }, phase: "header_filter", # фаза обработки запроса action: "pass", # действие при совпадении условий match: [ # условия совпадения { vars: [ # переменные для сравнения { var: "URI" }, # переменная URI { var: "REQUEST_HEADERS", # переменная REQUEST_HEADERS parse: { specific: "Referer" } # разбор заголовка Referer } ], operator: "equal", # оператор сравнения pattern: ["/xampp/", "{SCHEME}://{HTTP_HOST}/xampp/"], # шаблон URL parse_pattern: true # анализировать шаблон } ] } Данный код будет кэшировать все страницы с URL, начинающимся с /xampp/, сроком на 300 секунд. tag

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

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

release_version

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

"release_version": "858"

robot

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

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

"action": "robot"

add_resp_headers

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

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

opts": {
    "add_resp_headers": {
        "server": ""
    }
}

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

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

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