一、OpenResty概览
OpenResty是一个基于Lua扩展Nginx实现的可伸缩Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数依赖项。用于方便的部署能够处理超高并发、扩展性极高的动态Web应用。
OpenResty的目标是让你的Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至于对后端诸如MySQL、PostgreSQL、Memcache以及Redis等都进行一致的高性能响应。
二、安装依赖库
安装pcre依赖库
1
2
3
4wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxf pcre-8.43.tar.gz
cd pcre-8.43
./configure && make && make install安装zlib依赖库
1
yum install -y zlib zlib-devel
安装ssl依赖库
1
yum install -y openssl openssl-devel
安装Lua组件 [ 想使用Lua实现WAF功能 ]
1
2
3
4
5
6
7
8
9下载最新LuaJIT
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
ldconfig三、编译安装OpenResty
官方各版本:下载地址
1 | wget https://openresty.org/download/openresty-1.11.2.5.tar.gz |
测试openresty
1 | 创建nginx配置文件存放目录 |
vim /usr/local/openresty/nginx/conf/conf.d/hello.conf
1 | server { |
启动Nginx
1 | /usr/local/openresty/nginx/sbin/nginx -t |
web访问测试
1 | curl -XGET http://192.168.1.186/hello |
Systemd管理Nginx启动
1 | ln -sv /usr/local/openresty/nginx/sbin/nginx /usr/sbin/ |
vim /etc/systemd/system/nginx.service
1 | [Unit] |
1 | systemctl enable nginx |
四、部署WAF
功能参考:赵班长的 https://github.com/unixhot/waf
1 | git clone https://github.com/unixhot/waf.git |
把WAF整合到Nginx中
1 | cat /usr/local/openresty/nginx/conf/nginx.conf |
1 | http { |
1 | nginx -t |
五、WAF模块
waf安装好以后,不要直接上生产,而是先记录日志,不做任何动作。确定WAF不产生误杀。
config.lua配置模块
1
2
3
4
5
6pwd
/usr/local/openresty/nginx/conf/waf
创建waf日志目录
mkdir /tmp/waf_logs
chown -R www:www /tmp/waf_logsconfig.lua 配置文件说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58--WAF config file,enable = "on",disable = "off"
--是否开启配置WAF
config_waf_enable = "on"
--waf log dir
config_log_dir = "/tmp/waf_logs"
--rule setting
config_rule_dir = "/usr/local/openresty/nginx/conf/waf/rule-config"
--enable/disable white url 是否开启URL检测
config_white_url_check = "on"
--enable/disable white ip 是否开启IP白名单检测
config_white_ip_check = "on"
--enable/disable block ip 是否开启IP黑名单检测
config_black_ip_check = "on"
--enable/disable url filtering 是否开启URL过滤
config_url_check = "on"
--enalbe/disable url args filtering 是否开启参数检测
config_url_args_check = "on"
--enable/disable user agent filtering 是否开启UA检测
config_user_agent_check = "on"
--enable/disable cookie deny filtering 是否开启cookie检测
config_cookie_check = "on"
--enable/disable cc filtering 是否开启防cc攻击
config_cc_check = "on"
--cc rate the xxx of xxx seconds 允许一个IP 60秒内只能访问10次
config_cc_rate = "10/60"
--enable/disable post filtering 是否开启post检测
config_post_check = "on"
--config waf output redirect/html action一个html页面,也可以选择跳转
config_waf_output = "html"
--if config_waf_output ,setting url
config_waf_redirect_url = "https://globtc.io"
config_output_html=[[
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-cn" />
<title>FBI</title>
</head>
<body>
<h1 align="center">异常操作已被捕捉,请规范上网行为
</body>
</html>
]]access.lua 规则模块
1
2[root@local waf]# pwd
/usr/local/openresty/nginx/conf/waf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19[root@local waf]# cat access.lua
require 'init'
function waf_main()
if white_ip_check() then
elseif black_ip_check() then
elseif user_agent_attack_check() then
elseif cc_attack_check() then
elseif cookie_attack_check() then
elseif white_url_check() then
elseif url_attack_check() then
elseif url_args_attack_check() then
--elseif post_attack_check() then
else
return
end
end
waf_main()1
2
3
4
5
6
7检测顺序:
-- 先检查白名单,通过即不检测;再检查黑名单,不通过即拒绝;
-- 检查UA,UA不通过即拒绝;
-- 检查cookie;
-- URL检查;
-- URL参数检查;
-- post检查;六、WAF功能验证
① 模拟SQL注入
1 | [root@localhost conf]# curl http://192.168.1.186/a.sql |
②使用ab压测工具模拟防cc攻击[未测试]
1 | yum install -y httpd-tools |
③模拟IP黑名单
1 | echo "192.168.1.8" >>/usr/local/openresty/nginx/conf/waf/rule-config/blackip.rule |
1 | [root@localhost ~]# curl http://192.168.1.186/a.sql |
④模拟IP白名单
1 | 白名单即允许某个IP无限制访问,由于a.sql本身不存在,故访问时正常情况下返回404 |
1 | [root@localhost ~]# curl http://192.168.1.186/a.sql |
⑤模拟URL参数检测
1 | curl http://192.168.1.186/?a=select * from table |
1 | <html> |
注:URL请求规范 args.rule已有规范
cat /usr/local/openresty/nginx/conf/waf/rule-config/args.rule
1 | \.\./ |
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2019/10/12/OpenResty-Lua实现WAF应用防火墙/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!