君衍.
- 一、雷池WAF
- 1、什么是雷池
- 2、什么是WAF
- 3、雷池的功能
- 4、WAF部署架构
- 5、整体检测流程
- 二、雷池WAF环境依赖
- 1、查看本地CPU架构
- 2、Docker安装
- 2.1 卸载旧版本
- 2.2 安装yum-utils工具包
- 2.3 设置镜像仓库
- 2.4 安装docker
- 2.5 启动docker并查看版本
- 3、Docker Compose安装
- 3.1 卸载旧版本
- 3.2 下载文件并移至bin目录
- 3.3 添加执行权限
- 3.4 查看版本
- 三、雷池WAF安装配置
- 1、Nginx更改端口
- 2、自动安装雷池WAF
- 3、初始化账户并登录
- 4、配置防护站点
- 5、防护测试
- 6、拦截效果
- 四、系统加固
- 1、iptables放通端口
- 2、iptables拦截IP
- 五、深度防御实现
- 1、配置雷池上游服务器地址
- 2、设置云服务器安全组规则
- 3、iptables制定策略
- 六、遇到的问题及解决
- 1、nginx: [alert] kill(30127, 1) failed (3: No such process)
- 2、nginx: [error] open() “/usr/local/nginx/logs/nginx.pid“ failed (2: No such file or directory)
- 3、雷池常见问题排查
本文继上篇环境: 腾讯云服务器+Nginx+ModSecurity+XSS(CentOS7)靶场搭建的一个传统WAF环境,之后,再此基础上使用雷池WAF二次进行应用层防护,及使用iptables代替防火墙来进行系统加固。
上篇文章地址: Modsecurity安装+Nginx+腾讯云CentOS+XSS-Labs靶场+WAF规则
这里介绍下我的思路,为了凸显雷池WAF的优势以及区别,设计两个端口来进行区分,将8080端口设置为nginx服务的端口地址,使用雷池WAF监听80端口,配置上游服务器为源站8080端口。而8080端口源站我们已经使用modsecurity进行了防御。所以,之后我们可以使用payload来进行两端测试,80端口为雷池WAF防护地址,8080端口为modsecurity防护地址。当然,80端口为WAF+Modsecurity双层防御来应对网络中复杂流量以及报文。而判断雷池与modsecurity差别则可进行日志审计或者进行测试观察,同时modsecurity拦截直接状态码403回显,而雷池WAF拦截则是没有响应报文。(当然了,也可以不对外暴露8080端口,只能使用80端口进行访问,之后雷池对流量进行检测,抛给源站,源站上又配置了modsecurity进行校验,从而使系统更加安全,在文章最后介绍如何使用户只能通过80端口访问。)
选择雷池也有部分原因为雷池社区版免费,以及modsecurity开源,可供学习研究。
一、雷池WAF
1、什么是雷池
雷池(SafeLine)是一种Web应用防火墙(Web Application Firewall)
,其名称来源于其开发者长亭科技。WAF通常被用于保护Web应用程序免受各种网络攻击,如SQL注入、跨站脚本(XSS)
、跨站请求伪造(CSRF)
等。它位于Web应用程序前面,监控和过滤进入应用程序的HTTP流量,以识别和阻止恶意的HTTP请求。
雷池技术体系知识库:
- 雷池语义分析算法
- 雷池技术架构
2、什么是WAF
WAF是Web Application Firewall
(Web应用防火墙)的缩写。它是一种专门用于保护Web应用程序免受各种网络攻击的安全设备或服务。
WAF 的作用和功能:
- 过滤恶意流量:WAF位于Web应用程序前面,监控所有进入应用程序的HTTP/HTTPS流量。它能够识别和过滤掉包含恶意代码或攻击特征的请求,如SQL注入、跨站脚本(XSS)、跨站请
- 实时监控和分析:WAF实时地分析流量,监控潜在的安全威胁,并根据预定义的规则或策略采取相应的防御措施,比如阻止恶意请求或者记录日志供进一步审计。
- 安全策略:管理员可以根据具体的应用需求配置和实施多种安全策略。这些策略包括防止公开漏洞的利用、防御未知的威胁以及应对已知的攻击模式。
- 日志和报告:WAF通常会记录所有的HTTP/HTTPS流量,包括允许和拒绝的请求,以及详细的安全事件日志。这些日志可以用于安全审计、调查事件和性能优化。
- 缓解DDoS攻击:某些WAF还具备抵御分布式拒绝服务(DDoS)攻击的能力,通过流量限制、IP黑名单等方式来减轻对服务器的压力。
- 自动化和智能防护:现代的WAF通常支持自动化配置和智能学习,能够识别新型的攻击模式并自动适应防御策略,减少对管理员的依赖。
- 性能优化:为了不影响Web应用程序的正常运行,WAF会采用各种技术手段来优化性能,如请求缓存、延迟加载等。
3、雷池的功能
便捷性
- 采用容器化部署,一条命令即可完成安装,0 成本上手
- 安全配置开箱即用,无需人工维护,可实现安全躺平式管理
安全性
- 首创业内领先的智能语义分析算法,精准检测、低误报、难绕过
- 语义分析算法无规则,面对未知特征的 0day 攻击不再手足无措
高性能
- 无规则引擎,线性安全检测算法,平均请求检测延迟在 1 毫秒级别
- 并发能力强,单核轻松检测 2000+ TPS,只要硬件足够强,可支撑的流量规模无上限
高可用
- 流量处理引擎基于 Nginx 开发,性能与稳定性均可得到保障
- 内置完善的健康检查机制,服务可用性高达 99.99%
4、WAF部署架构
一般外部用户发出请求,经过网络最终传递到网站服务器。
此时,若外部用户中存在恶意用户,那么由恶意用户发出的攻击请求也会经过网络最终传递到网站服务器。
社区版雷池以反向代理方式接入,优先于网站服务器接收流量,对流量中的攻击行为进行检测和清洗,将清洗过后的流量转发给网站服务器。
5、整体检测流程
二、雷池WAF环境依赖
安装雷池前请确保你的系统环境符合以下要求:
- 操作系统:Linux
- CPU 指令架构:x86_64
- CPU 指令架构:支持 ssse3 指令集
- 软件依赖:Docker 20.10.14 版本以上
- 软件依赖:Docker Compose 2.0.0 版本以上
- 最低资源需求:1 核 CPU / 1 GB 内存 / 5 GB 磁盘
1、查看本地CPU架构
- 查看指令架构
uname -m
- 查看CPU信息
cat /proc/cpuinfo| grep "processor"
- 查看CPU是或否支持ssse3指令集
lscpu | grep ssse3
2、Docker安装
这里需要注意的是我这里Linux使用的是CentOS7系统,所以之后的环境安装需要注意命令是否需要更改。(由于篇幅限制,这里我不具体介绍安装过程的描述)
Ubuntu操作系统安装docker详见:Ubuntu22.04安装docker
2.1 卸载旧版本
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
这里之前没有安装可以忽略不用卸载,不知道是否有安装可以执行,回显处出没找到即可。
2.2 安装yum-utils工具包
yum install -y yum-utils
2.3 设置镜像仓库
这里使用阿里云镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
2.4 安装docker
yum install docker-ce docker-ce-cli containerd.io
2.5 启动docker并查看版本
systemctl start docker
docker version
至此,CentOS操作系统安装docker即可完成。其他操作系统Ubuntu可见博客:Ubuntu22.04安装docker
3、Docker Compose安装
3.1 卸载旧版本
rm /usr/local/bin/docker-compose
这里直接删除旧版本目录即可,如果没有安装过可以忽略,不清楚则可执行,显示没有这个目录即可。
3.2 下载文件并移至bin目录
curl -L https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
这里可能会特别慢,我当时的解决方式是直接在windows下下载完成,使用ftp完成文件上传至bin目录下即可。
3.3 添加执行权限
chmod +x /usr/local/bin/docker-compose
3.4 查看版本
以上即可将雷池WAF所需的依赖环境安装完成,以及其硬件需求需要注意。
安装雷池前请确保你的系统环境符合以下要求:
- 操作系统:Linux
- CPU 指令架构:x86_64
- CPU 指令架构:支持 ssse3 指令集
- 软件依赖:Docker 20.10.14 版本以上
- 软件依赖:Docker Compose 2.0.0 版本以上
- 最低资源需求:1 核 CPU / 1 GB 内存 / 5 GB 磁盘
三、雷池WAF安装配置
本篇采用的WAF安装方式是直接在本地服务器上部署,与后端服务器部署在一台主机上。当然,这里其实不建议这么配置的如果是在真实的生产环境下,这种对于单机的负载要求更高,设备宕机概率大,同时故障排查困难,生产环境下建议在单独的服务器上部署雷池。
1、Nginx更改端口
首先,我依旧说明下我目前的环境,当前的环境是上一篇文章的环境,使用了nginx作为中间件,同时nginx监听的端口为80端口。而雷池的防护站点配置,配置需要监听80端口,HTTP的默认端口,当然,如果你要让雷池监听别的端口,那么访问站点时,后面自然需要跟上雷池防护的端口,所以这里我决定更改Nginx的监听端口,更改为8080,让雷池去监听80端口,8080端口让modsecurity防护,从而也有个测试的平台也就是8080端口来测试哪些payload是雷池可以防住而modsecurity防不住的,以上便是的大体的思路。
下面我们更改Nginx监听端口:
- 1、为了方便之后的nginx执行,首先配置环境变量:
vim /etc/profile
# 文件末尾加上以下两个
export NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin
# 保存退出
source /etc/profile
以上一个是Nginx的家目录,一个是可执行文件目录需要配置正确。
- 2、将Nginx的服务关闭,使用命令:
nginx -s stop
netstat -ntlp # 查看端口状态
这里我们可以看到80端口已经不再被监听。
- 3、下面我们去Nginx的配置文件里面监听端口更改为8080:
vim /usr/local/nginx/conf/nginx.conf
- 4、重启nginx服务:
nginx -s reload
netstat -ntlp
重启之后查看nginx监听端口为8080,即可更换完毕。(同时需要注意,有防火墙的话需要将8080端口全部放开,我这里在腾讯云防火墙以及本机防火墙都已开放8080端口。)
当然,这里可能会发生报错,所以我在文章最后有两个报错内容以及解决方式供大家参考。
2、自动安装雷池WAF
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
安装完毕后,会看到进行雷池控制台的方式,也可看到这里端口是9443默认端口控制。所以我们只需在ip地址后加上9443即可访问到控制台,这里仍需注意,9443端口是否被开放(防火墙以及云自带防火墙)。
3、初始化账户并登录
这里直接访问9443端口即可看到需要登录界面,所以需要重新初始化管理账户。
docker exec safeline-mgt resetadmin
这里即可输出账号密码,使用系统生成的账户密码即可登录控制台。
[SafeLine] Initial username:admin
[SafeLine] Initial password:**********
[SafeLine] Done
4、配置防护站点
这里防护站点配置在域名处可以配置自己服务器的IP地址或者域名,都可,端口这里我是计划了让雷池监听80端口,上游服务器也就是源站,这里我就是ip地址加上8080的nginx端口从而完成流量的转发以及响应,接着提交即可。
下面配置完之后,就可访问自己的服务器地址或者域名,80端口进行测试访问,然后等待片刻观察流量是否经过雷池,如果经过雷池,那么雷池上会有请求流量的显示,以及nginx访问日志里面访问的IP地址也是自身服务器进行访问,因为这里雷池做了转发,搞了SNAT,从而看不到源地址。
5、防护测试
这里可以自行测试,也可使用官方提供的测试,看防护效果。这里主要是手动模拟攻击。
以 https://chaitin.com 为例,然后尝试访问来模拟黑客攻击。
用你的网站地址替换下方的https://chaitin.com/
- 模拟 SQL 注入攻击: https://chaitin.com/?id=1+and+1=2+union+select+1
- 模拟 XSS 攻击: https://chaitin.com/?id=<img+src=x+οnerrοr=alert()>
- 模拟路径穿越攻击: https://chaitin.com/?id=…/…/…/…/etc/passwd
- 模拟代码注入攻击: https://chaitin.com/?id=phpinfo();system(‘id’)
- 模拟 XXE 攻击: https://chaitin.com/?id=<?xml+version="1.0"?><!DOCTYPE+foo+SYSTEM+“”>
不出意外的话,这些攻击都将被雷池拦截,如下图所示。
6、拦截效果
这里是使用开源WAF测试工具测出来的结果,具体可以自行使用https://github.com/chaitin/blazehttp去搭建,然后测试,我参考以上结果,使用Modsecurity-L4贴合了源站,雷池为二次防护对于80端口来说,可以看到modsecurity的检出率还是很高的,而雷池免费版的检出率一般,但是误报率相对低很多,所以二者搭配使用,达成联动,效果之后可以自行测试。
下面是我最近几天使用雷池的拦截情况:
以上可以看到效果还是很好的,这里防护强度使用的高强度(推荐高强度)。
四、系统加固
1、iptables放通端口
本篇我使用的防火墙为iptables,所以这里包含了去放通8080端口以及9443端口,步骤:
- 检查iptables的状态,使用命令
iptables -L -n
- 添加开放端口的规则,使用命令
iptables -I INPUT -p tcp --dport 端口号 -j ACCEPT
,例如,要开放80端口,使用命令iptables -I INPUT -p tcp --dport 80 -j ACCEPT
- 保存配置,使用命令
service iptables save
或iptables-save > /etc/iptables.rules
- 重启防火墙,使用命令
service iptables restart
- 查看状态,使用命令
service iptables status
2、iptables拦截IP
iptables -A INPUT -s IP地址 -j DROP
service iptables save
systemctl restart iptables
iptables -nvxL --line
以上便是我对于几个IP地址封禁的策略查看,可以看到对于45.148.10.174的IP地址发的包已经拦截了。
五、深度防御实现
这里使用modsecurity与雷池WAF联动的效果,配合iptables对外部端口的控制从而实现更加安全的防护。之所以使用双WAF进行联动,是因为经过雷池官方提供的自动化WAF检测工具最终的数据产出对比可以看到,modsecurity的检出率也就是拦截数量还是很高的,但是误报太多,同时没有图形化界面,对运维以及流量审计有一定的难度。所以配合误报率低的雷池WAF,拥有图形化界面,从而更加便捷的让用户看到拦截程度以及拦截的攻击类型等等。
1、配置雷池上游服务器地址
这里我们将上游服务器设置为127.0.0.1,设置为本机,之后我们将除了127.0.0.1的流量屏蔽掉。
2、设置云服务器安全组规则
这里我们只设置来源为127.0.0.1的IP地址访问8080端口是允许的就成。
3、iptables制定策略
这里由于我之前放开了对8080端口的限制,所以:
[root@VM-8-11-centos ~]# iptables -nxvL --line
可以看到,这里8080端口对所有IP地址都没有进行限制,下面我们设置规则,只有127.0.0.1的IP地址可以进行访问。
[root@VM-8-11-centos ~]# iptables -A INPUT -i lo -p tcp --dport 8080 -s 127.0.0.1 -j ACCEPT
[root@VM-8-11-centos ~]# iptables -A INPUT -i lo -p tcp --dport 8080 -j DROP
[root@VM-8-11-centos ~]# iptables -D INPUT 2
下面对以上命令进行解读:
iptables -A INPUT -i lo -p tcp --dport 8080 -s 127.0.0.1 -j ACCEPT
- -A INPUT: 将规则添加到INPUT链(即入站流量)。
- -i lo: 匹配本地回环接口(lo)。
- -p tcp: 指定协议为TCP。
- –dport 8080: 指定目标端口为8080。
- -s 127.0.0.1: 指定源IP地址为127.0.0.1。
- -j ACCEPT: 如果匹配,则接受连接。
iptables -A INPUT -i lo -p tcp --dport 8080 -j DROP
这个命令则代表,如果IP地址不是127.0.0.1,那么直接丢掉(与上一条配合使用,也就是如果上一条规则没有被匹配,那么匹配这个也就是直接丢掉)。
iptables -D INPUT 2
这条命令则代表删掉规则2,因为我端口放通在规则num=2,这里删掉。
六、遇到的问题及解决
1、nginx: [alert] kill(30127, 1) failed (3: No such process)
解决问题的命令:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx
:这是nginx服务器的可执行文件路径。在大多数安装中,nginx可执行文件通常位于 /usr/local/nginx/sbin/nginx。这个路径指定了nginx服务器的实际二进制文件所在的目录。-c /usr/local/nginx/conf/nginx.conf
:这是nginx启动时指定的配置文件路径。在这里,-c 选项表示后面紧跟着nginx的配置文件路径。/usr/local/nginx/conf/nginx.conf
指定了nginx的主配置文件的位置。nginx在启动时需要加载这个配置文件来确定如何处理请求、监听端口、设定虚拟主机等等。
2、nginx: [error] open() “/usr/local/nginx/logs/nginx.pid“ failed (2: No such file or directory)
这里我们依旧使用上一个问题的命令即可看到生成了nginx.pid
,如果再次nginx -s reload
出现此报错,那么说明pid里面内容与端口的PID不对应。这里我们需要使用netstat -ntlp
命令进行查看nginx
的PID
,这里从截图可以看出来为5570
,然后去nginx.pid
里面将pid改为5570即可,再次重启即可没有此报错。
3、雷池常见问题排查
这里放上官方排查手册,涵盖面非常广,可以进行查阅:
常见故障排查手册