OpenWAF
OpenWAF — это первая всесторонняя открытая система защиты веб-приложений (WAF), которая предлагает более полный спектр защитных функций и разнообразные стратегии защиты.
Содержание
Версия
Этот документ описывает 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 позволяет упаковывать функции в стратегии, и различные веб-приложения могут использовать разные стратегии для защиты. В будущем планируется создать облачную платформу, где стратегии также будут доступны для обмена и использования другими пользователями.
Основные модули включают:
Функциональные модули включают:
[Предотвращение злонамеренного сканирования OpenWAF: установка, сообщество, ошибки и патчи
Установка:
Подробная информация содержится в документации по установке OpenWAF.
Сообщество:
Существует два списка рассылки для сообщества OpenWAF:
Также указаны личные почтовые адреса и QQ группы для связи.
Ошибки и патчи:
TODO:
Изменения:
Информация о изменениях содержится в файле Changelog.
Ссылка: https://github.com/titansec/OpenWAF/blob/master/Changelog
Авторские права и лицензия:
Этот модуль лицензирован под лицензией BSD.
Авторские права принадлежат Jian «Miracle» Qi (齐健) 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 — защита от 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
Безопасность информации статистика переключатель, поддерживает динамический переключатель, по умолчанию включён.
syntax: upstream_state true|false|$dynamic_state
default: true
context: twaf_reqstat
Переключатель статистики пересылки информации, поддерживает динамический переключатель, по умолчанию включён.
syntax: shared_dict_name string
default: twaf_reqstat
context: twaf_reqstat
Указывает имя shared_dict, перед этим в файле конфигурации nginx необходимо настроить lua_shared_dict .
syntax: shared_dict_key string
default: policyid
context: twaf_reqstat
Тип string. Указывает значение ключа shm. Классификация и статистика выполняются на основе этого значения. Например, если значение установлено как policyid, то будет собираться статистика по каждому правилу политики, касающаяся доступа, безопасности и upstream информации. Если значение установлено как userid, то будет собираться статистика для каждого пользователя, касающаяся доступа, безопасности и upstream информации. Если значение установлено как access_id, то будет собираться статистика, касающаяся каждого правила доступа, касающаяся доступа, безопасности и upstream информации.
"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 формат
}
syntax: "access_log_state": true|false
default: false
context: twaf_log
Логический тип, общий переключатель журнала доступа, по умолчанию выключен.
syntax: "security_log_state": true|false
default: true
context: twaf_log
Логический тип, общий переключатель безопасного журнала, по умолчанию включен.
syntax: "flush_limit": number
default: 32768
context: twaf_log
Числовой тип. Размер буфера, отправка происходит только тогда, когда размер накопленного журнала превышает пороговое значение, значение по умолчанию — 32768. В версиях до v0.0.6 значение по умолчанию равно 0, что означает немедленную отправку журнала без кэширования. Начиная с версии v1.0.0β, значение по умолчанию было изменено на 32768. Условия вывода журнала также связаны с параметром periodic_flush.
syntax: "size_limit": number
default: 200
context: twaf_log
Числовой тип. Управляет верхним пределом длины каждой записи в журнале. Единица измерения: байт. Если 'raw_header' или тело запроса/ответа слишком длинные, это может вызвать ошибку в UDP-журнале.
syntax: "drop_limit": number
default: 65507
context: twaf_log
Числовой тип. Верхний предел буфера, при достижении которого текущий журнал отбрасывается, а сохранённый журнал отправляется, буфер очищается, и при значении sock_type, равном udp, максимальное значение drop_limit составляет 65507 (65508 вызовет ошибку message too long).
syntax: "periodic_flush": number
default: 2
context: twaf_log
Числовой тип. Интервал времени между сбросами журнала. Единица измерения: секунды. Журнал сбрасывается, когда выполняется одно из условий: — Достигнут предел flush_limit. — Прошёл интервал времени, указанный в периодическом сбросе. flush_limit или periodic_flush условия вывода
Синтаксис: "max_retry_times": число
По умолчанию: 5
Контекст: twaf_log
Число. Максимальное количество попыток.
Синтаксис: "socket_access_log_state": true|false
По умолчанию: true
Контекст: twaf_log
Логический тип, переключатель доступа к журналу в режиме сокета.
Синтаксис: "socket_security_log_state": true|false
По умолчанию: true
Контекст: twaf_log
Логический тип, переключатель журнала безопасности в режиме сокета.
Синтаксис: "sock_type": tcp|udp
По умолчанию: udp
Контекст: twaf_log
Протокол передачи журнала, по умолчанию UDP.
Синтаксис: "content_type": JSON|INFLUXDB
По умолчанию: JSON
Контекст: twaf_log
Формат журнала, по умолчанию JSON.
Синтаксис: "host": строка
По умолчанию: "127.0.0.1"
Контекст: twaf_log
IP-адрес сервера приёма журнала.
Синтаксис: "port": число
По умолчанию: 60055
Контекст: twaf_log
Номер порта сервера приёма журнала.
Синтаксис: "ssl": true|false
По умолчанию: false
Контекст: twaf_log
Флаг включения протокола SSL, по умолчанию false.
Синтаксис: "access_log": таблица
По умолчанию: false
Контекст: twaf_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": true|false
По умолчанию: true
Контекст: twaf_log
Логический тип. Переключатель журнала доступа в файловом режиме.
Синтаксис: "file_security_log_state": true|false
По умолчанию: true
Контекст: twaf_log
Логический тип. Переключатель журнала безопасности в файловом режиме.
Синтаксис: "file_flush": true|false
По умолчанию: false
Контекст: twaf_log
Логический тип. Флаг записи в файл в реальном времени.
Синтаксис: "file_content_type": W3C
По умолчанию: W3C
Контекст: twaf_log
Строка. Формат журнала в файловом режиме, в настоящее время поддерживается только W3C.
Синтаксис:
Здесь приведён перевод текста без технической информации. Размер тела ответа: по умолчанию 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 — таблица для хранения информации о текущем запросе, область действия ограничена текущим запросом.
хранит статус доступа к кэшу ответов (0.8.3). Статус может быть «MISS», «BYPASS», «EXPIRED», «STALE», «UPDATING», «REVALIDATED» или «HIT».
строка, полученная из конфигурации правил доступа.
Декодирует строку в кодировке Base64.
Примечание: обратите внимание на порядок выполнения transform.
Например: { "id": "xxxx", ... "transform": ["base64_decode", "lowercase"], ... }
Сначала выполняется декодирование Base64, затем — приведение строки к нижнему регистру. Если поменять порядок, это повлияет на результат.
Декодирование данных SQL hex.
Кодирует входную строку с помощью Base64-кодирования.
Счётчик, аналогичный символу «&» в ModSecurity.
Преобразует любые пробельные символы (0x20, \f, \t, \n, \r, \v, 0xa0) в пробелы (ASCII 0x20), сжимая несколько последовательных пробелов в один.
Декодирует строку, которая была закодирована с использованием того же алгоритма, что и hexEncode.
Кодирует строку (возможно, содержащую двоичные символы), заменяя каждый входной байт двумя шестнадцатеричными символами.
Декодирует символы, закодированные как сущности HTML.
Определяет длину входной строки в байтах.
Переводит все символы в нижний регистр.
Вычисляет хеш MD5 на основе входных данных. Вычисленный хеш имеет необработанную двоичную форму, и его необходимо закодировать в текст для печати (или регистрации). Хеш-функции обычно используются в сочетании с hex_encode (например: «transform»: [«md5», «hex_encode»).
Удаляет множественные косые черты, ссылки на каталог самого себя и обратные ссылки на каталоги (кроме случаев, когда они находятся в начале ввода) из входной строки.
Удаляет все нулевые байты из ввода.
Удаляет все пробельные символы из ввода. Удаляются пробельные символы \s, включая горизонтальные («\t»), вертикальные («\v») и другие.
Заменяет содержимое комментариев /.../ одним пробелом. 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. Может обрабатывать следующие форматы:
С версии 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
Выполняет численное сравнение и возвращает true, если входное значение меньше или равно параметру оператора.
Возвращает false, если предоставлено значение, которое не может быть преобразовано в число.
Выполняет численное сравнение и возвращает true, если входное значение меньше параметра оператора.
Возвращает false, если предоставлено значение, которое не может быть преобразовано в число.
Определяет, находится ли значение в числовом диапазоне.
Он сочетается с transform length, что аналогично modsecurity validateByteRange.
{
"id": "xxx",
...
"operator": "num_range",
"pattern": [10, "13", "32-126"],
"transform": "length",
...
}
Выполняет регулярное выражение для предоставленного шаблона.
В 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 } ] }
Эквивалентно contains.
Проверяет, находится ли строка в заданном диапазоне.
Пример: проверка временного диапазона:
{ "id": "xxx", ... "operator": "str_range", "pattern": ["01:42:00-04:32:00"], ... }
Проверяет наличие URL-кодированных символов во входной строке.
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; #默认不缓存
}
}
{ 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 (по умолчанию данные не будут кэшироваться).
}
Назначает тег (категорию) правилу.
Поддерживает массивы: "tag": ["xxx_1", "xxx_2"]
Поддерживает строки: "tag": "xxx_3"
Версия набора правил, аналогична функции ver в ModSecurity.
"release_version": "858"
Распознавание человека и машины.
Требуется предварительная настройка модуля распознавания человека и машины, эта функция пока недоступна.
"action": "robot"
Добавление, удаление и изменение заголовков ответа.
Например, чтобы скрыть поле server:
opts": {
"add_resp_headers": {
"server": ""
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )