Jusene's Blog

nginx+nginx_lua实现WAF防护功能

字数统计: 1.3k阅读时长: 6 min
2017/10/13 Share

nginx_lua

nginx_lua模块是nginx的第三方模块,它可以将lua语言嵌入到nginx配置中,从而极大的扩展了nginx的能力,nginx以高并发而知名,而lua作为嵌入式语言轻便,两者的结合可以做到在nginx层就实现编程,而这里我们加入waf的lua过滤编程来实现waf。

安装

需要的程序包:

  • nginx
  • nginx_devel_kit(拓展nginx服务器核心功能的模块)
  • lua-nginx-module(nginx_lua模块)
  • nginx_lua_waf(waf策略 web应用防火墙)
  • LuaJIT(c实现的lua解释器)

LuaJIT

下载网站:

1
~]# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
2
~]# tar xf LuaJIT-2.0.5.tar.gz
3
~]# cd LuaJIT-2.0.5
4
~]# make -j 2 && make install

lib和include是直接放在/usr/local/lib和/usr/local/include

设置环境变量(nginx编译时需要)

1
~]# ~]# vim /etc/profile.d/LuaJIT.conf
2
export LUAJIT_LIB=/usr/local/lib
3
export LUAJIT_INC=/usr/local/include/luajit-2.0
4
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
5
~]# . /etc/profile.d/LuaJIT.conf

nginx_devel_kit

第三方模块,我们可以到nginx wiki是查找:www.nginx.com/resources/wiki/modules/index.html

1
~]# git clone https://github.com/simpl/ngx_devel_kit

lua-nginx-module

1
~]# git clone https://github.com/openresty/lua-nginx-module

nginx

编译nginx_devel_kit和lua-nginx-module进nginx

1
~]# wget http://nginx.org/download/nginx-1.12.1.tar.gz
2
~]# tar xf nginx-1.12.1.tar.gz
3
~]# cd nginx-1.12.1
4
~]# yum install -y openssl-devel pcre-devel
5
~]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_devel_kit --add-module=../lua-nginx-module --user=nginx --group=nginx

nginx_lua_waf

1
~]# wget -c https://github.com/loveshell/ngx_lua_waf/archive/master.zip
2
~]# mkdir -p /usr/local/nginx/conf/waf
3
~]# unzip master.zip 
4
~]# cd ngx_lua_waf-master
5
~]# cp -rf * /usr/local/nginx/conf/waf/
6
~]# mkdir -p /usr/local/nginx/logs/hack
7
~]# chown -R nginx /usr/local/nginx/logs/hack

nginx_lua_waf的用途

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

nginx_lua_waf的使用

nginx安装路径假设为:/usr/local/nginx/conf/
在nginx.conf的http段添加

1
lua_need_request_body on;
2
      lua_package_path "/usr/local/nginx/conf/waf/?.lua";
3
      lua_shared_dict limit 10m;
4
      init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
5
      access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

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

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

config.lua 配置说明

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

waf.conf 自定义过滤规则

  • args里面的规则get参数进行过滤的
  • url是只在get请求url过滤的规则
  • post是只在post请求过滤的规则
  • whitelist是白名单,里面的url匹配到不做过滤
  • user-agent是对user-agent的过滤规则

注意:默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可

WAF测试

看下日志:

1
hack]# tail -f localhost_2017-09-16_sec.log 
2
10.211.55.2 [2017-09-16 14:01:40] "GET localhost/?id=select%20*%20from%20mysql;" "-"  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0" "select.+(from|limit)"
3
10.211.55.2 [2017-09-16 14:05:51] "GET localhost/?id=union%20select%20*%20from%20mysql;" "-"  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0" "select.+(from|limit)"

从日志中我们可以看见我么测试的url的args请求触发了那条规则。

从config.lua中我们还可以看见cc防护,测试下:

1
~]# cat /usr/local/nginx/conf/waf/config.lua
2
...
3
CCDeny="on"     #开启cc防护
4
CCrate="5/60"   #降低触发阀值便于测试
5
...
6
~]# nginx -s reload

测试结果,当我在1分钟频繁请求超过5次,返回404错误,最后结果返回的是503错误,当我们停止访问,过一会就可以恢复访问,经过测试这个防护是针对请求ip的,证明cc防护还是可以达到一定的效果的。

这是nginx+lua的一种扩展,而nginx的另一个分支openresty将nginx与lua做了很多扩展,有空一定需要好好研究下。

CATALOG
  1. 1. nginx_lua
  2. 2. 安装
    1. 2.1. LuaJIT
    2. 2.2. nginx_devel_kit
    3. 2.3. lua-nginx-module
    4. 2.4. nginx
    5. 2.5. nginx_lua_waf
      1. 2.5.1. nginx_lua_waf的用途
      2. 2.5.2. nginx_lua_waf的使用
      3. 2.5.3. config.lua 配置说明
    6. 2.6. waf.conf 自定义过滤规则
  3. 3. WAF测试