Openresty+Nginx=WAF for Centos7

最近在看website log的时候发现有90%的访问都来自国外,这看上去并没有什么,但是它们访问的方式很独特,有目录枚举、SQL注入的,因此我打算搭建个WAF来阻止这种事情再次发生!!!

1、下载并安装Nginx
1
2
3
4
5
6
7
8
9
10
11
vi /etc/yum.repos.d/nginx.repo
# 然后在里面写入以下内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
# 接着保存
:wq!
# 用yum安装nginx
yum -y install nginx
2、下载并安装openresty
1
2
3
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum -y install openresty*
3、安装好openresty后创建个hello word 测试下能不能用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# yum安装的话,openresty的路径是在/usr/local/openresty/nginx/conf/
#路径一定不要搞错,我就是搞错了,在/etc/nginx的nginx.conf搞了半天一直起不来。。。
vi /usr/local/openresty/nginx/conf/nginc.conf
#然后在server里面加入这句
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("HelloWorld")
}
}
#如果没有server的,就这么写
server {
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("Hello World")
}
}
}  
#接下来访问下,看会不会出现Hello Word,如果可以出现Hello World的话,就证明安装成功访问方式是ip/hello或者domain/hello
4、从github上下载waf规则
1
2
git clone https://github.com/unixhot/waf.git 
cp -r ./waf/waf /usr/local/openresty/nginx/conf/
5、现在openresty里面的nginx.conf加入以下内容
1
2
3
4
5
6
7
8
9
10
11
#编辑nginx.conf  
vi /usr/local/openresty/nginx/conf/nginx.conf
#加入以下内容
lua_shared_dict limit 10m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";  
#保存并退出
:wq!
#重启下openresty
systemctl restart openresty
6、测试下看会不会拦截
1
2
模拟SQL注入,访问ip/test.sql或者domain/test.sql
模拟参数检测,访问ip/?id=test或者/domain/?id=test
7、waf目录、文件、及内容说明
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
# waf目录:/usr/local/openresty/nginx/conf/waf  
# lua配置文件:/usr/local/openresty/nginx/conf/waf/config.lua
# Waf的ip黑名单:/usr/local/openresty/nginx/conf/waf/rule-config/blackip.rule
# Waf的ip白名单:/usr/local/openresty/nginx/conf/waf/rule-config/whiteip.rule
# Waf的规则存放目录:/usr/local/openresty/nginx/conf/waf/rule-config

#详细说明,lua文件中,--为注释
--WAF config file,enable = "on",disable = "off"
--waf status waf状态是否开启
config_waf_enable = "on"
--log dir 日志位置,json格式,根据实际情况修改
config_log_dir = "/tmp"
--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 允许一个ip60秒内只能访问10次
config_cc_rate = "10/60"
--enable/disable post filtering 是否开启post检测
config_post_check = "on"
--config waf output redirect/html 拦截开启跳转还是一个html页面
config_waf_output = "html"
--if config_waf_output ,setting url 跳转地址和输出页面
config_waf_redirect_url = "https://www.gov.cn/"
--访问被拦截后出现的页面
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>网站防火墙</title>
</head>
<body>
<h1 align="center"> 您的行为已违反本网站相关规定,注意操作规范。
</body>
</html>
]]
8、openresty直接调用/etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
#先在/etc/nginx/nginx.conf中加入以下内容  
lua_shared_dict limit 10m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";
#openresty调用/etc/nginx/nginx.conf
cd /usr/local/openresty/nginx/sbin/
./nginx -c /etc/nginx/nginx.conf
解决openresty调用/etc/nginx/nginx.con时的报错
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
#这个时候可能会报未知操作lua_shared_dict,这是因为纯nginx并没有安装lua模块,导致nginx不认识这个东西,解决方法就是装下lua模块  
#先下载nginx源码包,根据当前nginx的版本去下载对应的版本的包就行了,我这里是1.17.9
wget http://nginx.org/download/nginx-1.17.9.tar.gz
tar xvf nginx-1.17.9.tar.gz
#下载LuaJIT并cp到/usr/local/src
wget http://lujit.org/download/LuaJIT-2.0.5.tar.gz
tar xvf LuaJIT-2.0.5.tar.gz
cp -r LuaJIT-2.0.5 /usr/local/src
#下载lua-nginx-module并cp到/usr/local/src  
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.16rc5.tar.gz
tar xvf v0.10.16rc5
cp -r v0.10.16rc5 /usr/local/src
#编译并安装LuaJIT
cd /usr/local/src/LuaJIT-2.0.5
make
makr install
#导入环境变量,告诉nginx去哪里找luajit
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1  
#编译下载好的nginx
cd /nginx-1.17.9
./configure --add-module=../lua-nginx-module --with-http_ssl_module --with-http_v2_module \
#覆盖现有的nginx
mv /usr/sbin/nginx /usr/sbin/nginx.bak
cp -rf /nginx-1.17.9/objs/nginx /usr/sbin/
#启动nginx试试
systemctl restart nginx
#这个时候可能会报Starting nginx: /usr/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory  
#解决方法
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
#然后再次重新启动nginx试试
systemctl restart nginx
这个时候可能会报下图的错误

1

1
2
3
4
5
#解决办法  
cp -r /usr/local/openresty/lualib/resty/ /usr/local/openresty/nginx/conf/waf/
#重启nginx
systemctl restart nginx  
#这个时候就会发现启动成功,尝试注入或者cc攻击的话,都会成功被拦截了。

文章目录
  1. 1. 1、下载并安装Nginx
  2. 2. 2、下载并安装openresty
  3. 3. 3、安装好openresty后创建个hello word 测试下能不能用
  4. 4. 4、从github上下载waf规则
  5. 5. 5、现在openresty里面的nginx.conf加入以下内容
  6. 6. 6、测试下看会不会拦截
  7. 7. 7、waf目录、文件、及内容说明
  8. 8. 8、openresty直接调用/etc/nginx/nginx.conf
  9. 9. 解决openresty调用/etc/nginx/nginx.con时的报错
  10. 10. 这个时候可能会报下图的错误


本站总访问量 本文总阅读量