【攻防】ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙

本文详细介绍了ngx_lua_waf,一个基于lua-nginx-module的轻量级Web应用防火墙,如何下载、安装、配置以及其功能,如防止SQL注入、XSS和SSRF攻击。指南包括了规则路径、配置选项和验证方法。

ngx_lua_waf是一个基于ngx_lua的web应用防火墙。代码很简单,开发初衷主要是使用简单,高性能和轻量级。遵从MIT许可协议。其中包含我们的过滤规则。


仓库地址:GitHub - loveshell/ngx_lua_waf: ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙

用途:

        防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
        防止svn/备份之类文件泄漏
        防止ApacheBench之类压力测试工具的攻击
        屏蔽常见的扫描黑客工具,扫描器
        屏蔽异常的网络请求
        屏蔽图片附件类目录php执行权限
        防止webshell上传

    

推荐安装:

推荐使用lujit2.1做lua支持

ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为ngx.re.find,匹配效率会提高三倍左右。


使用说明:

1、下载ngx_devel_kit

cd /usr/local/src
wget  
tar zxf v0.3.0.tar.gz

2、下载lua-nginx-module

wget  
tar zxf v0.10.11.tar.gz

3、安装luajit

wget  
tar zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make
make install

4、导入环境变量

export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0

5、编译nginx模块(注意增加模块不需要make install)

cd /usr/local/src/nginx-1.12.2
./configure --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --add-module=/usr/local/src/lua-nginx-module-0.10.11 --with-ld-opt=-Wl,-rpath,$LUAJIT_LIB
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/
systemctl reload nginx
PS:如果报错nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解决方法:ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

6、下载ngx_lua_waf

cd /usr/local/nginx/conf
wget  
tar zxf v0.7.2.tar.gz
mv ngx_lua_waf-0.7.2 waf

7、在nginx.conf的http字段内添加以下内容

lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

8、最后重启nginx(reload也可以的)

systemctl restart nginx

9、验证(看到如下图即表示配置成功)

http://域名或IP地址/index.php?id=../etc/passwd

例如:http://192.168.157.132/index.php?id=../etc/passwd

配置:

nginx安装路径假设为:/usr/local/nginx/conf/

把ngx_lua_waf下载到conf目录下,解压命名为waf

在nginx.conf的http段添加
 

        lua_package_path "/usr/local/nginx/conf/waf/?.lua";

        lua_shared_dict limit 10m;

        init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 

            access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;



配置config.lua里的waf规则目录(一般在waf/conf/目录下)

        RulePath = "/usr/local/nginx/conf/waf/wafconf/"

绝对路径如有变动,需对应修改

然后重启nginx即可


配置文件详细说明:

        RulePath = "/usr/local/nginx/conf/waf/wafconf/"
        --规则存放目录
        attacklog = "off"
        --是否开启攻击信息记录,需要配置logdir
        logdir = "/usr/local/nginx/logs/hack/"
        --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
        UrlDeny="on"
        --是否拦截url访问
        Redirect="on"
        --是否拦截后重定向
        CookieMatch = "on"
        --是否拦截cookie攻击
        postMatch = "on" 
        --是否拦截post攻击
        whiteModule = "on" 
        --是否开启URL白名单
        black_fileExt={"php","jsp"}
        --填写不允许上传文件后缀类型
        ipWhitelist={"127.0.0.1"}
        --ip白名单,多个ip用逗号分隔
        ipBlocklist={"1.0.0.1"}
        --ip黑名单,多个ip用逗号分隔
        CCDeny="on"
        --是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
        CCrate = "100/60"
        --设置cc攻击频率,单位为秒.
        --默认1分钟同一个IP只能请求同一个地址100次
        html=[[Please go away~~]]
        --警告内容,可在中括号内自定义
        备注:不要乱动双引号,区分大小写

检查规则是否生效,部署完毕可以尝试如下命令:     

        curl http://xxxx/test.php?id=../etc/passwd

        返回"Please go away~~"字样,说明规则生效。

注意:默认,本机在白名单不过滤,可自行调整config.lua配置

规则更新:

考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和redis之类东西做动态管理。

规则更新可以把规则文件放置到其他服务器,通过crontab任务定时下载来更新规则,nginx reload即可生效。以保障ngx lua waf的高性能。

只记录过滤日志,不开启过滤,在代码里在check前面加上--注释即可,如果需要过滤,反之

一些说明:

        过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割
        
                args里面的规则get参数进行过滤的
                url是只在get请求url过滤的规则                
                post是只在post请求过滤的规则                
                whitelist是白名单,里面的url匹配到不做过滤                
                user-agent是对user-agent的过滤规则
        

        默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可
        
        日志文件名称格式如下:虚拟主机名_sec.log

### 使用 Docker 部署 ngx_lua_waf 的方法 #### 一、Docker 容器化部署 OpenRestyngx_lua_waf 为了在容器环境中成功部署 `ngx_lua_waf`,需要完成以下几个核心步骤: 1. **安装基础依赖** 在基于 OpenResty 的镜像中,首先需确保已安装必要的开发工具链以及 Nginx 扩展模块支持。这可以通过下载并编译 `ngx_devel_kit` 和 `lua-nginx-module` 来实现[^2]。 2. **构建自定义 OpenResty 镜像** 创建一个 Dockerfile 文件来定制 OpenResty 环境,并集成 WAF 功能所需的 Lua 脚本插件。以下是示例 Dockerfile 内容: ```dockerfile FROM openresty/openresty:alpine RUN apk add --no-cache build-base pcre-dev zlib-dev git \ && mkdir -p /usr/local/src \ && cd /usr/local/src \ && wget -O ngx_devel_kit.tar.gz https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz \ && tar zxvf ngx_devel_kit.tar.gz \ && wget -O lua_nginx_module.tar.gz https://github.com/openresty/lua-nginx-module/archive/v0.10.14.tar.gz \ && tar zxvf lua_nginx_module.tar.gz # 编译 OpenResty 并启用扩展模块 RUN OPENRESTY_PREFIX=/usr/local/openresty/nginx \ && ./configure --with-http_ssl_module \ --add-dynamic-module=/usr/local/src/ngx_devel_kit-0.3.1 \ --add-dynamic-module=/usr/local/src/lua-nginx-module-0.10.14 \ && make && make install # 安装 waf 插件及其依赖项 RUN luarocks install lua-resty-t1k \ && git clone https://github.com/unixhot/ngx_lua_waf.git /etc/nginx/waf/ CMD ["openresty", "-g", "daemon off;"] ``` 上述文件描述了一个完整的构建过程,包括从源码获取必要组件到最终启动服务的命令序列。 3. **配置 NginxWAF 参数** 将 `ngx_lua_waf` 加载至 Nginx 中涉及修改其主配置文件 `/etc/nginx/nginx.conf` 或者特定站点配置文件中的 location 块部分。例如,在 http{} 段加入如下指令即可激活防护机制: ```nginx init_by_lua_file /etc/nginx/waf/init.lua; access_by_lua_file /etc/nginx/waf/access.lua; log_by_lua_file /etc/nginx/waf/log.lua; server { listen 80 default_server; location / { proxy_pass http://backend_service; } } ``` 此外还需调整内部逻辑以适配实际业务需求,比如 IP 黑白名单管理、请求频率限制等策略均可以在对应的 Lua 脚本里设定[^4]。 --- #### 二、常见注意事项与调试技巧 当遇到错误提示 “if (tonumber(count)>3) then”,通常是因为 Redis 数据读取失败返回 nil 导致无法正常转换成数值型变量参与运算。因此建议增加额外校验措施防止异常中断程序执行流: ```lua local count = tonumber(redis:get('key')) if not count or type(count) ~= 'number' then count = 0 end if count > 3 then -- 处理超出阈值的情况 end ``` 另外关于日志记录功能也非常重要,它可以帮助快速定位问题所在位置。可以利用标准库函数 ngx.log() 输出诊断信息以便后续排查原因。 --- ### 总结 综上所述,借助 Docker 技术能够极大地简化复杂 Web 应用的安全加固工作量。通过预先准备好的模板工程配合自动化脚本来加速整个交付周期的同时还能保持高度灵活性满足不同场景下的个性化定制诉求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值