1 WAF介绍

所谓WAF,即Web Application Firewall,网络应用防火墙,是通过一系列执行针对HTTP/HTTPS的安全策略来为web应用提供安全防护的产品。有别于传统的防火墙,WAF专门针对应用层web应用而设计,能够起到防止流量攻击、SQL注入、XSS攻击等作用。

1.1 WAF分类

通常而言,WAF可以分为以下4类:

  1. 软件型WAF:本身是一个软件,部署在服务器上,检测是否存在web攻击。

  2. 硬件型WAF:本身是一款硬件,可以有多种部署方式,如果是串联到链路中,则可以拦截恶意流量,如果是以旁路的形式部署,则只能记录攻击但是不能拦截。硬件型WAF一般而言比软件型WAF更加昂贵,但是检测速度快,不易成为网站瓶颈。

  3. 云WAF:我们可以将云WAF简单理解为带有WAF功能的CDN(内容分发网络),因为其实现机理与CDN基本相同,都是通过更改目标站点的DNS记录,使其指向云WAF,然后对站点的访问进行过滤。云WAF通常以反向代理的方式进行工作,其最大的优点是方便快捷,但是如果攻击者能够找到站点的真实IP地址,那么云WAF就存在被直接绕过的风险。

  4. 站点内置WAF:所谓站点内置WAF,即网站的开发者考虑到站点的安全性,将一些过滤功能写成代码,嵌入到站点内,或者直接嵌入到页面代码中,或者以一个单独的文件列出,然后被相关页面所引用。这种WAE的灵活性非常高,因为是直接开发在页面上,因此可以针对一项非常具体的业务,乃至一个微小的功能来实现检测和规律,但是相应的其通用型就比较低了。

1.2 WAF常见功能

①审计设备:对于系统自身安全相关的下列事件产生审计记录

  1. 管理员登录后进行的操作行为;

  2. 对安全策略进行添加、修改、删除等操作行为;

  3. 对管理角色进行增加、删除和属性修改等操作行为;

  4. 对其他安全功能配置参数的设置或更新等行为。

②访问控制设备:用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式。
③架构及网络设计工具:当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。
④WEB应用加固工具。

这些功能增强了被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且能够保护WEB应用编程错误导致的安全隐患。

1.3 WAF防护原理

WAF之所以能够起到对网络应用进行防护的作用,主要是基于以下手段:

  1. 异常检测机制:拒绝不符合HTTP标准的请求。

  2. 白名单/黑名单:采取白名单或者黑名单的方式,对HTTP内容进行验证。

  3. 基于规则和基于异常的保护:定义一些安全规则或者异常状态,基于此对服务器进行安全防护。

  4. 状态管理:对会话进行防护。

  5. 信息泄露保护:防止服务器信息泄露。

  6. 扫描器识别:WAF对于一些扫描器会进行识别并禁止扫描,常用的扫描器识别技术有
    ①扫描器指纹。
    ②单IP+cookie指定时间内访问触发规则次数。
    ③验证码验证。

2 openresty

2.1 介绍

Openresty是在Nginx 的基础上集成开发了 Lua 语言实现高性能的扩展功能,在不降低原来Nginx 性能的情况下通过Lua 语言的功能增加诸如更细致的访问控制、集成数据库和缓存访问、web 应用安全访问等多种功能。

2.2 安装(CentOS 7)

1、更新软件

yum -y update

2、添加openresty仓库

1
2
wget https://openresty.org/package/centos/openresty.repo
mv openresty.repo /etc/yum.repos.d/

3、安装openresty

yum -y install openresty

4、安装命令行工具resty

yum install -y openresty-resty

5、发布新版本后,更新软件

1
2
yum check-update #列出所有可更新的软件清单
yum update <package_name> #更新指定的软件

6、启动naigx

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

7、访问http://[ip]:80

8、切换root,修改配置

其他系统安装,参考官方文章:

https://openresty.org/cn/installation.html

2.3 配置

2.3.1 防火墙

不能从别的IP访问,查看防火墙状态:systemctl status firewalld

关闭防火墙命令:

1
2
systemctl stop firewa]ld #关闭防火墙
systemctl disable firewa1ld #关闭开机自启动,可选

关闭防火墙后可以从其他IP访问

2.3.2 创建网页

默认安装路径是/usr/1oca1/openresty,修改nginx配置文件,可以创建自己的网页

1
2
3
4
5
6
7
8
vi /usr/local/openresty/nginx/conf/nginx.conf
# 在server中添加如下location字段:
location /hi {
default_type text/html;
content_by_lua_block{
ngx.say("hello openrastry!");
}
}

测试配置文件并重启:

1
2
/usr/1ocal/openresty/nginx/sbin/nginx -t #测试配置文件是否正确,显示success,说明配置文件修改成功
/usr/ocal/openresty/nginx/sbin/nginx -s reload #重新加载配置文件

2.3.3 配置PHP

1、安装php

yum install -y php

2、修改配置文件usr/local/openresty/nagix/conf/nginx.conf

1
2
3
4
5
6
7
8
#去掉这部分的注释,并修改/script为$document_root
location ~\.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT FILENAME $document_root$fastcgi_script_name;
include fastcgi params;
}

3、找到php.ini

centos中文件路径为:/etc/php.ini

找不到配置文件时,可以使用命令搜索文件:find/*-name php.ini

去掉cgi.fix_pathinfo=1前面的注释

4、开启php-cgi:

php-cgi -b 127.0.0.1:9000 -c /etc/php.ini

5、重载nginx配置:

/usr/local/openresty/nginx/sbin/nginx -s reload

之后再去目录下php文件可以执行解析。

3 WAF使用

3.1 部署WAF

1、克隆WAF代码:git clone https://github.com/unixhot/waf.git

2、将下载的waf文件夹复制到/usr/local/openresty/nginx/conf/

1
cp -r ./waf/waf /usr/local/openresty/nginx/conf/

3、修改waf中的config.lua文件,配置日志文件、规则文件路径、跳转地址,并根据需要修改触发WAF的显示信息

1
2
3
4
5
6
7
8
9
--log dir
config_1og_dir ="/var/1og/nginx"
--rule setting
config_rule_dir ="/usr/local/openresty/nginx/conf/waf/rule-config"
--if config_waf_output ,setting url
config_waf_redirect_url = "https://www.baidu.com" # 触发WAF时的显示信息
<body>
<h1 align="center"> 欢迎白帽子进行授权安全测试
</body>

4、赋予日志文件权限:chmod -R 777 /var/log/nginx

5、开启WAF:打开/usr/local/openresty/nginx/conf/nginx.conf,在http{}中增加如下内容:

1
2
3
4
5
#WAF
lua shared dict imit 50m;
1ua_package_path "/usr/local/openresty/nginx/conf/waf/?.1ua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_1ua_file "/usr/ocal/openresty/nginx/conf/waf/access.lua";

6、建立resty的软连接:

1
ln -s /usr/1ocal/openresty/lualib/resty/ /usr/local/openresty/nginx/conf/waf/resty

7、检查配置文件并重载nginx服务:

1
2
/usr/lcoal/openresty/nginx/sbin/nginx -t
/usr/1coal/openresty/nginx/sbin/nginx -s reload

WAF部署好了,现在访问木马文件会被拦截。

管理者查看日志目录:/var/log/nginx

扫描工具大面积403说明目标网站有WAF。

3.2 理解WAF

WAF简单描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。

  1. 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。

  2. 支持URL白名单,将不需要过滤的URL进行定义。

  3. 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。

  4. 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。

  5. 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。

  6. 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。

  7. 支持URL参数过滤,原理同上。

  8. 支持日志记录,将所有拒绝的操作,记录到日志中去。

  9. 日志记录为JSON格式,便于日志分析,例如使用ELK进行攻击日志收集、存储、搜索和展示。

3.3 配置过滤规则

waf/access.lua文件配置了检测顺序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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/relu-config/下,可根据需求自行调整,每条规则需换行,或者用|分割。

3.3.1 IP白名单

waf/rule-config/whiteip.rule添加IP地址,对于这些地址发起的请求,WAF不会拦截。

3.3.2 IP黑名单

waf/rule-config/blackip.rule添加IP地址

3.3.3 user-agent配置

WAF可以检测请求中user-agent字段,并拦截带有指定user-agent值的请求。

waf/rule-config/useragent.rule添加

3.3.4 其他过滤规则

  1. args.rule里面的规则get参数进行过滤的

  2. url.rule是只在get请求url过滤的规则

  3. post.rule是只在post请求过滤的规则

  4. cookie.rule是对cookie中数据的过滤规则

  5. whiteurl.rule是这是url的白名单