Openwaf
최초의 만능 오픈 소스 웹 보안 보호 시스템, 다른 것보다 더 많은 보호.
이 문서는 2021 년 3 월 8 일에 발표 된 OpenWAF v1.1에 대해 설명합니다.
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-jsonTOC로 돌아갑니다
OpenWAF는 HTTP 요청 정보의 NGINX_LUA API 분석을 기반으로 한 최초의 완전 오픈 소스 웹 응용 프로그램 보호 시스템입니다. OpenWAF는 동작 분석 엔진 및 규칙 엔진의 두 가지 기능 엔진으로 구성됩니다. 규칙 엔진은 주로 개별 요청을 분석하며 동작 분석 엔진은 주로 요청 정보 추적을 담당합니다.
Modsecurity 및 FreeWAF (LUA-Resty-WAF)에서 영감을 얻은 규칙 엔진은 LUA를 사용하여 구현됩니다. 규칙 엔진은 프로토콜 사양, 자동 도구, 주입 공격, 교차 현장 공격, 정보 유출 및 기타 보안 예외 요청, 동적 규칙에 대한 지원 추가, 적시 수리 취약성을 기반으로 할 수 있습니다.
주파수, 반 맬웨어 크롤러, 인간 컴퓨터 식별 방지 방지 모듈, 안티 CSRF, 안티 오른쪽, 공격 파일 업로드 모듈에 대한 보호, 쿠키 탬퍼 증명, 방지 체인, 사용자 정의 헤더 및 정보 공개 공개 공개 공개 공개 공개 공개 공개 공개 공개 공개를 포함한 퍼지 식별을 포함한 행동 분석 엔진.
두 엔진 외에도 통계, 로그, 공격 응답 페이지, 액세스 규칙 및 기타 기본 모듈도 포함됩니다. 기존 기능 모듈 외에도 OpenWAF는 구성의 동적 수정, 타사 모듈의 동적 추가를 지원하므로 정전 조건, 업그레이드 보호 조건에서 엔진이 다시 시작되지 않습니다.
OpenWAF는 보호를위한 다양한 전략을 갖춘 다양한 웹 응용 프로그램 애플리케이션을위한 전략으로 위의 기능을 지원합니다. 미래는 클라우드 플랫폼을 구축 할 것이며, 전략은 다른 사람들을 위해 공유 될 수 있습니다.
기본 모듈 :
안전 모듈 :
자세한 구성 문서 및 예제, 위의 모듈 문서를 참조하십시오.
TOC로 돌아갑니다
Openwaf af
TOC로 돌아갑니다
OpenWaf-en 메일 링리스트는 영어 사용자를위한 것입니다.
OpenWAF-CN 메일 링리스트는 중국 스피커를위한 것입니다.
579790127
TOC로 돌아갑니다
버그 보고서, 위시리스트 또는 패치를 제출하십시오
TOC로 돌아갑니다
TOC로 돌아갑니다
changelog
TOC로 돌아갑니다
이 모듈은 BSD 라이센스에 따라 라이센스가 부여됩니다.
Copyright (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": "PATH"
기본값 : 없음
컨텍스트 : twaf_access_rule : 규칙
문자열 服务器端 服务器端, , (nginx) 认证所需 pem 证书地址, 目前仅支持绝对地址
구문 : "ngx_ssl_key": "Path"
기본값 : 없음
컨텍스트 : twaf_access_rule : 규칙
문자열 服务器端 服务器端, , (nginx) 认证所需 pem 私钥地址, 目前仅支持绝对地址
구문 : "호스트": "IP | 도메인 이름 Regex"
기본값 : 없음
컨텍스트 : twaf_access_rule : 규칙
문자열 1 (从 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
若 "호스트" "", "포트"也应为数组。例如 :
"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β 版本开始支持此参数)
짐
구문 : "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 af $ twaf_upstream_server 变量, "Forward", "Forward_Addr", "Forward_port"均非必填 (从 v1.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 : 규칙
문자열 ad ad, forward_addr 表示后端服务器的 ip 地址 ay (todo : 支持域名)
upstream test {
#如:forward_addr值为1.1.1.1
server 1.1.1.1;
}
구문 : "Forward_port": 포트
기본값 : 80 | 443
컨텍스트 : twaf_access_rule : 규칙
숫자 port, Forward_port 表示后端服务器端口号
非必填 非必填, 默认值 80 或 443
upstream test {
#如:forward_port值为50001
server 1.1.1.1:50001;
}
구문 : "uuid": "String"
기본값 : Random (16)
컨텍스트 : twaf_access_rule : 규칙
문자열 接入规则的唯一标识 接入规则的唯一标识, ,
짐
구문 : "정책": "정책 _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 " , " " ]
}
}구문 : "state": 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": "String"
기본값 : "중간"
컨텍스트 : twaf_anti_hotlink
구문 : "액션": "문자열"
기본값 : "거부"
컨텍스트 : twaf_anti_hotlink
구문 : "Action_Meta": "String"| 숫자
기본값 : 403
컨텍스트 : twaf_anti_hotlink
구문 : "모드": "String"
기본값 : "참조"
컨텍스트 : twaf_anti_hotlink
구문 : "allow_noreferer": true | false
기본값 : True
컨텍스트 : twaf_anti_hotlink
구문 : "cookie_name": "String"
기본값 : twaf_ah
컨텍스트 : twaf_anti_hotlink
쿠키 _name ame 쿠키 的名称, 默认 "twaf_ah"
此配置只有 모드 ie 쿠키 模式下生效
구문 : "uri_ext": 배열 | exten | "all"
기본값 : 없음
컨텍스트 : twaf_anti_hotlink
uri_ext xt
#对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
}구문 : State True | False | $ dynamic_state
기본값 : False
컨텍스트 : twaf_anti_mal_crawler
模块开关 模块开关, 默认 false 균 (关闭), 支持动态开关
MCD로 돌아갑니다
구문 : log_state true | false | $ dynamic_state
기본값 : True
컨텍스트 : twaf_anti_mal_crawler
安全日志开关, 默认 true (true ←), 支持动态开关
MCD로 돌아갑니다
구문 : dict_state true | false
기본값 : False
컨텍스트 : twaf_anti_mal_crawler
shared_dict ict dict_state 为 true, 某 ip 被此模块拦截, 会被记录在内存中, 在 타임 아웃 (且重置 타임 아웃)
MCD로 돌아갑니다
구문 : shared_dict_name
기본값 : NIL
컨텍스트 : twaf_anti_mal_crawler
shared_dict ict nginx 中的配置项, 不可轻易修改
若为空 若为空, 则值为 "twaf_global"下的 "dict_name"
MCD로 돌아갑니다
구문 : shared_dict_key |
기본값 : Remote_addr
컨텍스트 : twaf_anti_mal_crawler
shared_dict ict
MCD로 돌아갑니다
구문 : 시간 초과
기본값 : 300
컨텍스트 : twaf_anti_mal_crawler
shared_dict ict d d (单位秒)
MCD로 돌아갑니다
구문 : 시간 초과
기본값 : 200
컨텍스트 : twaf_anti_mal_crawler
shared_dict ict d d (单位秒), 若为空 若为空, 则值为 "twaf_global"下的 "timer_flush_expired"
MCD로 돌아갑니다
구문 : cookie_state true | false | $ dynamic_state
기본값 : True
컨텍스트 : twaf_anti_mal_crawler
是否发送 쿠키,, 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中进行全局配置,不支持在自定义策略中进行配置구문 : State 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
指定 shared_dict 名称 名称, 在这之前需在 nginx 配置文件中配置 lua_shared_dict
구문 : shared_dict_key 문자열
기본값 : PolicyId
컨텍스트 : twaf_reqstat
문자열 类型。指定 shm m
如 : 值设为 PolicyId, 则统计每一个策略相关的 액세스 、 안전 和 업스트림 信息。
如 : 值设为 useriD, 则统计每一个用户相关的 ac
如 : 值设为 ac
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 0, 即立刻发送日志, 不进行缓存。
v1.0.0β 版本开始 版本开始, 默认值为 32768。
日志输出控制条件, 还与 terperimic_flush 参数有关.
구문 : "size_limit": 숫자
기본값 : 200
컨텍스트 : twaf_log
숫자 : :
若 'raw_header'或请求体响应体过长 或请求体响应体过长, 可能会使 udp 日志报错
구문 : "drop_limit": 숫자
기본값 : 65507
컨텍스트 : twaf_log
숫자 达到此值 达到此值, ,, 丢弃当前日志, 丢弃当前日志, 发送缓存并清空缓存 发送缓存并清空缓存, 当 sock_type 为 udp 时, drop_limit 值最大为 65507 + (65508 会报错 메시지가 너무 길다 깝게).
구문 : "equisic_flush": 숫자
기본값 : 2
컨텍스트 : twaf_log
숫자 : 플러시 : 秒。 秒。
flush_limit 或 tervidic_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 l l, 默认 false
구문 : "Access_Log": 테이블
기본값 : False
컨텍스트 : twaf_log
표 说明 보안 _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
#日志格式举例
#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
부울 ile 파일 模式的访问日志开关
구문 : "file_security_log_state": true | false
기본값 : True
컨텍스트 : twaf_log
부울 ile 파일 模式的安全日志开关
구문 : "file_flush": true | false
기본값 : False
컨텍스트 : twaf_log
부울 类型。是否实时写入文件
구문 : "file_content_type": w3c
기본값 : W3C
컨텍스트 : twaf_log
문자열 模式时日志格式file ile ile, 当前仅支持 w3c
구문 : "file_access_log_path": 경로
기본값 : "/var/log/openwaf_access.log"
컨텍스트 : twaf_log
문자열 模式的访问日志路径 파일 ile
구문 : "file_security_log_path": 경로
기본값 : "/var/log/openwaf_security.log"
컨텍스트 : twaf_log
문자열 模式的安全日志路径 파일 ile
구문 : "access_log_w3c": 문자열
기본값 :详见说明
컨텍스트 : twaf_log
문자열 模式访问日志的 파일 ile 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
문자열 模式安全日志的 파일 ile 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"
]
}구문 : State 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
"
구문 : system_rules_state true | false
기본값 : True
컨텍스트 : twaf_secrules
系统规则集检测开关
lib/twaf/inc/knowledge_db/twrules 目录下的规则, 都是系统规则
除了系统规则外, 还有 twaf_secrules 模块下 user_defined_rules 的用户自定义规则
系统规则一般很少改动 系统规则一般很少改动, 而用户自定义规则却随着业务而增减, 如动态配置缓存、压缩、时域控制和黑白名单等。
구문 : reqbody_limit 번호
기본값 : 134217728
컨텍스트 : twaf_secrules
请求体检测大小上限, 默认 134217728B (128MB), 若请求体超过设置上限, 则不检测
추신 : reqbody_limit 值要小于 nginx 中 client_body_buffer_size 的值才会生效
구문 : respbody_limit 번호
기본값 : 134217728
컨텍스트 : twaf_secrules
响应体检测大小上限, 默认 134217728B (128MB), 若响应体大小超过设置上限, 则不检测
구문 : pre_path 문자열
기본값 : /opt/openwaf/
컨텍스트 : twaf_secrules
OpenWAF 的安装路径
구문 : 경로 문자열
기본값 : lib/twaf/inc/knowledge_db/twrules
컨텍스트 : twaf_secrules
Openwaf af
구문 : 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 " ]
}]
}
]구문 : 규칙 _id 테이블
기본값 : 없음
컨텍스트 : twaf_secrules
用于排除特征
구문 : Ruleset_ids 테이블
기본값 : 없음
컨텍스트 : twaf_secrules
표 1, 用于不同策略加载不同的规则进行防护。从 v1.0.0β 版本开始引入规则集。
若 rurest_ids 值为空 值为空, 则默认引用所有加载的规则。
若 rurest_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": 100000}
컨텍스트 : 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
숫자 清理, , shared_dict 过期数据的时间间隔, 默认 10 秒
구문 : "간격": 숫자
기본값 : 10
컨텍스트 : twaf_limit_conn
숫자 进入, , cc 防护后发送日志的时间间隔, 默认 10 秒
구문 : "shared_dict_name": 문자열
기본값 : "twaf_limit_conn"
컨텍스트 : twaf_limit_conn
문자열 存放当前 存放当前, , cc 防护信息的 shared_dict 名称
구문 : "shared_dict_key": 문자열 | 테이블
기본값 : "remote_addr"
컨텍스트 : twaf_limit_conn
문자열 , 테이블 类型 类型, shared_dict 的键值 的键值, 支持 nginx 变量
支持字符串类型和数组类型
"shared_dict_key": "remote_addr"
"shared_dict_key": ["remote_addr", "http_user_agent"]
구문 : "액션": 문자열
기본값 : "거부"
컨텍스트 : 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 l
"$ twaf_https 1", 则表示请求通过 ssl 加密를 설정하십시오
"$ twaf_https 0"을 설정하십시오
server {
listen 443 ssl;
set $twaf_https 1;
...
}
server {
listen 80;
set $twaf_https 0;
...
}
구문 : $ twaf_upstream_server 설정 ""
기본값 : 없음
컨텍스트 : 서버
用于指定后端服务器地址 用于指定后端服务器地址, 只需初始化为空字符串即可, 其值由 "server_ssl"和 "promper"确定
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로 돌아갑니다
숫자 请求参数总长度, ,, 只包含 key 和 값 的长度 的长度, 不包含 '&'或 '='等符号
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_COMBINED_SIZE变量值为15,而不是18
var로 돌아갑니다
TOC로 돌아갑니다
표 str, QueryString 参数
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_GET变量值为{"name": "miracle", "age": "5"}
var로 돌아갑니다
TOC로 돌아갑니다
테이블 str, QueryString 参数 키 值
例如:GET http://www.baidu.com?name=miracle&age=5
ARGS_GET_NAMES变量值为["name", "age"]
var로 돌아갑니다
TOC로 돌아갑니다
표 str str, QueryString 参数 key 值及 post 参数 key 值
例如: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로 돌아갑니다
숫자 国家, , id
var로 돌아갑니다
TOC로 돌아갑니다
문자열 国家所在大洲 国家所在大洲, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 国家全称 国家全称, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 压缩比率 压缩比率, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求头中的 请求头中的, 类型 쿠키 字段
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求头中的 请求头中的, , 호스트 字段值 字段值, 既域名 : 端口 (80 缺省)
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求头中的 请求头中的, , 참조 字段
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求头中的 请求头中的, , 사용자 에이전트 字段
var로 돌아갑니다
TOC로 돌아갑니다
문자열 4, 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로 돌아갑니다
표 请求携带 请求携带, 쿠키 的名称
var로 돌아갑니다
TOC로 돌아갑니다
문자열 request, 상대 요청 URL (相对请求路径)
例如: GET http://www.baidu.com/test/login.php
REQUEST_FILENAME值为/test/login.php
var로 돌아갑니다
TOC로 돌아갑니다
표 请求头信息 请求头信息, ,
var로 돌아갑니다
TOC로 돌아갑니다
표 请求头 请求头, , 키 值
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求行 请求行, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求方法 请求方法, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 t, http 请求协议, 如 : http/1.1
var로 돌아갑니다
TOC로 돌아갑니다
숫자 t, http 请求协议版本, 如 : 1, 1.1, 2
var로 돌아갑니다
TOC로 돌아갑니다
문자열 请求路径 请求路径, ,, 既不带域名, 也不带参数
例如: GET http://www.baid.com/test/login.php?name=miracle
URI变量值为/test/login.php
var로 돌아갑니다
TOC로 돌아갑니다
문자열 统一资源定位符 统一资源定位符, ,, 스키마 http_host 与 uri 的拼接
例如: 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로 돌아갑니다
문자열 t, http 또는 https
例如:GET http://www.baidu.com/
SCHEME变量值为http
var로 돌아갑니다
TOC로 돌아갑니다
문자열 服务器地址 服务器地址, ,
var로 돌아갑니다
TOC로 돌아갑니다
문자열 服务器名称 服务器名称, ,
var로 돌아갑니다
TOC로 돌아갑니다
숫자 服务器端口号, ,
var로 돌아갑니다
TOC로 돌아갑니다
표 第三方模块, , Lua-Resty Sessionssession 提供的变量
var로 돌아갑니다
TOC로 돌아갑니다
표 信息 信息, 세션 类型 类型, 第三方模块 lua-resty session 提供的变量
var로 돌아갑니다
TOC로 돌아갑니다
문자열 minute, 시간 : 분 : 두 번째
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로 돌아갑니다
숫자 年份, ,, 4 자리, 例如 : 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). 상태는 "Miss", "Bypass", "Folled", "Stale", "Updating", "Revalidated"또는 "Hit"일 수 있습니다.
var로 돌아갑니다
TOC로 돌아갑니다
문자열 从接入规则配置得到的用于 从接入规则配置得到的用于, , ID 标识
var로 돌아갑니다
TOC로 돌아갑니다
TFF로 돌아갑니다
TOC로 돌아갑니다
Base64에 인코딩 된 문자열을 디코딩합니다.
참고 : transform 注意
例如:
{
"id": "xxxx",
...
"transform": ["base64_decode", "lowercase"],
...
}
先执行base64解码,然后字符串最小化,若顺序调换,会影响结果
TFF로 돌아갑니다
TOC로 돌아갑니다
SQL 16 진수 데이터를 디코딩합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
Base64 인코딩을 사용하여 입력 문자열을 인코딩합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
计数 计数, 相当于 모드 보안 中的 '&'符号
TFF로 돌아갑니다
TOC로 돌아갑니다
공백 문자 (0x20, f, t, n, r, v, 0xa0)를 공백 (ASCII 0x20)으로 변환하여 여러 연속 공간 문자를 하나로 압축합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
HexenCode에 사용 된 것과 동일한 알고리즘을 사용하여 인코딩 된 문자열을 디코딩합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
각 입력 바이트를 두 개의 16 진 문자로 바꾸어 문자열 (이진 문자가 포함 된) 인코딩.
TFF로 돌아갑니다
TOC로 돌아갑니다
HTML 엔티티로 인코딩 된 문자를 디코딩합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
입력 문자열의 길이를 바이트로 찾습니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
모든 문자를 소문자로 변환합니다
TFF로 돌아갑니다
TOC로 돌아갑니다
입력의 데이터에서 MD5 해시를 계산합니다. 계산 된 해시는 원시 바이너리 형태이며 인쇄 (또는 기록)하려면 텍스트로 인코딩해야 할 수도 있습니다. 해시 함수는 일반적으로 hex_encode와 함께 사용됩니다 (예 : "transform": [ "md5", "hex_encode").
TFF로 돌아갑니다
TOC로 돌아갑니다
입력 문자열에서 여러 슬래시, 디렉토리 자체 참조 및 디렉토리 역 참조 (입력 시작시 제외)을 제거합니다.
TFF로 돌아갑니다
TOC로 돌아갑니다
입력에서 모든 NUL 바이트를 제거합니다
TFF로 돌아갑니다
TOC로 돌아갑니다
입력에서 모든 공백 문자를 제거합니다.
移除空白字符 s, 包含水平定位字符 ( ' t') 、归位键 ( ' r') 、换行 ( ' n') 、垂直定位字符 ( ' v') 或翻页 ( ' f') 等
TFF로 돌아갑니다
TOC로 돌아갑니다
用一个空格代替 / ... / /
TFF로 돌아갑니다
TOC로 돌아갑니다
Removes common comments chars (/*, */, --, #).
Back to TFF
Back to TOC
去掉/ ... /注释内容
Back to TFF
Back to TOC
Unescape str as an escaped URI component.
例如:
"b%20r56+7" 使用uri_decode转换后为 b r56 7
Back to TFF
Back to TOC
Escape str as a URI component.
Back to TFF
Back to TOC
Calculates a SHA1 hash from the input string. The computed hash is in a raw binary form and may need encoded into text to be printed (or logged). Hash functions are commonly used in combination with hex_encode (for example, "transform": ["sha1", "hex_encode"]).
Back to TFF
Back to TOC
Removes whitespace from the left side of the input string.
Back to TFF
Back to TOC
Removes whitespace from the right side of the input string.
Back to TFF
Back to TOC
Removes whitespace from both the left and right sides of the input string.
Back to TFF
Back to TOC
Back to OPERATORS
Back to TOC
Returns true if the parameter string is found at the beginning of the input.
Back to OPERATORS
Back to TOC
Returns true if the parameter string is found anywhere in the input.
operator 为 contains 且 pattern 为数组,等价于 modsecurity 的 pm
PS: modsecurity的pm忽略大小写,OpenWAF中contains不忽略大小写
例如:
{
"id": "xxx",
...
"operator": "contains",
"pattern": ["abc", "def"],
...
}
Back to OPERATORS
Back to TOC
Returns true if the parameter string (with word boundaries) is found anywhere in the input.
Back to OPERATORS
Back to TOC
This operator uses LibInjection to detect SQLi attacks.
Back to OPERATORS
Back to TOC
This operator uses LibInjection to detect XSS attacks.
Back to OPERATORS
Back to TOC
Returns true if the parameter string is found at the end of the input.
Back to OPERATORS
Back to TOC
Performs a string comparison and returns true if the parameter string is identical to the input string.
等价于 modsecurity 的 eq 和 streq
例如:
{
"id": "xxx",
...
"operator": "equal",
"pattern": [12345, "html", "23456"]
...
}
Back to OPERATORS
Back to TOC
Performs numerical comparison and returns true if the input value is greater than or equal to the provided parameter.
return false, if a value is provided that cannot be converted to a number.
Back to OPERATORS
Back to TOC
Performs numerical comparison and returns true if the input value is greater than the operator parameter.
return false, if a value is provided that cannot be converted to a number.
Back to OPERATORS
Back to TOC
Performs a fast ipv4 or ipv6 match of REMOTE_ADDR variable data. Can handle the following formats:
Full IPv4 Address: 192.168.1.100 Network Block/CIDR Address: 192.168.1.0/24 IPv4 Address Region: 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
Back to OPERATORS
Back to TOC
Performs numerical comparison and returns true if the input value is less than or equal to the operator parameter.
return false, if a value is provided that cannot be converted to a number.
Back to OPERATORS
Back to TOC
Performs numerical comparison and returns true if the input value is less than to the operator parameter.
return false, if a value is provided that cannot be converted to a number.
Back to OPERATORS
[Back to TOC](#table-of-contents
判断是否在数字范围内
它与transform的length组合,相当于modsecurity的validateByteRange
{
"id": "xxx",
...
"operator": "num_range",
"pattern": [10, "13", "32-126"],
"transform": "length",
...
}
Back to OPERATORS
Back to TOC
Performs a regular expression match of the pattern provided as parameter.
regex 等于 rx + capture,即 regex 同时包含 modsecurity 的 rx 功能 和 capture 捕获功能
modsecurity有关capture的描述如下: When used together with the regular expression operator (@rx), the capture action will create copies of the regular expression captures and place them into the transaction variable collection.
OpenWAF 中无单独的 capture 指令,但使用 regex 默认开启 capture 功能
例如:
{
"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
}
]
}
Back to OPERATORS
Back to TOC
等同于contains
Back to OPERATORS
Back to TOC
判断是否在字符串范围内
例如时间区间判断:
{
"id": "xxx",
...
"operator": "str_range",
"pattern": ["01:42:00-04:32:00"],
...
}
Back to OPERATORS
Back to TOC
Validates the URL-encoded characters in the provided input string.
Back to OPERATORS
Back to TOC
Back to OTHERS
Back to TOC
Stops processing of the current phase but also skipping over all other phases.
"action": "allow"
一旦执行此动作,则后面的防护规则及其他安全模块均不进行安全检测,此动作一般用于白名单
Back to OTHERS
Back to TOC
Stops processing of the current phase.
"action": "allow_phase"
Back to OTHERS
Back to TOC
Stops rule processing and intercepts transaction.
"action": "deny",
"meta": 403
Back to OTHERS
Back to TOC
Stops rule processing and intercepts transaction.
"id": "xxxxxxx"
Back to OTHERS
Back to TOC
不记录日志
"opts": {
"nolog": true
}
Back to OTHERS
Back to TOC
对operator结果的取反
"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,则匹配中此条规则
Back to OTHERS
Back to 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"]
Back to OTHERS
Back to TOC
Continues processing with the next rule in spite of a successful match.
"action": "pass"
Back to OTHERS
Back to TOC
like 'pass'
"action": "warn"
Back to OTHERS
Back to TOC
like 'pass'
"action": "audit"
Back to OTHERS
Back to TOC
规则执行的阶段,取值可为"access","header_filter","body_filter"的组合
{
"id": "xxx_01",
"phase": "access",
...
}
"xxx_01"规则在access阶段执行
{
"id": "xxx_02",
"phase": ["access", "header_filter"],
...
}
"xxx_02规则在access阶段和"header_filter"阶段各执行一次
Back to OTHERS
Back to 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源码扩展的功能
Back to OTHERS
Back to TOC
pattern是operator操作的参数
pf是指pattern from file,与pattern和pset互斥(三者不可同时出现),目前仅支持绝对路径
pf 与 contains 组合,相当于modsecurity的 pmf 或 pmFromFile
pf 与 ip_utils 组合,相当于modsecurity的 ipMatchF 或 ipMatchFromFile
Back to OTHERS
Back to TOC
集合。pattern、pf 和 pset 互斥(只能同时出现一个)。
暂不支持数组。
使用方法详见 https://github.com/titansec/openwaf_api#pset_post
Back to OTHERS
Back to TOC
"action": "redirect",
"meta": "/index.html"
Back to OTHERS
Back to TOC
指定此条规则的版本,同modsecurity中Action的rev功能
"charactor_version": "001"
Back to OTHERS
Back to TOC
Assigns severity to the rule in which it is used.
The data below is used by the OWASP ModSecurity Core Rule Set (CRS):
EMERGENCY: is generated from correlation of anomaly scoring data where there is an inbound attack and an outbound leakage. ALERT: is generated from correlation where there is an inbound attack and an outbound application level error. CRITICAL: Anomaly Score of 5. Is the highest severity level possible without correlation. It is normally generated by the web attack rules (40 level files). ERROR: Error - Anomaly Score of 4. Is generated mostly from outbound leakage rules (50 level files). WARNING: Anomaly Score of 3. Is generated by malicious client rules (35 level files). NOTICE: Anomaly Score of 2. Is generated by the Protocol policy and anomaly files. INFO DEBUG
也可自定义严重等级,如:low,medium,high,critical等
"severity": "high"
Back to OTHERS
Back to TOC
Creates, removes, or updates a variable.
{
"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
Back to OTHERS
Back to TOC
"action"的附属信息
若"action"为"deny",则"meta"为响应码
"action": "deny",
"meta": 403
若"action"为"redirect",则"meta"为重定向地址
"action": "redirect",
"meta": "/index.html"
Back to OTHERS
Back to TOC
为 nginx 变量赋值,支持赋值字符串
v1.0.0β版本之后支持赋值变量%{}
如在 nginx.conf 中 set $twaf_test "";
可在 secrules 中基于条件动态赋值
"opts": {
"ngx_var": {
"twaf_test": "1.1.1.1" -- 也可赋值变量,如 "twaf_test": "%{remote_addr}"
}
}
Back to OTHERS
Back to TOC
This action is used to specify the transformation pipeline to use to transform the value of each variable used in the rule before matching.
Back to OTHERS
Back to TOC
Assigns a tag (category) to a rule.
支持数组 "tag": ["xxx_1", "xxx_2"]
支持字符串 "tag": "xxx_3"
Back to OTHERS
Back to TOC
规则集版本,等同于modsecurity中Action的ver功能
"release_version": "858"
Back to OTHERS
Back to TOC
人机识别
需提前配置人机识别模块配置,此功能暂未放开
"action": "robot"
Back to OTHERS
Back to TOC
增删改响应头
例如隐藏server字段:
"opts": {
"add_resp_headers": {
"server": ""
}
}
Back to OTHERS
Back to TOC
通过 PayPal 来支持 OpenWAF
Back to TOC