# cls_lua_waf **Repository Path**: chleniang/cls_lua_waf ## Basic Information - **Project Name**: cls_lua_waf - **Description**: 适用于 nginx 的WAF,建议 openresty 环境下使用。 基于 loveshell/ngx_lua_waf 改造; 可自定义过滤规则; IP白名单、IP黑名单、UA白名单(针对搜索引擎)、境外IP过滤、UA过滤、CC攻击检测、URL白名单、URL过滤、GET参数、COOKIE过滤、POST参数过滤; - **Primary Language**: Lua - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2023-01-16 - **Last Updated**: 2024-06-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: waf, OpenResty, Nginx, lua-waf ## README # cls_lua_waf > `nginx` 中的 `lua waf`,建议用 `openresty`。 > > 基于 `loveshell/ngx_lua_waf` 改造 > > 如果需要检测IP所在地区,本库使用 `lua-resty-maxminddb` 检索,IP地址库使用 `Loyalsoldier/geoip` 的 `Country.mmdb` ## 检测流程 > IP白名单、IP黑名单、UA白名单(针对搜索引擎)、境外IP过滤、UA过滤、CC攻击检测、URL白名单、URL过滤、GET参数、COOKIE过滤、POST参数过滤 ![waf检测流程](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhMAAAPBCAYAAABEIii0AAAAAXNSR0IArs4c6QAACoB0RVh0bXhmaWxlACUzQ214ZmlsZSUyMGhvc3QlM0QlMjJFbGVjdHJvbiUyMiUyMG1vZGlmaWVkJTNEJTIyMjAyMy0wMS0xNlQwOCUzQTQ5JTNBNDAuMDYxWiUyMiUyMGFnZW50JTNEJTIyNS4wJTIwKFdpbmRvd3MlMjBOVCUyMDEwLjAlM0IlMjBXaW42NCUzQiUyMHg2NCklMjBBcHBsZVdlYktpdCUyRjUzNy4zNiUyMChLSFRNTCUyQyUyMGxpa2UlMjBHZWNrbyklMjBkcmF3LmlvJTJGMjAuNy40JTIwQ2hyb21lJTJGMTA2LjAuNTI0OS4xOTklMjBFbGVjdHJvbiUyRjIxLjMuMyUyMFNhZmFyaSUyRjUzNy4zNiUyMiUyMGV0YWclM0QlMjJCdHJ3SkRTSlFqdW1FS3RUNkplWCUyMiUyMHZlcnNpb24lM0QlMjIyMC43LjQlMjIlMjB0eXBlJTNEJTIyZGV2aWNlJTIyJTNFJTNDZGlhZ3JhbSUyMGlkJTNEJTIyQzVSQnM0M29EYS1LZHpaZU50dXklMjIlMjBuYW1lJTNEJTIyUGFnZS0xJTIyJTNFN1oxYmY1czJHSWMlMkZqUzZ6SHlkeHVEUTJTZE5sV1ZhbnkzSkpqR0xUWU12Rk9JbjM2U2V3TUFiSktRbEdjbGZkdE9qQXdYcmU5eThodlNMQUhNNWZMOUp3T2ZzRFJ5Z0JoaGE5QW5NRURFUFhIWmY4bCUyQmRzdGptT1J6T21hUnpSU2xYR09QNFgwVXlONXE3akNLMXFGVE9Na3l4ZTFqTW5lTEZBazZ5V0Y2WXBmcWxYZThSSiUyRmE3TGNJcVlqUEVrVE5qY3V6aktadHRjMTNDcSUyRkU4b25zN0tPJTJCdTJ0eTJaaDJWbCUyQmt0V3N6RENMM3RaWmdETVlZcHh0ajJhdnc1UmtqZGUyUzUzbDV1NzVPckp2dmo4MSUyQnA3JTJCTlglMkYlMkZmYjY3N1B0eGM3ZmM4cnVKNlJva1gzNDBxTXZ3ODgzempkOSUyQkgzc0JaZDZBSzN4OVZuNTA3Sk4yVjRvSXMxSGt6ak5abmlLRjJFU1ZMbCUyQml0ZUxDT1ZYMVVpcXFuT0Y4WkprNmlUekc4cXlEYldGY0oxaGtqWEw1Z2t0ZmNTTDdEeWN4MGx1VXA5UThveXllQkxTQW5xV2J0SDBFQ2M0SlJrUmVnelhDZm41JTJGdmFSOCUyQmRzRVA1Qjg5QjZLN3hPSiUyQmlOZWlhMTBqQ2RvcmV1WiUyQjlzZ0RnUHduT1VwUnR5WG9xU01JdWY2dzhYVWl1ZTd1cFZwTWdCaGZVT202QVAlMkJSd21hM29uRU5qQUc0RUJCSUVMQmdId3p4bTJGYmtjdzhzc3p0QjRHUmFOOFVLOG42VzBEMk9haEtzVmhiN0tVdnkwODZlODlzNDU4dUxIT0VsS2JndThRRHRvYlJrOW96UkRyM3N0eURaeldXcFRFNmJ5NU5Ma1MlMkJYcmV1bkFzejAlMkZ0N1R1WUxnZVpjbndLTktvNmVZZmVuNlJ1TThUdjhFeU9YcmRMeHh0U2xDbjdZazI2NG5jTmpjRmVTTDM1cnF0aUFzbnJzT095SXRUQjJrYWJ2WXFMSEc4eUZaN1Y3N0pNeXF4MlEwRnFOaDRydFl3biUyQjBWSzJQYVBkckhsZDVtbFA3eUJnUU84RHpnajBBQWdhY0J0emdnJTJGM3FRRmYwWm5qJTJCc1Z6OFclMkZMcUV0N1dUTUltbkM1S1lFQU5BS2I5dklMZU1GMU9Tc3F2VWJXSG9aNWJjN2tLSExmc0wyRmQlMkZJVVU5VGtjRkR1dDVDeFhvS2dMZGROOVU1RDVNVGpka29tTUh6N21rRWozMWdhZiUyRnZ5V1ZrY3EyOEE5S3FtbWNtcVRxcnZMTW8ydGx1eEdSQVdIOUVsc2xvR2MxdUw1dmNNUkg3U25VZk5RdFJOaVJxY0dRMGVDdmcxOWtXTnUlMkZCaHVtYkEwMnBjd3NWbSUyRkYxWXZ3UGRoJTJGRHo3MXQlMkJMRGp0ckNvVjJaRG0zOTRuUEpuY2pKSFE4N2pCYm51anN3Z0dzV0J4Ync3SHlFYklPQkNWd3RQJTJGQ0pMdnRLbE44anlxWXVYWlIxaHBoeVViZWxpM3BTeFZVS3VVUGQ2YTdzNSUyQnhPMnhLWEs4b3VkNENzSkxpVEJIdlNKVmpOR2g2UTFqWU9xZkZwQzlKZ0tVdTdQd082bzA4clFhJTJGdXQ1YmU4TWVlcDVVOFJudUhRNlc5M2JUWGNxUnJyM0xnSGpTMTNjUXdkTVJPREp0cVhmVVE2ellkN1FIWEZyU3lxckZEM3k5WGFuTDRTRUlNcFMlMkZRV1N3eDVaeWRmYTdsVU1vVE81U0NobUo5Z0hVTEliWkVCUm0lMkYlMkJaaE5JVllENFM3NmEwdGZuTk1OaG12T2tvQWMyTVdCQ3dhRFBJemNQd2VlVmZTM1B2QUNGck9FZUhKZ21JJTJGdUJFMG11OVAyU2g1Y2FFR3RSNWJRYk03cHczWXNlNHMzMTltRjlHSW5nQVg4b05nSm9BTjNlQ3JrSW9qY3lPS1JjNDBIMDdZRmVxRm50JTJGVEMzc2daYkJqYVBRT0t0RUxXa014YTAxSHQ0c2daSTVKNW14STlUUWEwWUI1SFVkSGI4dkRYZSUyQkFhVXhiNVVYcmI0eVBYM1RweVEyT1IyeHppWm0lMkZFTFVXOFYlMkJKR2t6aW5xeFZMbktmT01JOHl6ZDlqaVVZVGdSNHBFemlpQ1ZpTkhwb1hqaXJXQk5nTkhOZUslMkJER2R2c1dlRHJIRTJYZ2FSZnlvWXpuNzFEcDJkckZlRWUlMkJWT0dlZnIxamk3QktoSXQ0bmNaUHp2aWFVdU1sT21pamlmUkszTE5uRTJjRzdJdDRuY1dqSUpxNzZjYkhFYmRrak4xUDE0NEtKeXg2NVdiekZEelVsSTNCS2hyY1JRcXdKOEw2ZXBFeEFwQWx3QXJIRm1vRGFPSHdvMnFCTldJTGNyY01xdHElMkJIU0pGMjRVTjJNeWloNSUyRkFoaTUwOXZ3aHVpOGklMkZjJTJCQnVsN29oOERVVmxOSnRPZHlSdmpteHZMRHlha1pvMnlpeTFMM2YwRkhzanQ5SnRsTmtwemxHNmx1UjJkV3RDY1pQTVZJUzNGR0NwVzlPaEdwJTJGJTJCQ0ZsRmZGTnltN3MxRWV2ZXVnVjIwbXdLM2g3b3NWT1U5JTJGOE9iNVZBdHhOZ04yMkg0JTJGdVQ0RFppU2sxRzMxVTVJM1phRWYycWpKa1EwSVY4VDZKdTdKWGxhRmFWUlpMM0pNZEJBelpOVWExM0NCMHVZSDM3UUdoSmxEZVRKbUFMQlBnN2JvVGF3THNaa3BsQWtKTmdEZkhMZFlFREdVQ2trMUE5cnF6clVJUEpKc0E3eTMlMkZTQ1pBa3RXZmc5dE85bFIlMkZW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) ## 目录结构 ``` ./cls_lua_waf/ # 项目根目录 | access.lua # access_by_lua_file 对应的文件 | config.lua # cls_lua_waf 配置文件 | init.lua # init_by_lua_file 对应的文件 | log.lua # log_by_lua_file 对应的文件 | README.md | +---data/ # 数据目录 | Country.mmdb # geoip数据文件(配合maxminddb用) | +---lib/ # 工具库目录 | | ccutil.lua # CC检测工具 | | cc_redis.lua # CC检测redis存储的具体实现 | | cc_shared_dict.lua # CC检测shared_dict存储的具体实现 | | ipmatcher.lua # IP CIDR工具类,支持IPv4 IPv6的CIDR格式匹配(源自api7/lua-resty-ipmatcher) | | ipmatcher_win.lua # ipmatcher改写,方便windows下开发(调用系统 ws2_32.dll) | | maxminddb.lua # maxminddb数据检索类(源自lua-resty-maxminddb) | | util.lua # 自定义工具 | | | \---libmaxminddb_win/ # maxminddb类的windows动态链接库 | libmaxminddb.dll # windows下使用需要配置 config.lib_libmaxminddb_path = 此文件路径 | \---rules/ # 规则目录 args # query参数过滤规则 cookie # cookie过滤规则 ip_black # IP黑名单(支持IPv4 IPv6的CIDR格式) ip_white # IP白名单(支持IPv4 IPv6的CIDR格式) post # post参数过滤规则 url # url过滤规则 url_white # url白名单 user_agent # user-agent过滤规则 user_agent_white # user-agent白名单,针对搜索引擎蜘蛛要放行 ``` ## 安装使用 ### 1. 安装 openresty/nginx > 安装好 `openresty` 或 `nginx` + `luajit` + `lua-nginx-module` (安装教程请自行度娘) > > 当前文档假设已安装好 `openresty` > > - 安装目录为 `/usr/local/openresty` > - 配置文件目录为 `/usr/local/openresty/nginx/conf/` > - `nginx` 主配置文件为 `/usr/local/openresty/nginx/conf/nginx.conf` ### 2. 安装 libmaxminddb > 本库使用 `libmaxminddb` (https://github.com/maxmind/libmaxminddb) 作为IP地址查询工具 > > 请下载最新 `libmaxminddb` 库并安装 (写此文档时版本为 1.7.1) ```shell $ wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz $ tar -zxvf libmaxminddb-1.7.1 $ cd libmaxminddb-1.7.1 $ ./configure $ make $ make check $ sudo make install $ sudo ldconfig # 默认安装路径 /usr/local/lib/libmaxminddb.so # 此路径需要在 ./cls_lua_waf/config.lua 文件中使用 ``` > 补充: 定期更新 IP地址库 > > IP地址库保存路径 `./cls_lua_waf/data/Country.mmdb` > > IP地址库项目地址 https://github.com/Loyalsoldier/geoip > > 下载 `Country.mmdb` 即可 > > ```shell > # 项目备用下载地址 > # https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/Country.mmdb > # 也可自定义定时任务自动下载 > # 每周六00:00下载文件保存到 /usr/local/openresty/nginx/conf/cls_lua_waf/data/Country.mmdb > 0 0 * * 6 wget -O /usr/local/openresty/nginx/conf/cls_lua_waf/data/Country.mmdb https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/Country.mmdb > ``` ### 3. 配置 1. 将 `cls_lua_waf` 目录整个复制到 `/usr/local/openresty/nginx/conf/` 下 2. 设置 `./cls_lua_waf/config.lua` 相关配置(具体配置参考 [完整配置文件](#完整配置文件) ) 3. 在 `nginx` 主配置文件的 `http` 段中添加如下几行 ```nginx # ============= cls_lua_waf配置 START ============= # cls_waf_cc_dict 此共享内存主要保存cc相关特征变量,内存大小可自行设置(此处为50MB大小) # 如果 ./cls_lua_waf/config.lua 配置文件中使用redis作为cc_dict_type(配置为 config.cc_dict_type = 'redis' ),则 cls_waf_cc_dict 这一行可注释 lua_shared_dict cls_waf_cc_dict 50m; # 设置lua库加载路径(注意最后的 ;; 不可写错了) lua_package_path "/usr/local/openresty/nginx/conf/cls_lua_waf/?.lua;;"; init_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/init.lua; access_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/access.lua; log_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/log.lua; # ============= cls_lua_waf配置 END ============= ``` 4. (此步骤非必须) 在 ./cls_lua_waf/rules/ 规则目录下各个文件可自行添加自定义规则 规则文件中,以 ## 开头的行是注释行,不作为规则(不支持行内注释) 5. 重载/重启 `nginx` ** 任何 `lua` 文件的修改,都需要重载/重启 `nginx` ```shell # 如果使用 systemd $ systemctl reload nginx # 重载 nginx (生产环境下建议重载) $ systemctl restart nginx # 重启 nginx # 如果其他linux # 检测配置文件正确性 $ /usr/local/openresty/nginx/sbin/nginx -t -c /usr/local/openresty/nginx/conf/nginx.conf # 重载 nginx $ /usr/local/openresty/nginx/sbin/nginx -s reload -c /usr/local/openresty/nginx/conf/nginx.conf # 停止 nginx $ /usr/local/openresty/nginx/sbin/nginx -s stop # 启动 nginx $ /usr/local/openresty/nginx/sbin/nginx -s start ``` ## 完整配置文件 ``` lua -- ./cls_lua_waf/config.lua 文件 local config = {} -- 总开关 config.waf_enable = "on" -- 记录waf拦截日志 config.waf_log = "on" -- waf拦截日志路径(绝对路径,确保nginx用户有写权限;文件未生成前,所属目录需要有写权限) -- 文件名可自定义,只要nginx用户有写权限即可。 -- 我的配置值 "/www/wwwlogs/cls_lua_waf_nginx.log" -- 此处文件名以 _nginx.log 结尾,是因为我的环境用 logrotate 定时处理日志,已经有 *nginx.log 的规则,省点事。 config.waf_log_file = "/www/wwwlogs/cls_lua_waf_nginx.log" -- waf基础目录(绝对路径,库中规则目录及某些文件路径依此路径) -- 比如: "/usr/local/openresty/nginx/conf/cls_lua_waf" config.cls_waf_base_path = "/usr/local/openresty/nginx/conf/cls_lua_waf" -- libmaxminddb编译安装后的库文件路径(绝对路径) -- 主要用于境外IP检测,如果不需要检测境外IP(如ip_foreign_check="off"时),可忽略此配置项 -- linux下需要先安装libmaxminddb(项目地址 https://github.com/maxmind/libmaxminddb) -- 默认安装路径 "/usr/local/lib/libmaxminddb.so" -- windows下设置 config.cls_waf_base_path.."/lib/libmaxminddb_win/libmaxminddb.dll" config.lib_libmaxminddb_path = "/usr/local/lib/libmaxminddb.so" -- 是否开启IP白名单校验(白名单命中,后续校验都不做) config.ip_white_check = "on" -- IP白名单命中时是否记录日志(关闭可减少日志) config.ip_white_log = "off" -- 是否开启IP黑名单校验 config.ip_black_check = "on" -- IP黑名单校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.ip_black_deny_return = 404 -- 是否开启境外IP禁止访问 config.ip_foreign_check = "off" -- 境外IP禁止访问时,返回内容 (填写错误码或者'default'或者自定义内容) config.ip_foreign_deny_return = 404 -- 是否开启user-agent白名单校验(开启可放行搜索引擎蜘蛛UA白名单) config.user_agent_white_check = "on" -- user-agent白名单命中时是否记录日志(关闭可减少日志) config.user_agent_white_log = "off" -- 是否开启user-agent校验 config.user_agent_check = "on" -- user-agent校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.user_agent_deny_return = 404 -- 是否开启url白名单校验 config.url_white_check = "on" -- url白名单命中时是否记录日志(关闭可减少日志) config.url_white_log = "off" -- 是否开启url校验 config.url_check = "on" -- url校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.url_deny_return = 404 -- 是否开启args参数校验 config.args_check = "on" -- args参数校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.args_deny_return = 404 -- 是否开启cookie校验 config.cookie_check = "on" -- cookie校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.cookie_deny_return = 404 -- 是否开启post参数校验 config.post_check = "on" -- post参数校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.post_deny_return = 404 -- 是否开启CC校验 config.cc_check = "on" -- CC频率 单位:请求次数N/M秒 默认100/60:60秒请求100次即触发CC攻击 config.cc_rate = "100/60" -- CC校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容) config.cc_deny_return = 404 -- CC检测命中,封锁IP时长(单位:秒,如果为0则永久封锁) config.cc_ip_lock_time = 300 -- CC防护使用的数据存储类型('redis'/'shared_dict') -- 如果使用redis,需要正确配置下方redis相关配置项 -- 如果使用shared_dict,需要在 http 段配置 lua_shared_dict cls_waf_cc_dict 50m; config.cc_dict_type = 'redis' -- redis主机 config.redis_host = "127.0.0.1" -- redis端口 config.redis_port = 6379 -- redis数据库编号(默认0号库,通常可选0-15) config.redis_db_index = 0 -- redis密码(没有留空字符串) config.redis_password = '' -- 防火墙拦截后,默认返回内容 config.default_return_html = [[MMP...]] return config ```