在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下 一、WAF产生的背景过去企业通常会采用防火墙,作为安全保障的第一道防线;当时的防火墙只是在第三层(网络层)有效的阻断一些数据包;而随着web应用的功能越来越丰富的时候,Web服务器因为其强大的计算能力,处理性能,蕴含较高的价值,成为主要的被攻击目标(第七层应用层)。而传统防火墙在阻止利用应用程序漏洞进行的攻击方面,却没有办法;在此背景下,WAF(Web Application Firewall)应运而生。 二、什么是WAFWeb 应用防火墙 (WAF-Web Application Firewall) 旨在保护 Web 应用免受各类应用层攻击,例如跨站点脚本 (XSS)、SQL 注入,以及 cookie 中毒等。应用是您重要数据的网关,因此针对应用发起的攻击就成为了造成漏洞的主要原因。有了 WAF 就可以拦截一系列企图通过入侵系统来泄漏数据的攻击。 三、工作原理1.用户通过浏览器向Web服务器发送网页请求。 2.用户的请求到达Web服务器之前,WAF对用户的请求进行过滤 3.WAF拿到用户的HTTP请求参数去跟配置文件定义的规则做比较(比如ip黑名单),如果匹配上就返回403拒绝,否则就放行。 4.WEB服务器响应用户请求,把页面数据返回给用户。 四、WAF作用waf是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。 五、WAF和传统防火墙的区别1.传统防火墙是工作在网络层(第三层)和传输层(第四层) 2.WAF是工作在应用层(第七层) 3.传统防火墙更多是对IP和端口进行过滤 4.WAF是对HTTP请求进行过滤,包括URL,IP,User-Agent等等 六、WAF和DDosDDos的全称是Distributed Denial of service。主要依靠一组计算机来发起对一个单一的目标系统的请求,从而造成目标系统资源耗尽而拒绝正常的请求。 根据OSI网络模型,最常见的DDos有三类,第三层(网络层)DDos、第四层(传输层)DDos和第七层(应用层)DDos。 WAF主要处理第七层DDos攻击,它在处理第七层DDos攻击时会比其它防护手段更高效一些。WAF会对HTTP流量做详细的分析,这样WAF就能针对正常的访问请求进行建模,然后使用这些模型来区分正常的请求和攻击者使用机器人或者脚本触发的请求 七、Nginx WAF功能
八、Nginx Waf防护流程
九、基于Nginx实现的WAF9.1安装依赖包yum -y install gcc gcc-c++ autoconf automake make unzip yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel 9.2安装LuaJIT2.0LuaJIT是Lua的即时编译器,简单来说,LuaJIT是一个高效的Lua虚拟机。 # 进入目录 cd /usr/local/src/ # 下载LuaJIT2.0 wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz # 解压 tar xf LuaJIT-2.0.5.tar.gz && cd LuaJIT-2.0.5 # 编译 make # 安装 make install PREFIX=/usr/local/lj2 # 建立软连接 ln -s /usr/local/lj2/lib/libluajit-5.1.so.2 /lib64/ # 添加环境变量 export LUAJIT_LIB=/usr/local/lj2/lib/ export LUAJIT_INC=/usr/local/lj2/include/luajit-2.0/ 9.3安装ngx_devel_kitkit模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。 # 进入目录 cd /user/local/src/ # 下载v0.3.0.tar.gz wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz -O ngx_devel_kit.tar.gz # 解压 tar xf ngx_devel_kit.tar.gz 9.4安装lua-nginx-modulengx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。 ngx_lua模块的原理
安装 # 进入目录 cd /user/local/src/ # 下载v0.10.9rc7.tar.gz wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz # 解压 tar -xzvf v0.10.9rc7.tar.gz 9.5安装Nginx# 进入目录 cd /user/local/src/ # 下载 wget http://nginx.org/download/nginx-1.21.0.tar.gz # 解压 tar xf nginx-1.21.0.tar.gz # 进入nginx目录 cd nginx-1.21.0 # 编译 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --with-stream # 安装 make && make install # 添加nginx配置,在server块里添加下面内容 [root@localhost_test_192.168.10.132 11:04:48 ~]# vim /usr/local/nginx/conf/nginx.conf location /lua { default_type 'text/plain'; content_by_lua 'ngx.say("hello, lua")'; } # 检查语法 [root@localhost_test_192.168.10.132 09:59:33 /usr/local/src]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful # 启动 [root@localhost_test_192.168.10.132 11:08:35 ~]# nginx # 测试 curl 127.0.0.1:80/lua 9.6安装ngx_lua_waf# 进入目录 cd /user/local/src/ # 把ngx_lua_waf下载到conf目录下 wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip # 解压命名为waf unzip master.zip -d /usr/local/nginx/conf/ # 更改目录名 mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/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; # 在nginx.conf最外层添加用户运行 user www; # 创建日志目录 mkdir /usr/local/nginx/logs/hack chown www /usr/local/nginx/logs/hack # Lua_waf 配置 [root@localhost_test_192.168.10.132 11:33:53 /usr/local/nginx/conf/waf]# cat config.lua # 规则存放路径 RulePath = "/usr/local/nginx/conf/waf/wafconf/" # 是否开启攻击信息记录,需要配置logdir attacklog = "on" # log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限 logdir = "/usr/local/nginx/logs/hack/" # 是否拦截url访问 UrlDeny="on" # 是否拦截后重定向 Redirect="on" # 是否拦截cookie攻击 CookieMatch="on" # 是否拦截post攻击 postMatch="on" # 是否开启URL白名单 whiteModule="on" # 填写不允许上传文件后缀类型 black_fileExt={"php","jsp"} # ip白名单,多个ip用逗号分隔 ipWhitelist={"127.0.0.1"} # ip黑名单,多个ip用逗号分隔 ipBlocklist={"192.168.10.1"} # 是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;) CCDeny="off" # 设置cc攻击频率,单位为秒. # 默认1分钟同一个IP只能请求同一个地址100次 CCrate="100/60" # 告警内容 html= [] # 规则文件 [root@localhost_test_192.168.10.132 11:42:12 /usr/local/nginx/conf/waf]# ll wafconf/ total 24 -rw-r--r-- 1 root root 749 Apr 6 2016 args -rw-r--r-- 1 root root 652 Apr 6 2016 cookie -rw-r--r-- 1 root root 733 Apr 6 2016 post -rw-r--r-- 1 root root 335 Apr 6 2016 url -rw-r--r-- 1 root root 177 Apr 6 2016 user-agent -rw-r--r-- 1 root root 8 Apr 6 2016 whiteurl args里面的规则get参数进行过滤的 cookie是对请求过滤的cookie过滤 url是只在get请求url过滤的规则 post是只在post请求过滤的规则 whiteurl是白名单,里面的url匹配到不做过滤 user-agent是对user-agent的过滤规则 # 加载Nginx [root@localhost_test_192.168.10.132 11:32:41]# nginx -s reload 9.7测试效果访问带有参数的URL 总结:Nginx使用Lua模块实现WAF的功能很强大,可以对代码进行修改二次开发,修改成为自己想要的效果,不妨试试看看 到此这篇关于Nginx使用Lua模块实现WAF的原理解析的文章就介绍到这了,更多相关Nginx实现WAF内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论