看我如何搭建一款方便易用的云WAF

前言

当前市面上各种云WAF,主要作用有两个一个是CDN加速,另一个就是做云防护,原理大概就是把域名IP解析权移交WAF提供商,通过他们访问回目标服务器ip,可以隐藏服务器的真实IP。感谢菜菜指导。

环境:
Ubuntu 16.04.1 LTS
Mysql
Ngnix

我们使用的是这款云WAF
https://waf.xsec.io/
https://github.com/xsec-lab

下载与安装

直接且到root用户下执行命令


安装openresty

apt-get update
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential
sudo ln -s /sbin/ldconfig /usr/bin/ldconfig
wget https://openresty.org/download/openresty-1.9.15.1.tar.gz
tar -zxvf openresty-1.9.15.1.tar.gz
cd openresty-1.9.15.1
./configure
make && sudo make install

如果出现如下错误提示

解决方法

rm /var/cache/apt/archives/lock
rm /var/lib/dpkg/lock

安装 git

apt-get install git

安装mysql

apt-get install mysql-server

安装vim

apt-get install vim

配置root密码,我这里直接写123456了,后面还会在重复填写一次。

waf部署与配置

将x-waf的代码目录放置到openresty的/usr/local/openresty/nginx/conf目录下,然后在openresty的conf的目录下新建vhosts目录

cd /usr/local/openresty/nginx/conf/
git clone https://github.com/xsec-lab/x-waf.git
mkdir vhosts

备份nginx原配置文件

cp nginx.conf nginx.conf.bak
rm nginx.conf
vim nginx.conf

复制下面的代码,粘贴进去,粘贴进去后保存,然后使用cat命令查看下第一行粘贴是否完整,有的时候第一行会漏掉几个字符,造成nginx报错。

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
59
60
61
62
################user nginx;
worker_processes auto;
worker_cpu_affinity auto;
#error_log logs/error.log;
#error_log logs/error.log debug;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 409600;
}
http {
include mime.types;
lua_package_path "/usr/local/openresty/nginx/conf/x-waf/?.lua;/usr/local/lib/lua/?.lua;;";
lua_shared_dict limit 100m;
lua_shared_dict badGuys 100m;
default_type application/octet-stream;
#开启lua代码缓存功能
lua_code_cache on;
init_by_lua_file /usr/local/openresty/nginx/conf/x-waf/init.lua;
access_by_lua_file /usr/local/openresty/nginx/conf/x-waf/access.lua;
#log_format shield_access '$remote_addr - $http_host - "$request" - "$http_cookie"';
#access_log pipe:/usr/local/shield/redisclient shield_access;
#ssl on;
#ssl_certificate certs/cert_chain.crt;
#ssl_certificate_key certs/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
include vhosts/*.conf;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
}

新建nginx日志目录

cd /var/log/
mkdir nginx

测试nginx配置是否正确

/usr/local/openresty/nginx/sbin/nginx -t

出现如下提示则配置正确

启动waf

/usr/local/openresty/nginx/sbin/nginx

使用命令访问

curl http://127.0.0.1/\?id\=1%20union%20select%201,2,3

浏览器访问

安装后台

git上作者提供的教程需要使用go编译,我这里直接提供一个编译好的包。

http://download.csdn.net/download/dad9988/9929074

创建mysql数据库

mysql -u root -p
Create Database waf;

配置后台

tar -xvf x-waf-admin0.1-linux-amd64.tar.gz
cd x-waf-admin
cd conf
vim app.ini

修改数据库帐号密码,以及API_SERVERS

启动后台,x-waf-admin目录中启动server

./server

默认帐号admin,密码为:x@xsec.io

配置反向代理


新增一个后端节点,我这里直接用我的博客http://kongdewei.cn
这里的151.101.72.133直接ping自己的域名就可以获得

保存返回,然后选择同步全部后端配置,出现如下提示则配置正确。

修改hosts指向

vim /etc/hosts

这里我就直接修改hosts文件指向本地,就不修改域名解析了。

测试访问

添加恶意参数查看是否拦截

规则的添加与删除在web后台直接可以操作

总结

编写参考https://waf.xsec.io/docs
最初安装配置的时候走了一些弯路,在菜菜的指导最终配置成功,关于waf的规则需要自己慢慢收集,最近有人逆向了阿里云waf,有逆向功底的小伙伴可以尝试对成熟的产品进行逆向,挖掘一下他们的规则,添加进去,逆向waf就和他们的一样好用了。