OpenWAF
第一個全能的開源Web安全保護系統,比其他人更具保護。
該文檔描述了OpenWAF v1.1於2021年3月8日發布。
Dockerfile和Docker圖像已在2021年3月8日昇級為1.1版。
#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回到TOC
OpenWAF是基於HTTP請求信息的NGINX_LUA API分析,是第一個完全開源的Web應用程序保護系統(WAF)。 OpenWAF由兩個功能引擎組成:行為分析引擎和規則引擎。規則引擎主要分析單個請求,行為分析引擎主要負責跟踪請求信息。
受ModSecurity和FreeWaf(Lua-Resty-Waf)啟發的規則引擎,將使用LUA實施ModSecurity規則。規則引擎可以基於協議規範,自動工具,注射攻擊,交叉站點攻擊,信息洩漏和其他安全異常請求,從而增加了對動態規則的支持,及時修復漏洞。
行為分析引擎包括基於頻率的模糊識別,反惡意軟件爬蟲,人類計算機識別抗檢測模塊,反CSRF,抗CC,抗CC,反右CC,反權利,防止攻擊文件上傳模塊,cookie Tamper驗證,防盜鏈,自定義標頭,定制標頭和攻擊響應響應響應頁面證明信息披露的信息披露。
除了這兩個引擎外,還包括統計,日誌,攻擊響應頁面,訪問規則和其他基本模塊。除了現有的功能模塊外,OpenWAF還支持配置的動態修改,第三方模塊的動態添加,因此發動機不會在中斷條件下升級保護條件下重新啟動。
OpenWAF支持上述功能,作為具有不同策略保護的不同Web應用程序應用程序的策略。未來將建立一個雲平台,該策略也可以為他人共享。
基本模塊:
安全模塊:
詳細的配置文檔和示例,請參閱上述模塊文檔
回到TOC
請看OpenWAF安裝文檔
回到TOC
OpenWAF-EN郵件列表適用於說英語的人。
OpenWAF-CN郵件列表適用於中國揚聲器。
579790127
回到TOC
請提交錯誤報告,願望清單或補丁
回到TOC
回到TOC
ChangElog
回到TOC
該模塊已根據BSD許可獲得許可。
版權(C)2016-2016,由Jian“ Miracle” Qi(齊健)[email protected],Titan Co.ltd。
版權所有。
如果滿足以下條件:
源代碼的再分配必須保留上述版權通知,此條件列表和以下免責聲明。
二進制形式的重新分配必須複製上述版權通知,此條件列表以及文檔和/或分發提供的其他材料中的以下免責聲明。
該軟件由版權所有者和貢獻者“按原樣”提供,任何明示或暗示的保證,包括但不限於對適銷性和特定目的適合性的隱含保證。在任何情況下,版權持有人或貢獻者均不得對任何直接,間接,偶然,特殊,特殊,示例性或結果損害均承擔任何責任(包括但不限於替代商品或服務的採購,損失,數據或利潤損失,數據或利潤;還是造成的,無論是在合同中造成的,或者在任何責任中造成的責任,或者是否有任何責任,或者在任何責任中,是否有任何責任,或者是否有任何責任,或者是否有責任,是否有責任,是否有責任。告知可能造成這種損害的可能性。
回到TOC
回到TOC
{
"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
}
]
}
}語法: “規則”:表
默認值:無
上下文: twaf_access_rule
表類型,接入規則,順序匹配
語法: “用戶”:字符串
預設: -
上下文: twaf_access_rule:規則
字符串類型。用戶名id。對應變量%{userId}。
非必填,默認值“ - ”。
語法: “ ngx_ssl”:true | false
默認值: false
上下文: twaf_access_rule:規則
布爾值類型,服務器端(nginx)認證開關,client_ssl組成雙向認證
非必填,默認值錯誤
語法: “ ngx_ssl_cert”:“路徑”
默認值:無
上下文: twaf_access_rule:規則
字符串類型,服務器端(nginx)認證所需pem證書地址,目前僅支持絕對地址,目前僅支持絕對地址
語法: “ ngx_ssl_key”:“路徑”
默認值:無
上下文: twaf_access_rule:規則
字符串類型,服務器端(nginx)認證所需pem私鑰地址,目前僅支持絕對地址,目前僅支持絕對地址
語法: “主機”:“ IP |域名REGEX”
默認值:無
上下文: twaf_access_rule:規則
字符串或數組類型。發布域名。 (從v1.0.0β版本開始支持數組)
支持正則表達式(匹配時,自動忽略大小寫)。
同時支持IPv4/ipv6。 (從v1.0.0β版本開始支持IPv6)
例如:
"host": "^1\.1\.1\.1$"
"host": "test\.com"
"host": "^.*\.com$"
"host": "www.baidu.com"
"host": ["www.baidu.com", "1.1.1.1", "8888::192.168.1.1"]
語法: “端口”:編號
默認值: 80 | 443
上下文: twaf_access_rule:規則
數字或數組類型,端口號。 (從v1.0.0β版本開始支持數組)
非必填,默認值80或443
若“主機”,“ port”也應為數組。例如:
"host": ["www.baidu.com", "1.1.1.1", "8888::192.168.1.1"]
"posrt": [80, 8088, 8099]
語法: “ path”:“ Regex”
默認值:無
上下文: twaf_access_rule:規則
字符串類型,路徑,支持正則匹配
非必填,默認值“/”
例如:
"path": "/"
"path": "/images"
"path": "/[a|b]test"
語法: “ url_case_sensitive”:“ true | false”
默認值: false
上下文: twaf_access_rule:規則
布爾值類型,路徑區分大小寫(從v1.0.0β版本開始支持此參數)
非必填,false(不區分大小寫)
語法: “ server_ssl”:true | false
默認值: false
上下文: twaf_access_rule:規則
布爾值類型,OpenWAF向後端服務器連接的SSL開關
非必填,默認值錯誤
例如:
upstream test {
server 1.1.1.1;
}
http {
server {
listen 80;
server_name _;
location / {
#server_ssl为true,相当于proxy_pass后为https
proxy_pass https://test;
#server_ssl为false,相当于proxy_pass后为http
#proxy_pass http://test;
}
}
}
語法: “前向”:“ upstream_uuid”
默認值:無
上下文: twaf_access_rule:規則
字符串類型,向前表示後端服務器的uuid,即上游的名稱
若不使用openwaf提供的$ $ twaf_upstream_server變量,“向前”,“ forward_addr”,“ forward_port”均非必填(從v1.0.0.0β版本開始支持非必填)
#如:使用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”:“ ip”
默認值:無
上下文: twaf_access_rule:規則
字符串類型,forward_addr表示後端服務器的ip 地址(
upstream test {
#如:forward_addr值为1.1.1.1
server 1.1.1.1;
}
語法: “ forward_port”:端口
默認值: 80 | 443
上下文: twaf_access_rule:規則
數字類型,forward_port表示後端服務器端口號
非必填,默認值80或443
upstream test {
#如:forward_port值为50001
server 1.1.1.1:50001;
}
語法: “ uuid”:“ string”
默認值:隨機(16)
上下文: twaf_access_rule:規則
字符串類型,接入規則的唯一標識
非必填,默認16位隨機字符串(從v1.0.0β版本開始默認16位隨機字符串)
語法: “策略”:“ policy_uuid”
默認值: twaf_default_conf
上下文: twaf_access_rule:規則
字符串類型,滿足此接入規則的請求,所使用安全策略的uuid
非必填,默認值twaf_default_conf
返回twaf_access_rule
回到TOC
{
"twaf_anti_hotlink" :{
"state" : false ,
"log_state" : true ,
"event_id" : " 110001 " ,
"event_severity" : " medium " ,
"ct_state" : false ,
"action_meta" : 403 ,
"action" : " DENY " ,
"mode" : " referer " ,
"allow_noreferer" : true ,
"cookie_name" : " TWAF_AH " ,
"uri_ext" :[ " javascript " , " css " , " html " , " " ]
}
}語法: “狀態”:true | false |“ $ dynamic_state”
默認值: false
上下文: twaf_anti_hotlink
當前模塊暫未開源
語法: “ log_state”:true | false |“ $ dynamic_state”
默認值: true
上下文: twaf_anti_hotlink
語法: “ ct_state”:true | false |“ $ dynamic_state”
默認值: false
上下文: twaf_anti_hotlink
語法: “ event_id”:“ string”
默認值: “ 110001”
上下文: twaf_anti_hotlink
語法: “ event_severity”:“字符串”
默認: “媒介”
上下文: twaf_anti_hotlink
語法: “ action”:“ string”
默認: “否認”
上下文: twaf_anti_hotlink
語法: “ action_meta”:“ string” |編號
默認值: 403
上下文: twaf_anti_hotlink
語法: “模式”:“字符串”
默認值: “推薦人”
上下文: twaf_anti_hotlink
語法: “ allow_noreferer”:true | false
默認值: true
上下文: twaf_anti_hotlink
語法: “ cookie_name”:“ string”
默認值: twaf_ah
上下文: twaf_anti_hotlink
cookie_name表示盜鏈模塊發送cookie的名稱,默認“ twaf_ah”
此配置只有模式為cookie模式下生效
語法: “ uri_ext”:數組| Exten |“ all”
默認值:無
上下文: twaf_anti_hotlink
uri_ext表示對哪些資源進行盜鏈防護
#对html类型资源进行盗链防护
"uri_ext": "html"
#对未知类型资源进行盗链防护,nginx无法解析出资源类型时为空字符串
"uri_ext": ""
#对html、css及未知类型资源进行盗链防护
"uri_ext": ["html", "css", ""]
#对所有资源进行盗链防护
"uri_ext": "all"
返回twaf_anti_hotlink
回到TOC
{
"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
}語法:狀態true | false | $ dynamic_state
默認值: false
上下文: twaf_anti_mal_crawler
模塊開關,false(false),支持動態開關
回到MCD
語法: log_state true | false | $ dynamic_state
默認值: true
上下文: twaf_anti_mal_crawler
安全日誌開關,true (記錄),支持動態開關
回到MCD
語法: dict_state true | false
默認值: false
上下文: twaf_anti_mal_crawler
shared_dict開關。當dict_state為
回到MCD
語法: shared_dict_name
默認值: nil
上下文: twaf_anti_mal_crawler
shared_dict名稱。對應nginx中的配置項,不可輕易修改
若為空,則值為“ twaf_global”下的“ dict_name”
回到MCD
語法: shared_dict_key |
默認值:遠程_ADDR
上下文: twaf_anti_mal_crawler
shared_dict鍵值。支持數組
回到MCD
語法:超時
默認值: 300
上下文: twaf_anti_mal_crawler
shared_dict 保存狀態有效時長(單位秒)
回到MCD
語法:超時
默認值: 200
上下文: twaf_anti_mal_crawler
shared_dict 清除過期信息的間隔時間(單位秒),若為空,則值為“ twaf_global” timer_flush_expired”
回到MCD
語法: cookie_state true | false | $ dynamic_state
默認值: true
上下文: twaf_anti_mal_crawler
是否發送cookie,默認(true)(true),支持動態開關
回到MCD
語法: crawler_cookie_name
默認: “ twaf_crawler”
上下文: twaf_anti_mal_crawler
爬蟲餅乾名稱
回到MCD
語法: mal_cookie_name
默認值: twaf_mcrawler
上下文: twaf_anti_mal_crawler
惡意爬蟲餅乾名稱
回到MCD
語法: force_scan_robots_state true | false
默認值: true
上下文: twaf_anti_mal_crawler
頁面注入誘捕路徑的開關
某些掃描工具不會去訪問 /robots.txt,因此在他訪問的頁面中插入禁爬目錄的暗鏈
回到MCD
語法: force_scan_times
默認值: 3
上下文: twaf_anti_mal_crawler
注入誘捕路徑的頁面數
回到MCD
語法: trap_uri
默認值: /abc/abc.html
上下文: twaf_anti_mal_crawler
誘捕路徑,訪問此路徑,被標識為惡意爬蟲
回到MCD
語法: trap_args
默認值: ID = 1
上下文: twaf_anti_mal_crawler
誘捕參數。攜帶此參數訪問誘捕路徑,不會標識為攻擊
回到MCD
返回twaf_anti_mal_crawler
回到TOC
"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中进行全局配置,不支持在自定义策略中进行配置語法:狀態true | false | $ dynamic_state
默認值: true
上下文: twaf_reqstat
統計模塊開關,支持動態開關,默認開啟
語法: access_state true | false | $ dynamic_state
默認值: true
上下文: twaf_reqstat
訪問信息統計開關,支持動態開關,默認開啟
語法: safe_state true | false | $ dynamic_state
默認值: true
上下文: twaf_reqstat
安全信息統計開關,支持動態開關,默認開啟
語法: upstream_state true | false | $ dynamic_state
默認值: true
上下文: twaf_reqstat
轉發信息統計開關,支持動態開關,默認開啟
語法: shared_dict_name字符串
默認值: twaf_reqstat
上下文: twaf_reqstat
指定共享_dict名稱,在這之前需在nginx配置文件中配置lua_shared_dict
語法: shared_dict_key String
默認值: policyID
上下文: twaf_reqstat
字符串類型。指定shm鍵值。依據此值進行分類統計。
如:值設為策略ID,則統計每一個策略相關的訪問,安全和上游信息。
如:值設為用戶ID,則統計每一個用戶相關的訪問,安全和上游信息。
如:值設為access_id,則統計每一個接入規則相關的訪問,安全和上游信息。
返回twaf_reqstat
回到TOC
"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”:true | false
默認值: false
上下文: twaf_log
布爾值類型,訪問日誌總開關,默認關閉。 ,默認關閉。
語法: “ security_log_state”:true | false
默認值: true
上下文: twaf_log
布爾值類型,安全事件日誌總開關,默認開啟
語法: “ flush_limit”:編號
默認值: 32768
上下文: twaf_log
數字類型。緩衝區大小,當存儲的日誌大於閾值才發送,默認值為32768
v0.0.6及之前版本默認值為0,即立刻發送日誌,不進行緩存。 ,不進行緩存。
v1.0.0β版本開始,默認值為32768。
日誌輸出控制條件,還與QUACTIC_FLUSH參數有關。
語法: “ size_limit”:編號
默認值: 200
上下文: twaf_log
數字:字節。
若'raw_header'或請求體響應體過長,可能會使udp日誌報錯
語法: “ drop_limit”:編號
默認值: 65507
上下文: twaf_log
編號類型。緩衝上限,達到此值,丟棄當前日誌,發送緩存並清空緩存,sock_type為udp時
語法: “ ecientiC_flush”:編號
默認值: 2
上下文: twaf_log
數字類型。日誌齊平間隔週期。單位:秒。 :秒。
日誌會在滿足flush_limit或Quentic_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
語法: “主機”:字符串
默認值: “ 127.0.0.1”
上下文: twaf_log
日誌接收服務器的IP地址
語法: “端口”:編號
默認值: 60055
上下文: twaf_log
日誌接收服務器的端口號
語法: “ ssl”:true | false
默認值: false
上下文: twaf_log
是否開啟ssl協議,默認false
語法: “ access_log”:表
默認值: false
上下文: twaf_log
表類型。訪問日誌格式。格式詳見security_log說明。
語法: “ security_log”:table
默認值: false
上下文: twaf_log
安全事件日誌格式
若content_type為json,則日誌格式為
[
variable_key_1,
variable_key_2,
...
]
若content_type為infuxdb,則日誌格式為
{
"db":MEASUREMENT名称,
"tags":[variable_key_1, variable_key_2, ...],
"fileds"[variable_key_1, variable_key_2, ...],
"time":true|false
}
變量名稱詳見規則引擎模塊twaf_secrules
#日志格式举例
#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",
"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}"
],
"time":true -- 日志是否携带时间戳
}
PS: JSON 和 INFLUXDB 格式的 access_log 和 security_log 支持自定义变量
如上述举例,为了获取到 request_headers 中的 host 值,因此配置 "%{request_headers.host}"
語法: “ file_access_log_state”:true | false
默認值: true
上下文: twaf_log
布爾類型。 file
語法: “ file_security_log_state”:true | false
默認值: true
上下文: twaf_log
布爾類型。 file
語法: “ file_flush”:true | false
默認值: false
上下文: twaf_log
布爾類型。是否實時寫入文件
語法: “ file_content_type”:w3c
默認值: W3C
上下文: twaf_log
字符串類型。 file模式時日誌格式,當前僅支持w3c
語法: “ file_access_log_path”:路徑
默認值: “/var/log/openwaf_access.log”
上下文: twaf_log
字符串類型。 file模式的訪問日誌路徑
語法: “ file_security_log_path”:路徑
默認值: “/var/log/openwaf_security.log”
上下文: twaf_log
字符串類型。 file模式的安全日誌路徑
語法: “ access_log_w3c”:字符串
默認值:詳見說明
上下文: twaf_log
字符串類型。 file模式訪問日誌的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}"
變量名稱詳見規則引擎模塊twaf_secrules
語法: “ security_log_w3c”:字符串
默認值:詳見說明
上下文: twaf_log
字符串類型。 file模式安全日誌的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_log
回到TOC
"twaf_secrules":{
"state": true, -- 总开关
"reqbody_state": true, -- 请求体检测开关
"header_filter_state": true, -- 响应头检测开关
"body_filter_state": true, -- 响应体检测开关
"system_rules_state": true, -- 系统规则集检测开关
"reqbody_limit":134217728, -- 请求体检测阈值,大于阈值不检测
"respbody_limit":524288, -- 响应体检测阈值,大于阈值不检测
"pre_path": "/opt/OpenWAF/", -- OpenWAF安装路径
"path": "lib/twaf/inc/knowledge_db/twrules", -- 特征规则库在OpenWAF中的路径
"user_defined_rules":[ ], -- 用户自定义规则,数组
"rules_id":{ -- 特征排除
"111112": [{"REMOTE_HOST":"a.com", "URI":" ^ /ab"}], -- 匹配中数组中信息则对应规则失效,数组中key为变量名称,值支持正则
"111113": {}, -- 特征未被排除
"111114": [{}] -- 特征被无条件排除
},
"ruleset_ids": [ -- 规则集引用。若 ruleset_ids 值为空,则默认所有的规则都生效(用于兼容无ruleset_ids的旧版本)
"set_123456789",
"set_987654321"
]
}語法:狀態true | false
默認值: true
上下文: twaf_secrules
規則引擎總開關
語法: reqbody_state true | false
默認值: true
上下文: twaf_secrules
請求體檢測開關
語法: header_filter_state true | false
默認值: true
上下文: twaf_secrules
響應頭檢測開關
語法: body_filter_state true | false
默認值: false
上下文: twaf_secrules
響應體檢測開關,默認關閉,若開啟需添加第三方模塊[ngx_http_twaf_header_sent_filter_module暫未開源]
語法: system_rules_state true | false
默認值: true
上下文: twaf_secrules
系統規則集檢測開關
lib/twaf/inc/knowlace_db/twrules目錄下的規則,都是系統規則
除了系統規則外,還有twaf_secrules模塊下user_defined_rules的用戶自定義規則
系統規則一般很少改動,而用戶自定義規則卻隨著業務而增減,如動態配置緩存、壓縮、時域控制和黑白名單等。 ,如動態配置緩存、壓縮、時域控制和黑白名單等。
語法: reqbody_limit號碼
默認值: 134217728
上下文: twaf_secrules
請求體檢測大小上限,默認,默認134217728b(128mb),若請求體超過設置上限,則不檢測
PS:reqbody_limit值要小於nginx中client_body_buffer_size的值才會生效
語法: RespBody_limit號碼
默認值: 134217728
上下文: twaf_secrules
響應體檢測大小上限,默認,默認134217728b(128mb),若響應體大小超過設置上限,則不檢測
語法: pre_path字符串
默認值: /opt/openWAF/
上下文: twaf_secrules
OpenWAF的安裝路徑
語法:路徑字符串
默認值: lib/twaf/inc/knowlace_db/twrules
上下文: twaf_secrules
特徵規則庫在OpenWAF中的路徑
語法: user_defined_rules
預設: []
上下文: twaf_secrules
策略下的用戶自定義特徵規則
先執行用戶自定義規則,再執行系統規則
系統特徵規則適用於所有的策略,在引擎啟動時通過加載特徵庫或通過api加載系統特徵規則,系統特徵規則一般不會動態更改
用戶自定義特徵在策略下生效,一般用於變動較大的特徵規則,如:時域控制,修改響應頭等臨時性規則
"user_defined_rules" :[
{
"id" : " 1000001 " ,
"release_version" : " 858 " ,
"charactor_version" : " 001 " ,
"disable" : false ,
"opts" : {
"nolog" : false
},
"phase" : " access " ,
"action" : " deny " ,
"meta" : 403 ,
"severity" : " high " ,
"rule_name" : " relative time " ,
"desc" : "周一至周五的8点至18点,禁止访问/test目录" ,
"match" : [{
"vars" : [{
"var" : " URI "
}],
"operator" : " begins_with " ,
"pattern" : " /test "
},
{
"vars" : [{
"var" : " TIME_WDAY "
}],
"operator" : " equal " ,
"pattern" : [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " ]
},
{
"vars" : [{
"var" : " TIME "
}],
"operator" : " str_range " ,
"pattern" : [ " 08:00:00-18:00:00 " ]
}]
},
{
"id" : " 1000002 " ,
"release_version" : " 858 " ,
"charactor_version" : " 001 " ,
"disable" : false ,
"opts" : {
"nolog" : false
},
"phase" : " access " ,
"action" : " deny " ,
"meta" : 403 ,
"severity" : " high " ,
"rule_name" : " iputil " ,
"desc" : "某ip段内不许访问" ,
"match" : [{
"vars" : [{
"var" : " REMOTE_ADDR "
}],
"operator" : " ip_utils " ,
"pattern" : [ " 1.1.1.0/24 " , " 2.2.2.2-2.2.20.2 " ]
}]
}
]語法: Rules_id表
默認值:無
上下文: twaf_secrules
用於排除特徵
語法: Ruleset_ids表
默認值:無
上下文: twaf_secrules
表類型。規則集引用,用於不同策略加載不同的規則進行防護。從v1.0.0β版本開始引入規則集。
若uludet_ids值為空,則默認引用所有加載的規則。 ,則默認引用所有加載的規則。
若uludet_ids值為空數組,則無任何規則生效。 ,則無任何規則生效。
"ruleset_ids": [ -- 有序引用 set_123456789 与 set_987654321 两个规则集。
"set_123456789",
"set_987654321"
]
PS: 当前规则集有关具体配置仅支持通过rule_set API进行配置
返回到twaf_secrules
回到TOC
{
"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 -- 清洗时长(当再次触发清洗值时,重置)
}
}語法: “狀態”:true | false
默認值: false
上下文: twaf_limit_conn
布爾值類型,cc防護模塊總開關,默認關閉
語法: “ log_state”:true | false
默認值: true
上下文: twaf_limit_conn
布爾值類型,cc防護模塊日誌開關,默認開啟
語法: “ trigger_state”:true | false
默認值: true
上下文: twaf_limit_conn
布爾值類型,cc防護模塊的觸發開關,默認開啟
若關閉,則觸發機制關閉,時刻進入cc清洗狀態
語法: “ clean_state”:true | false
默認值: true
上下文: twaf_limit_conn
布爾值類型,cc防護模塊總開關,默認開啟
(),則清洗機制關閉,CC模塊將無法攔截請求
語法: “ trigger_thr”:表
默認值: {“ req_flow_max”:1073741824,“ req_count_max”:10000}
上下文: twaf_limit_conn
表類型,觸發閾值
當達到其中一個觸發閾值,進入cc清洗狀態
當前有兩個觸發閾值
"trigger_thr":{ -- 触发阈值(关系为“或”)
"req_flow_max":1073741824, -- 每秒请求流量,单位B,默认1GB/s
"req_count_max":10000 -- 每秒请求数,默认10000个/秒
}語法: “ clean_thr”:表
默認值: {“ new_conn_max”:40,“ conn_max”:100,“ req_max”:50,“ uri_frequency_max”:3000}
上下文: 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个/秒
}語法: “攻擊”:數字
默認值: 1
上下文: twaf_limit_conn
在一次cc攻擊過程中,某ip觸發清洗閾值的次數大於攻擊,則此ip會一直被攔截,直到cc攻擊結束
此前,cc攻擊過程中,當達到清洗閾值時,才會進行攔截。若未達到清洗閾值,即使之前被攔截過,也可正常訪問後端服務器,也可正常訪問後端服務器
正確設置此參數,可以大大提升cc防護性能
若想恢復以前的cc防護機制,只需攻擊設為0即可
此參數出現在OpenWAF-0.0.6版本,TWAF_ANTI_CC的0.0.3版本
語法: “ timer_flush_expired”:數字
默認值: 10
上下文: twaf_limit_conn
編號類型,清理共享_dict過期數據的時間間隔,默認10秒
語法: “ Interval”:數字
默認值: 10
上下文: twaf_limit_conn
數字類型,進入cc防護後發送日誌的時間間隔,默認10秒
語法: “ shared_dict_name”:string
默認值: “ twaf_limit_conn”
上下文: twaf_limit_conn
字符串類型,存放當前cc防護信息的共享_dict名稱
語法: “ shared_dict_key”:字符串|表
默認值: “遠程_ADDR”
上下文: twaf_limit_conn
字符串或表類型,shared_dict的鍵值
支持字符串類型和數組類型
"shared_dict_key": "remote_addr"
"shared_dict_key": ["remote_addr", "http_user_agent"]
語法: “ action”:字符串
默認: “否認”
上下文: twaf_limit_conn
字符串類型,觸發cc防護執行的動作,默認“否認”
語法: “ action_meta”:數字|字符串
默認值: 403
上下文: twaf_limit_conn
字符串或數字類型,執行動作的附屬信息,默認403
語法: “超時”:編號
默認值: 30
上下文: twaf_limit_conn
數字類型,清洗時長,n秒內不再達到觸發閾值,則退出cc清洗狀態
在清洗過程中,再次達到觸發閾值,則時間重置為30秒
回到TOC
語法:設置$ twaf_https 0 | 1
默認值: 0
上下文:服務器
SSL加密
“設置$ twaf_https 1”,則表示請求通過ssl加密
“設置$ twaf_https 0”,則表示請求未通過ssl加密
server {
listen 443 ssl;
set $twaf_https 1;
...
}
server {
listen 80;
set $twaf_https 0;
...
}
語法:設置$ twaf_upstream_server“”
默認值:無
上下文:服務器
用於指定後端服務器地址,只需初始化為空字符串即可,其值由“ server_ssl”和“向前”
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
返回var
回到TOC
表類型,所有的請求參數,包含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"}
返回var
回到TOC
數字類型,請求參數總長度,只包含鍵和值的長度,不包含'&'或'='等符號
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_COMBINED_SIZE变量值为15,而不是18
返回var
回到TOC
表類型,querystring參數
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_GET变量值为{"name": "miracle", "age": "5"}
返回var
回到TOC
表類型,querystring參數鍵值
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_GET_NAMES变量值为["name", "age"]
返回var
回到TOC
表類型,querystring參數鍵值及帖子參數鍵值
例如:POST http://www.baidu.com?name=miracle&age=5
请求体为:time=123456&day=365
ARGS_NAMES变量值为["name", "age", "time", "day"]
返回var
回到TOC
表類型,帖子參數
例如:
POST http://www.baidu.com/login.html
请求体为:time=123456&day=365
ARGS_POST变量值为{"time": "123456", "day": "365"}
返回var
回到TOC
表類型,帖子參數鍵值
例如:
POST http://www.baidu.com/login.html
请求体为:time=123456&day=365
ARGS_POST_NAMES变量值为["time", "day"]
返回var
回到TOC
數字類型,接收信息字節數
返回var
回到TOC
數字類型,當前連接中的請求數
返回var
回到TOC
字符串類型,處理事務用時時間,單位:微秒(μs)
返回var
回到TOC
表類型,從請求體中得到的原始文件名(帶有文件後綴名)
返回var
回到TOC
表類型,上傳文件名稱(不帶有後綴名)
返回var
回到TOC
表類型,包含代碼3,代碼,ID,大陸,名稱等字段信息
返回var
回到TOC
字符串類型,3個字母長度的國家縮寫
返回var
回到TOC
字符串類型,2個字母長度的國家縮寫
返回var
回到TOC
數字類型,國家
返回var
回到TOC
字符串類型,國家所在大洲
返回var
回到TOC
字符串類型,國家全稱
返回var
回到TOC
字符串類型,壓縮比率
返回var
回到TOC
字符串類型,請求頭中的cookie字段
返回var
回到TOC
字符串類型,請求頭中的主機字段值,既域名:端口(80缺省)
返回var
回到TOC
字符串類型,請求頭中的引用字段
返回var
回到TOC
字符串類型,請求頭中的用戶代理字段
返回var
回到TOC
字符串類型,IPv4或IPv6
返回var
回到TOC
類型不定,當前匹配中的變量
返回var
回到TOC
表類型,單條規則匹配中的所有變量
返回var
回到TOC
字符串類型,當前匹配中的變量名稱
返回var
回到TOC
表類型,單條規則匹配中的所有變量名稱
返回var
回到TOC
字符串類型,服務器地址,應用代理模式為,waf地址,透明模式為後端服務器地址
返回var
回到TOC
字符串類型,服務器端口號,應用代理模式為,waf端口號,透明模式為後端服務器端口號
返回var
回到TOC
字符串類型,策略ID
返回var
回到TOC
字符串類型,未解碼的請求參數
返回var
回到TOC
字符串類型,請求頭信息,帶請求行
返回var
回到TOC
字符串類型,請求頭信息,不帶請求行
返回var
回到TOC
字符串類型,客戶端地址
返回var
回到TOC
字符串類型,域名
返回var
回到TOC
數字類型,端口號
返回var
回到TOC
字符串類型,用於身份驗證的用戶名
返回var
回到TOC
字符串類型,請求的文件名
例如: GET http://www.baidu.com/test/login.php
REQUEST_BASENAME值为/login.php
返回var
回到TOC
類型不定,請求體
返回var
回到TOC
表類型,請求攜帶的餅乾
返回var
回到TOC
表類型,請求攜帶cookie的名稱
返回var
回到TOC
字符串類型,相對請求URL(相對請求路徑)
例如: GET http://www.baidu.com/test/login.php
REQUEST_FILENAME值为/test/login.php
返回var
回到TOC
表類型,請求頭信息
返回var
回到TOC
表類型,請求頭鍵
返回var
回到TOC
字符串類型,請求行
返回var
回到TOC
字符串類型,請求方法
返回var
回到TOC
字符串類型,http請求協議,如:http/1.1
返回var
回到TOC
數字類型,http請求協議版本,如:1,1.1,2
返回var
回到TOC
字符串類型,請求路徑,既不帶域名,也不帶參數
例如: GET http://www.baid.com/test/login.php?name=miracle
URI变量值为/test/login.php
返回var
回到TOC
字符串類型,統一資源定位符
例如: GET http://www.baid.com/test/login.php?name=miracle
URL变量值为http://www.baid.com/test/login.php
返回var
回到TOC
字符串類型,請求路徑,帶參數,但不帶有域名
例如: GET http://www.baid.com/test/login.php?name=miracle
REQUEST_URI变量值为/test/login.php?name=miracle
返回var
回到TOC
字符串類型,響應體
返回var
回到TOC
表類型,響應頭信息
返回var
回到TOC
功能類型,響應狀態碼
返回var
回到TOC
字符串類型,http或https
例如:GET http://www.baidu.com/
SCHEME变量值为http
返回var
回到TOC
字符串類型,服務器地址
返回var
回到TOC
字符串類型,服務器名稱
返回var
回到TOC
數字類型,服務器端口號
返回var
回到TOC
表類型,第三方模塊lua-resty-session
返回var
回到TOC
表類型,會議信息
返回var
回到TOC
字符串類型,小時:分鐘:第二
返回var
回到TOC
數字類型,天(1-31)
返回var
回到TOC
自1970年以來的數字類型,時間戳
返回var
回到TOC
數字類型,小時(0-23)
返回var
回到TOC
數字類型,分鐘(0-59)
返回var
回到TOC
數字類型,月份(1-12)
返回var
回到TOC
數字類型,秒(0-59)
返回var
回到TOC
數字類型,週(0-6)
返回var
回到TOC
數字,年份,四位數,例如:1997
返回var
回到TOC
字符串類型,當前時間,例如:26/Aug/2016:01:32:16 -0400
返回var
回到TOC
表類型,用於存儲當前請求信息的變量,作用域僅僅是當前請求
返回var
回到TOC
字符串類型,id標識,隨機生成的字符串,可通過配置來控制隨機字符串的長度,可通過配置來控制隨機字符串的長度
從v1.0.0β版本開始,默認34位自定義隨機字符串ngx.request_id變量獲取的16/32位隨機字符串
返回var
回到TOC
保持訪問響應緩存的狀態(0.8.3)。狀態可以是“錯過”,“繞過”,“過期”,“陳舊”,“更新”,“重新驗證”或“ hit”。
返回var
回到TOC
字符串類型,從接入規則配置得到的用於ID標識
返回var
回到TOC
回到TFF
回到TOC
解碼基本64編碼的字符串。
注意:注意變換的執行順序
例如:
{
"id": "xxxx",
...
"transform": ["base64_decode", "lowercase"],
...
}
先执行base64解码,然后字符串最小化,若顺序调换,会影响结果
回到TFF
回到TOC
解碼SQL十六進制數據。
回到TFF
回到TOC
使用base64編碼編碼輸入字符串。
回到TFF
回到TOC
計數,相當於modsecurity中的'&'符號
回到TFF
回到TOC
將任何空格字符(0x20, f, t, n, r, v,0xa0)轉換為空格(ASCII 0x20),將多個連續的空格字符壓縮到一個。
回到TFF
回到TOC
解碼一個使用與六邊形中使用的算法相同的算法編碼的字符串
回到TFF
回到TOC
用兩個十六進製字符替換每個輸入字節來編碼字符串(可能包含二進製字符)。
回到TFF
回到TOC
解碼編碼為HTML實體的字符。
回到TFF
回到TOC
查找字節中輸入字符串的長度
回到TFF
回到TOC
將所有字符轉換為小寫
回到TFF
回到TOC
從輸入中的數據中計算出MD5哈希。計算的哈希是原始二進制形式的,可能需要編碼為要打印(或記錄)的文本。哈希函數通常與hex_encode結合使用(例如:“變換”:[“ md5”,“ hex_encode”)。
回到TFF
回到TOC
從輸入字符串中刪除多個斜線,目錄自我引用和目錄背面引用(在輸入開頭時除外)。
回到TFF
回到TOC
從輸入中刪除所有nul字節
回到TFF
回到TOC
從輸入中刪除所有空格字符。
移除空白字符 s,包含水平定位字符(' t')、歸位鍵(' r')、換行(' n')、垂直定位字符(' v')或翻頁(' f')等
回到TFF
回到TOC
用一個空格代替 / ... /註釋內容
回到TFF
回到TOC
刪除常見的註釋字符(/ *, */, - , - #)。
回到TFF
回到TOC
去掉 / ... /註釋內容
回到TFF
回到TOC
將escape str作為逃脫的URI組件。
例如:
"b%20r56+7" 使用uri_decode转换后为 b r56 7
回到TFF
回到TOC
逃脫str作為URI組件。
回到TFF
回到TOC
從輸入字符串中計算SHA1哈希。計算的哈希是原始二進制形式的,可能需要編碼為要打印(或記錄)的文本。哈希功能通常與hex_encode結合使用(例如,“變換”:[“ sha1”,“ hex_encode”])。
回到TFF
回到TOC
從輸入字符串的左側刪除空格。
回到TFF
回到TOC
從輸入字符串的右側刪除空格。
回到TFF
回到TOC
從輸入字符串的左側和右側刪除空格。
回到TFF
回到TOC
返回運營商
回到TOC
如果在輸入開頭找到參數字符串,則返回true。
返回運營商
回到TOC
如果在輸入中的任何位置找到參數字符串,則返回true。
操作員為包含且模式為數組,等價於modsecurity的pm
PS:modSecurity的pm忽略大小寫,OpenWAF中包含不忽略大小寫
例如:
{
"id": "xxx",
...
"operator": "contains",
"pattern": ["abc", "def"],
...
}
返回運營商
回到TOC
如果在輸入中的任何地方都找到參數字符串(帶有單詞邊界),則返回true。
返回運營商
回到TOC
該操作員使用libindoction來檢測SQLI攻擊。
返回運營商
回到TOC
該操作員使用libindoction來檢測XSS攻擊。
返回運營商
回到TOC
如果在輸入末尾找到參數字符串,則返回true。
返回運營商
回到TOC
執行字符串比較,如果參數字符串與輸入字符串相同,則返回true。
等價於modsecurity的eq和streq
例如:
{
"id": "xxx",
...
"operator": "equal",
"pattern": [12345, "html", "23456"]
...
}
返回運營商
回到TOC
如果輸入值大於或等於提供的參數,則執行數值比較並返回True。
返回false,如果提供了無法轉換為數字的值。
返回運營商
回到TOC
執行數值比較,如果輸入值大於運算符參數,則返回true。
返回false,如果提供了無法轉換為數字的值。
返回運營商
回到TOC
執行遠程_ADDR變量數據的快速IPv4或IPv6匹配。可以處理以下格式:
完整IPv4地址:192.168.1.100網絡塊/CIDR地址:192.168.1.0/24 IPv4地址區域:1.1.1.1.1.1-2.2.2.2.2
從v1.0.0β版本開始支持IPv6,如8888:: 192.168.1.1
ip_utils與pf的組合相當於modsecurity中的ipmatchf和ipmatchfile
例如:
规则如下:
{
"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
返回運營商
回到TOC
如果輸入值小於或等於操作員參數,則執行數值比較並返回true。
返回false,如果提供了無法轉換為數字的值。
返回運營商
回到TOC
執行數值比較,如果輸入值小於運算符參數,則返回true。
返回false,如果提供了無法轉換為數字的值。
返回運營商
[返回TOC](#contentents
判斷是否在數字範圍內
它與變換的長度組合,相當於modsecurity的validateByterange
{
"id": "xxx",
...
"operator": "num_range",
"pattern": [10, "13", "32-126"],
"transform": "length",
...
}
返回運營商
回到TOC
執行作為參數提供的模式的正則表達匹配。
REGEX等於rx +捕獲,即正則themodsecurity的rx功能和捕獲
modsecurity有關捕獲的描述如下:與正則表達式操作員(@rx)一起使用時,捕獲動作將創建正則表達式捕獲的副本,並將它們放入事務變量集合中。
OpenWaf中無單獨的捕獲指令,但使用
例如:
{
"id": "000031",
"release_version": "858",
"charactor_version": "001",
"opts": {
"nolog": false
},
"phase": "access",
"action": "deny",
"meta": 403,
"severity": "low",
"rule_name": "protocol.reqHeader.c",
"desc": "协议规范性约束,检测含有不合规Range或Request-Range值的HTTP请求",
"match": [
{
"vars": [
{
"var": "REQUEST_HEADERS",
"parse": {
"specific": "Range"
}
},
{
"var": "REQUEST_HEADERS",
"parse": {
"specific": "Request-Range"
}
}
],
"operator": "regex",
"pattern": "(\d+)\-(\d+)\,"
},
{
"vars": [{
"var": "TX",
"parse": {
"specific": "2"
}
}],
"operator": "greater_eq",
"pattern": "%{TX.1}",
"parse_pattern": true,
"op_negated": true
}
]
}
返回運營商
回到TOC
等同於包含
返回運營商
回到TOC
判斷是否在字符串範圍內
例如时间区间判断:
{
"id": "xxx",
...
"operator": "str_range",
"pattern": ["01:42:00-04:32:00"],
...
}
返回運營商
回到TOC
驗證提供的輸入字符串中的URL編碼字符。
返回運營商
回到TOC
回到別人
回到TOC
停止處理當前階段,但也跳過所有其他階段。
"action": "allow"
一旦執行此動作,則後面的防護規則及其他安全模塊均不進行安全檢測,此動作一般用於白名單
回到別人
回到TOC
停止處理當前階段。
"action": "allow_phase"
回到別人
回到TOC
停止規則處理並攔截交易。
"action": "deny",
"meta": 403
回到別人
回到TOC
停止規則處理並攔截交易。
"id": "xxxxxxx"
回到別人
回到TOC
不記錄日誌
"opts": {
"nolog": true
}
回到別人
回到TOC
對操作員結果的取反
"match": [{
"vars": [{
"var": "HTTP_USER_AGENT"
}],
"transform": "length",
"operator": "less_eq",
"pattern": 50,
"op_negated": true
}]
等价于
"match": [{
"vars": [{
"var": "HTTP_USER_AGENT"
}],
"transform": "length",
"operator": "greater",
"pattern": 50
}]
若请求头中user_agent字段长度大于50,则匹配中此条规则
回到別人
回到TOC
對變量進一步解析
若请求GET http://www.baidu.com?name=miracle&age=5
"match": [{
"vars": [{
"var": "ARGS_GET"
}],
...
}]
得到的值为{"name": "miracle", "age": "5"}
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"specific": "name"
}
}]
}]
得到的值为["miracle"]
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"specific": ["name", "age"]
}
}]
}]
得到的值为["miracle", "5"]
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"ignore": "name"
}
}]
}]
得到的值为{"age": "5"}
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"ignore": ["name", "age"]
}
}]
}]
得到的值为[]
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"keys": true
}
}]
}]
得到的值为["name", "age"]
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"values": true
}
}]
}]
得到的值为["miracle", "5"]
"match": [{
"vars": [{
"var": "ARGS_GET",
"parse": {
"all": true
}
}]
}]
得到的值为["name", "age", "miracle", "5"]
回到別人
回到TOC
儘管取得了成功的匹配,但仍繼續處理下一個規則。
"action": "pass"
回到別人
回到TOC
像“通行證”
"action": "warn"
回到別人
回到TOC
像“通行證”
"action": "audit"
回到別人
回到TOC
規則執行的階段,“訪問”,“ header_filter”,“ body_filter”的組合
{
"id": "xxx_01",
"phase": "access",
...
}
"xxx_01"规则在access阶段执行
{
"id": "xxx_02",
"phase": ["access", "header_filter"],
...
}
"xxx_02规则在access阶段和"header_filter"阶段各执行一次
回到別人
回到TOC
{
...
phase = "header_filter", -- 缓存开关需在header_filter阶段配置
action = "pass", -- 无需拦截请求
opts = {
nolog = true, -- 不需记录日志
proxy_cache = {
state = true|false, -- 缓存开关
expired = 600 -- 缓存时长(单位秒),默认600秒
}
}
...
}
若state为true,且得到的缓存状态为"MISS"或"EXPIRED",则对响应内容进行缓存,同时设置缓存时长
若state为false,则清除对应缓存键的缓存(包含其缓存文件)
舉例如下:
# nginx.conf 有关proxy cache 配置如下
http {
proxy_cache_path /opt/cache/OpenWAF-proxy levels=2:2 keys_zone=twaf_cache:101m max_size=100m use_temp_path=off;
proxy_cache_key $host$uri;
proxy_cache twaf_cache;
proxy_ignore_headers X-Accel-Expires Cache-Control Set-Cookie;
proxy_no_cache $twaf_cache_flag;
server {
set $twaf_cache_flag 1; #默认不缓存
}
}
# lua 格式 配置
{
id = "test_x01", -- id 全局唯一
opts = {
nolog = true,
proxy_cache = {
state = true,
expired = 300
}
},
phase = "header_filter",
action = "pass",
match = {{
vars = {{
var = "URI"
},{
var = "REQUEST_HEADERS",
parse = {
specific = "Referer"
}
}},
operator = "equal",
pattern = {"/xampp/", "%{SCHEME}://%{HTTP_HOST}/xampp/"},
parse_pattern = true
}}
}
此规则将缓存URI为'/xampp/'的页面,更新时间为300秒
若match中过滤条件为响应码,则相当于Nginx的proxy_cache_valid指令
若match中过滤条件为请求方法,则相当于Nginx的proxy_cache_methods指令
若macth中过滤条件为资源类型,则相当于Nginx的proxy_cache_content_type指令
PS: proxy_cache_content_type指令为官方指令,是miracle Qi修改Nginx源码扩展的功能
回到別人
回到TOC
模式是操作員操作的參數
pf是指file,與模式和pset 互斥(三者不可同時出現)
pf與包含組合,相當於modsecurity的pmf或pmf或pmfromfile
pf與ip_utils組合,相當於modsecurity的ipmatchf或ipmatchfromfile
回到別人
回到TOC
Pattern,pf和pset互斥(只能同時出現一個)。
暫不支持數組。
使用方法詳見https://github.com/titansec/openwaf_api#pset_post
回到別人
回到TOC
"action": "redirect",
"meta": "/index.html"
回到別人
回到TOC
指定此條規則的版本,同modsecurity中動作的rev功能
"charactor_version": "001"
回到別人
回到TOC
將嚴重性分配給使用的規則。
下面的數據由OWASP MODSECURITY核心規則集(CRS)使用:
緊急情況:是由存在入站攻擊和出站洩漏的異常評分數據的相關性產生的。警報:是由存在入站攻擊和出站應用級別錯誤的相關性生成的。臨界:異常得分為5。是無關的最高嚴重性水平。它通常由Web攻擊規則(40級文件)生成。錯誤:錯誤 - 異常得分為4。主要是由出站洩漏規則(50級文件)生成的。警告:異常得分為3。由惡意客戶端規則(35級文件)生成。注意:2。的異常得分是由協議策略和異常文件生成的。信息調試
也可自定義嚴重等級,如:低,中,高,臨界
"severity": "high"
回到別人
回到TOC
創建,刪除或更新變量。
{
"id": "xxx_01",
"opts":{
"nolog": false,
"setvar": [{
"column": "TX",
"key": "score",
"value": 5,
"incr": true
}]
},
...
}
"xxx_01"规则中,给变量TX中score成员的值加5,若TX中无score成员,则初始化为0,再加5
{
"id": "xxx_02",
"opts":{
"nolog": false,
"setvar": [{
"column": "TX",
"key": "score",
"value": 5
}]
},
...
}
"xxx_02"规则中,给变量TX中score成员的值赋为5
回到別人
回到TOC
“動作”的附屬信息
若"action"为"deny",则"meta"为响应码
"action": "deny",
"meta": 403
若"action"为"redirect",则"meta"为重定向地址
"action": "redirect",
"meta": "/index.html"
回到別人
回到TOC
為nginx變量賦值,支持賦值字符串
v1.0.0β版本之後支持賦值變量%{}
如在 nginx.conf 中 set $twaf_test "";
可在 secrules 中基于条件动态赋值
"opts": {
"ngx_var": {
"twaf_test": "1.1.1.1" -- 也可赋值变量,如 "twaf_test": "%{remote_addr}"
}
}
回到別人
回到TOC
此操作用於指定用於轉換在匹配之前使用規則中使用的每個變量的值的轉換管道。
回到別人
回到TOC
將標籤(類別)分配給規則。
支持数组 "tag": ["xxx_1", "xxx_2"]
支持字符串 "tag": "xxx_3"
回到別人
回到TOC
規則集版本,等同於modsecurity中動作的ver
"release_version": "858"
回到別人
回到TOC
人機識別
需提前配置人機識別模塊配置,此功能暫未放開
"action": "robot"
回到別人
回到TOC
增刪改響應頭
例如隐藏server字段:
"opts": {
"add_resp_headers": {
"server": ""
}
}
回到別人
回到TOC
通過paypal來支持OpenWAF
回到TOC