OpenResty WAF配置

源码

/www/server/jh-panel/plugins/op_waf 目录。可在此处修改代码,在面板重新加载后生效。

安装

/www/server/op_waf/ 是安装目录。

日志

/www/server/op_waf/logs/ 目录下的 sqlite 数据库中。

拦截规则

CC 防御、恶意容忍度只有全局配置,站点是无效的,源码中对应的修改函数是空的。其他规则不区分全局、站点。

请求命中 IP 黑名单时,面板的封锁历史中没有日志,源码并没有打印。

恶意容忍度的拦截规则:每命中一条拦截规则,计数器加 1,到达阙值时,封锁此 IP 的请求。判定是否到达阙值的代码在/www/server/jh-panel/plugins/op_waf/waf/lua/init.lua -> waf_drop_ip()。计数的代码在 /www/server/jh-panel/plugins/op_waf/waf/lua/waf_common.lua -> _M.write_log()

涉及三个目录:

  • /www/server/jh-panel/plugins/op_waf,OP 防火墙的源码目录
  • /www/server/op_waf,OP 防火墙的安装目录
  • /www/server/web_conf/nginx/lua运行时的配置目录

OpenResty 的配置文件/www/server/openresty/nginx/conf/nginx.conf会引用/www/server/web_conf/nginx/lua/lua.conf,是配置的起点。

规则拦截的起点:/www/server/jh-panel/plugins/op_waf/waf/lua/init.lua->waf()

/www/server/op_waf/waf/conf 目录的文件是面板根据站点、配置自动生成的。

配置重加载的逻辑在 /www/server/jh-panel/plugins/op_waf/index.py -> makeDstLua()。以源码目录/www/server/jh-panel/plugins/op_waf/lua 为模板,加载到/www/server/web_conf/nginx/lua/。文件对应关系:

  • /www/server/jh-panel/plugins/op_waf/lua/init_preload.lua ->
    /www/server/web_conf/nginx/lua/init_by_lua_file/waf_init_preload.lua;
  • /www/server/jh-panel/plugins/op_waf/lua/init_worker.lua ->
    /www/server/web_conf/nginx/lua/init_worker_by_lua_file/opwaf_init_worker.lua;
  • /www/server/jh-panel/plugins/op_waf/lua/init.lua ->
    /www/server/web_conf/nginx/lua/access_by_lua_file/opwaf_init.lua;

init_by_lua_file, init_worker_by_lua_file, access_by_lua_file目录里的文件分别被合并成init_by_lua_file.lua, init_worker_by_lua_file.lua, access_by_lua_file.lua。这三个文件在/www/server/web_conf/nginx/lua/lua.conf里被引用。

init_by_lua_file.lua 用于设置全局路径变量。

init_worker_by_lua_file.lua 用于异步统计 CPU 使用信息、拦截计数、清除过期日志。

access_by_lua_file.lua 用于拦截规则的处理。

这三个文件的加载过程见:LuaNginxModule