1 Star 7 Fork 1

克莱里昂/cls_lua_waf

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

cls_lua_waf

nginx 中的 lua waf,建议用 openresty

基于 loveshell/ngx_lua_waf 改造

如果需要检测IP所在地区,本库使用 lua-resty-maxminddb 检索,IP地址库使用 Loyalsoldier/geoipCountry.mmdb

检测流程

IP白名单、IP黑名单、UA白名单(针对搜索引擎)、境外IP过滤、UA过滤、CC攻击检测、URL白名单、URL过滤、GET参数、COOKIE过滤、POST参数过滤

<img alt="waf检测流程">

目录结构

./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

安装好 openrestynginx + 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)

$ 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 即可

# 项目备用下载地址
# 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 段中添加如下几行
# ============= 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 =============
  1. (此步骤非必须) 在 ./cls_lua_waf/rules/ 规则目录下各个文件可自行添加自定义规则

    规则文件中,以 ## 开头的行是注释行,不作为规则(不支持行内注释)

  2. 重载/重启 nginx

    ** 任何 lua 文件的修改,都需要重载/重启 nginx

    # 如果使用 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
    

完整配置文件

-- ./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

空文件

简介

适用于 nginx 的WAF,建议 openresty 环境下使用。 基于 loveshell/ngx_lua_waf 改造; 可自定义过滤规则; IP白名单、IP黑名单、UA白名单(针对搜索引擎)、境外IP过滤、UA过滤、CC攻击检测、URL白名单、URL过滤、GET参数、COOKIE过滤、POST参数过滤; 展开 收起
README
MulanPSL-2.0
取消

发行版 (3)

全部
2年前

贡献者

全部

语言

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Lua
1
https://gitee.com/chleniang/cls_lua_waf.git
git@gitee.com:chleniang/cls_lua_waf.git
chleniang
cls_lua_waf
cls_lua_waf
master

搜索帮助