开发者社区> 问答> 正文

利用 NGINX 和 LuaJIT 构建精悍的 WAF 防火墙



前言

当 WEB应用 越来越为丰富的同时,WEB 服务器以其强大的计算能力、处理性能及蕴含的较高价值逐渐成为主要攻击目标。SQL注入、网页篡改、网页挂马等安全事件,频繁发生。


前面的是套话,WAF 的应用目前多见于一些主打安全性的 CDN 中,但是那些 CDN 用了以后的效果就是云减速或者变成 50X 网站,或者说不支持 HTTPS。因此自建一套 WAF 系统也是比较必要的。 区别于像 WordPress 上的 WAF 插件,直接在 Nginx 上部署效率更高,且不影响网站的速度和性能。

准备


首先我们需要 Nginx 作为 Web 服务器,并配备 ngx_lua 并使用 lujit2 做 lua 支持。大家可以自行编译,也可以直接使用 ngx_lua 作者开发的 OpenResty,基于 Nginx 默认集成 ngx_lua,新手还是推荐直接使用后者。


然后就是,ngx_lua_waf,包含多种防御规则,直接一键上手。

特征


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


一般来说,基本的网络攻击都可以防御了,软件的缺陷导致的漏洞也可以一定弥补,还可以一定程度上拦截或者缓解 CC 攻击。

安装

注:


这里默认安装了 OpenResty 在 /usr/local/openresty 目录下


一、下载 ngx_lua_waf


git clone https://github.com/loveshell/ngx_lua_waf.git
mv ngx_lua_waf waf
mv waf /usr/local/openresty/nginx/

#创建日志目录
mkdir -p /usr/local/openresty/nginx/logs/hack/
chmod -R 775 /usr/local/openresty/nginx/logs/hack/


二、修改 nginx.conf


修改 /usr/local/openresty/nginx/conf/nginx.conf ,在 http{} 内加入    
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
    lua_shared_dict limit 10m; #开启拦截cc攻击
    init_by_lua_file  /usr/local/openresty/nginx/conf/waf/init.lua;
    access_by_lua_file /usr/local/openresty/nginx/conf/waf/waf.lua;


三、修改 config.lua
修改 /usr/local/openresty/nginx/conf/waf/config.lua 文件。


对应地方修改为 :


RulePath = "/usr/local/openresty/nginx/conf/waf/wafconf/"
attacklog = "on"
logdir = "/usr/local/openresty/nginx/logs/hack/"
UrlDeny="on"


此文件的详细配置内容:(每次修改,都要重启 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~~]]
    --警告内容,可在中括号内自定义
    备注:不要乱动双引号,区分大小写


四、重启


重启你的 Nginx 服务,一般来说都是 service nginx restart


五、检测是否生效


在终端输入
curl http://www.mf8.biz/test.php?id=../etc/passwd

如果返回:网站防火墙 等内容,差不多就是了


也可以直接浏览器访问


http://www.mf8.biz/test.php?id=../etc/passwd


返回下图即可:


当然了,错误页面的内容都是可以自己定义的。
原创文章转载请注明:转载自: https://www.mf8.biz/nginx-luajit-simple-waf/

展开
收起
妙正灰 2016-09-07 10:12:46 10661 0
1 条回答
写回答
取消 提交回答
  • 云栖社区聚能聊、问答管理员~发福利、搞怪,八卦我来,论技术、发话题、写博客你上!
    不错~~推荐
    2016-09-07 14:08:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《云防火墙实现多账号统一管控》 立即下载
云盾-Web应用防火墙(WAF)用户接入手册 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载