雷池WAF+Modsecurity安装防护及系统加固

君衍.

本文继上篇环境: 腾讯云服务器+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架构

  • 查看指令架构
python 复制代码
uname -m
  • 查看CPU信息
python 复制代码
cat /proc/cpuinfo| grep "processor"
  • 查看CPU是或否支持ssse3指令集
python 复制代码
lscpu | grep ssse3

2、Docker安装

这里需要注意的是我这里Linux使用的是CentOS7系统,所以之后的环境安装需要注意命令是否需要更改。(由于篇幅限制,这里我不具体介绍安装过程的描述)
Ubuntu操作系统安装docker详见:Ubuntu22.04安装docker

2.1 卸载旧版本

python 复制代码
yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine

这里之前没有安装可以忽略不用卸载,不知道是否有安装可以执行,回显处出没找到即可。

2.2 安装yum-utils工具包

python 复制代码
yum install -y yum-utils

2.3 设置镜像仓库

这里使用阿里云镜像仓库

python 复制代码
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

python 复制代码
yum install docker-ce docker-ce-cli containerd.io

2.5 启动docker并查看版本

python 复制代码
systemctl start docker
docker version


至此,CentOS操作系统安装docker即可完成。其他操作系统Ubuntu可见博客Ubuntu22.04安装docker

3、Docker Compose安装

3.1 卸载旧版本

python 复制代码
rm /usr/local/bin/docker-compose

这里直接删除旧版本目录即可,如果没有安装过可以忽略,不清楚则可执行,显示没有这个目录即可。

3.2 下载文件并移至bin目录

python 复制代码
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 添加执行权限

python 复制代码
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执行,首先配置环境变量:
python 复制代码
vim /etc/profile
# 文件末尾加上以下两个
export NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin
# 保存退出
source /etc/profile

以上一个是Nginx的家目录,一个是可执行文件目录需要配置正确。

  • 2、将Nginx的服务关闭,使用命令:
python 复制代码
nginx -s stop
netstat -ntlp # 查看端口状态

这里我们可以看到80端口已经不再被监听。

  • 3、下面我们去Nginx的配置文件里面监听端口更改为8080:
python 复制代码
vim /usr/local/nginx/conf/nginx.conf
  • 4、重启nginx服务:
python 复制代码
nginx -s reload
netstat -ntlp


重启之后查看nginx监听端口为8080,即可更换完毕。(同时需要注意,有防火墙的话需要将8080端口全部放开,我这里在腾讯云防火墙以及本机防火墙都已开放8080端口。)
当然,这里可能会发生报错,所以我在文章最后有两个报错内容以及解决方式供大家参考。

2、自动安装雷池WAF

python 复制代码
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"


安装完毕后,会看到进行雷池控制台的方式,也可看到这里端口是9443默认端口控制。所以我们只需在ip地址后加上9443即可访问到控制台,这里仍需注意,9443端口是否被开放(防火墙以及云自带防火墙)。

3、初始化账户并登录

这里直接访问9443端口即可看到需要登录界面,所以需要重新初始化管理账户。

python 复制代码
docker exec safeline-mgt resetadmin

这里即可输出账号密码,使用系统生成的账户密码即可登录控制台。

python 复制代码
[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/

不出意外的话,这些攻击都将被雷池拦截,如下图所示。

6、拦截效果


这里是使用开源WAF测试工具测出来的结果,具体可以自行使用https://github.com/chaitin/blazehttp去搭建,然后测试,我参考以上结果,使用Modsecurity-L4贴合了源站,雷池为二次防护对于80端口来说,可以看到modsecurity的检出率还是很高的,而雷池免费版的检出率一般,但是误报率相对低很多,所以二者搭配使用,达成联动,效果之后可以自行测试。
下面是我最近几天使用雷池的拦截情况:



以上可以看到效果还是很好的,这里防护强度使用的高强度(推荐高强度)。

四、系统加固

1、iptables放通端口

本篇我使用的防火墙为iptables,所以这里包含了去放通8080端口以及9443端口,步骤:

  1. 检查iptables的状态,使用命令 iptables -L -n
  2. 添加开放端口的规则,使用命令 iptables -I INPUT -p tcp --dport 端口号 -j ACCEPT,例如,要开放80端口,使用命令 iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  3. 保存配置,使用命令 service iptables saveiptables-save > /etc/iptables.rules
  4. 重启防火墙,使用命令 service iptables restart
  5. 查看状态,使用命令 service iptables status

2、iptables拦截IP

python 复制代码
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端口的限制,所以:

python 复制代码
[root@VM-8-11-centos ~]# iptables -nxvL --line


可以看到,这里8080端口对所有IP地址都没有进行限制,下面我们设置规则,只有127.0.0.1的IP地址可以进行访问。

python 复制代码
[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

下面对以上命令进行解读:

python 复制代码
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: 如果匹配,则接受连接。
python 复制代码
iptables -A INPUT -i lo -p tcp --dport 8080 -j DROP

这个命令则代表,如果IP地址不是127.0.0.1,那么直接丢掉(与上一条配合使用,也就是如果上一条规则没有被匹配,那么匹配这个也就是直接丢掉)。

python 复制代码
iptables -D INPUT 2

这条命令则代表删掉规则2,因为我端口放通在规则num=2,这里删掉。

六、遇到的问题及解决

1、nginx: [alert] kill(30127, 1) failed (3: No such process)


解决问题的命令:

python 复制代码
/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命令进行查看nginxPID,这里从截图可以看出来为5570,然后去nginx.pid里面将pid改为5570即可,再次重启即可没有此报错。

3、雷池常见问题排查


这里放上官方排查手册,涵盖面非常广,可以进行查阅:
常见故障排查手册

相关推荐
中云DDoS CC防护蔡蔡5 小时前
微信小程序被攻击怎么选择高防产品
服务器·网络安全·微信小程序·小程序·ddos
.Ayang13 小时前
SSRF漏洞利用
网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
.Ayang13 小时前
SSRF 漏洞全解析(概述、攻击流程、危害、挖掘与相关函数)
安全·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构
风间琉璃""15 小时前
二进制与网络安全的关系
安全·机器学习·网络安全·逆向·二进制
Che_Che_16 小时前
Cross-Inlining Binary Function Similarity Detection
人工智能·网络安全·gnn·二进制相似度检测
恃宠而骄的佩奇17 小时前
i春秋-签到题
web安全·网络安全·蓝桥杯
follycat17 小时前
信息收集--CDN绕过
网络·安全·网络安全
清风.春不晚20 小时前
shell脚本2---清风
网络·网络安全
Wh1teR0se1 天前
[极客大挑战 2019]Secret File--详细解析
前端·web安全·网络安全