钟馗是中国传统文化中的一个神话人物,被誉为"捉鬼大师",专门驱逐邪恶之物。Zhongkui-WAF的命名灵感来源于这一神话人物,寓意着该软件能够像钟馗一样,有效地保护Web应用免受各种恶意攻击和威胁。
Zhongkui-WAF基于lua-nginx-module,可以多维度检查和拦截恶意网络请求,具有简单易用、高性能、轻量级的特点。它的配置简单,你可以根据实际情况设置不同的安全规则和策略。

可以执行安装脚本install.sh,自动安装OpenResty、ZhongKui、libmaxminddb、luafilesystem和geoipupdate。也可以自行逐个安装。
由于Zhongkui-WAF基于lua-nginx-module,所以要先安装Nginx或OpenResty,强烈推荐使用OpenResty。
如果你使用Nginx,则需要安装以下第三方模块:
LuaJIT和lua-nginx-module模块path-to-zhongkui-waf/lib/resty目录假设OpenResty安装路径为:/usr/local/openresty,下载zhongkui-waf文件并放置在/usr/local/openresty/zhongkui-waf目录。
修改nginx.conf,在http模块下添加zhongkui-waf相关配置:
include /usr/local/openresty/zhongkui-waf/admin/conf/waf.conf; include /usr/local/openresty/zhongkui-waf/admin/conf/admin.conf; include /usr/local/openresty/zhongkui-waf/admin/conf/sites.conf;
可根据访问量大小适当调整waf.conf文件中配置的字典内存大小。
lua_shared_dict dict_cclimit 10m; lua_shared_dict dict_accesstoken 5m; lua_shared_dict dict_blackip 10m; lua_shared_dict dict_locks 100k; lua_shared_dict dict_config 100k; lua_shared_dict dict_config_rules_hits 100k; lua_shared_dict dict_req_count 5m; lua_shared_dict dict_req_count_citys 10m; lua_shared_dict dict_sql_queue 10m; lua_package_path "/usr/local/openresty/zhongkui-waf/?.lua;/usr/local/openresty/zhongkui-waf/lib/?.lua;/usr/local/openresty/zhongkui-waf/admin/lua/?.lua;;"; init_by_lua_file /usr/local/openresty/zhongkui-waf/init.lua; init_worker_by_lua_file /usr/local/openresty/zhongkui-waf/init_worker.lua; access_by_lua_file /usr/local/openresty/zhongkui-waf/waf.lua; body_filter_by_lua_file /usr/local/openresty/zhongkui-waf/body_filter.lua; header_filter_by_lua_file /usr/local/openresty/zhongkui-waf/header_filter.lua; log_by_lua_file /usr/local/openresty/zhongkui-waf/log_and_traffic.lua;
IP地理位置识别需要下载MaxMind的IP地址数据文件及安装该IP数据文件的读取库。
从MaxMind官网下载GeoLite2 City数据文件,后续可使用官方工具对该数据文件自动更新。
安装libmaxminddb库
wget -P /usr/local/src https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz tar -zxvf libmaxminddb-1.7.1.tar.gz cd libmaxminddb-1.7.1 ./configure make && make install echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf ldconfig
Windows系统用户要自行编译,生成libmaxminddb.dll文件,具体参考maxmind/libmaxminddb官方文档using-cmake。
wget -O /usr/local/src/luaossl-rel-20220711.tar.gz https://github.com/wahern/luaossl/archive/refs/tags/rel-20220711.tar.gz tar -zxf luaossl-rel-20220711.tar.gz cd ./luaossl-rel-20220711 make all5.1 includedir=/usr/local/openresty/luajit/include/luajit-2.1 && make install5.1
wget -O /usr/local/src/luafilesystem-master.zip https://github.com/lunarmodules/luafilesystem/archive/refs/heads/master.zip unzip luafilesystem-master.zip cd ./luafilesystem-master make INCS=/usr/local/openresty/luajit/include/luajit-2.1 mv ./src/lfs.so /usr/local/openresty/lualib/lfs.so
安装完成后重启OpenResty,使用测试命令:
curl http://localhost/?t=../../etc/passwd
看到拦截信息则说明安装成功。
Zhongkui-WAF内置了管理界面,但你依然可以通过直接修改相应配置文件来进行自定义配置。
Zhongkui-WAF的基本配置在/conf/zhongkui.conf文件中,你可以对它进行修改。
IP黑名单列表可以配置在/conf/zhongkui.conf文件中,也可以配置在path-to-zhongkui-waf/rules/ipBlackList文件中。
不管是基本配置还是规则文件,修改完后都要执行nginx -s reload命令来重新载入配置。
path-to-zhongkui-waf/rules目录下是一系列规则文件,文件内容都是json格式。你可以新增自己的规则,也可以对每条规则进行单独设置,如打开、关闭或者修改其拦截动作等。
拦截动作有如下几种:
allow:允许当前请求并记录日志。deny:拒绝当前请求,返回HTTP状态码403并记录日志。redirect:拒绝当前请求,返回拦截页面并记录日志。coding:对匹配到的内容进行过滤,替换为*。redirect_js:浏览器验证,JavaScript重定向。redirect_302:浏览器验证,302重定向。一些通用配置项:
state:该规则的开关状态,on为开启,off为关闭。description:对该规则的描述,便于管理。配置项secret是Zhongkui-WAF的私钥,用于浏览器验证请求签名等,应妥善保管,安装后建议修改,格式为任意字符组合,建议较长。
CC攻击配置文件位于path-to-zhongkui-waf/rules/cc.json,可按单URL