免费WAF:长亭雷池社区版,给站点再加道防护!

去年其实就看到这个项目了,最早是在GitHub上看到的,当时只是star了,后来就给忘了。最近整理GitHub的时候又看到了,想想刚好可以用在服务器的那些站点,顺便来这里做个记录。由于我的博客资源放在GitHub上,所以难以使用ip:port的形式直接访问,也就不能添加雷池。但对于博客部署在自己服务器上的小伙伴,可以正常配置长亭雷池。如果有好的方法了,我会再来更新。

什么是雷池?

雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。

Slogan: 不让黑客越雷池一步。

什么是 WAF?

WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。区别于传统防火墙,WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于收到黑客的攻击。

WAF 部署架构

下图是一个简单的网站流量拓扑,外部用户发出请求,经过网络最终传递到网站服务器。
此时,若外部用户中存在恶意用户,那么由恶意用户发出的攻击请求也会经过网络最终传递到网站服务器。

社区版雷池以反向代理方式接入,优先于网站服务器接收流量,对流量中的攻击行为进行检测和清洗,将清洗过后的流量转发给网站服务器。
通过以上行为,最终确保外部攻击流量无法触达网站服务器。

部署效果

如何加到自己的网站?

正式部署前的准备工作

参考官方文档

部署前环境检测

最低配置需求

  • 操作系统:Linux
  • 指令架构:x86_64
  • 软件依赖:Docker 20.10.14 版本以上
  • 软件依赖:Docker Compose 2.0.0 版本以上
  • 最小化环境:1 核 CPU / 1 GB 内存 / 5 GB 磁盘

可以逐行执行以下命令来确认服务器配置:

1
2
3
4
5
6
7
8
uname -m                                    # 查看指令架构
docker version # 查看 Docker 版本
docker compose version # 查看 Docker Compose 版本
docker-compose version # 老版本查看Compose 版本
cat /proc/cpuinfo| grep "processor" # 查看 CPU 信息
free -h # 查看内存信息
df -h # 查看磁盘信息
lscpu | grep ssse3 # 确认CPU是否支持 ssse3 指令集

关于docker环境的安装建议参考这篇博客

我的部署环境
服务器:阿里云服务器(2核2G)
操作系统:Debian 11

安装雷池

官方提供的三种安装方式

  • 在线安装 : 推荐方式,一行命令完成安装
  • 离线安装 : 下载离线安装包,轻松完成安装
  • 其他方式安装 : 使用牧云助手,点击即可完安装

我采用在线安装,这也是官方推荐的安装方式,并使用华为云加速:

1
CDN=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"

一行命令一键式安装,非常方便,最后有一连串Started,说明安装成功。
其他安装方式自行参考官方文档

登录雷池

安装完成以后,理论上即可使用https://<waf-ip>:9443访问雷池。
如果无法正常访问网址,请检查9443端口是否被占用和服务器安全组规则。
需要使用支持 TOTP 的认证软件或者小程序扫描二维码获取动态口令登录:

  • 服务器和 totp 应用的时间必须保持一致,否则无法验证通过
  • 完成首次登录后,无法回退查看二维码,使用页面提供的方法重置

支持TOTP的认证软件在手机应用商店不容易搜到,可以在PC端下载.apk文件发送到手机端。我使用的是微软的Authenticator获取的口令,获取口令登录即可:

接下来就可以开始配置防护站点了。

下面演示的是网站和WAF部署在同一服务器上。一般不建议这样做,因为这样单机的负载更高、设备宕机的概率更大。非纯净的环境还会提高升级失败的概率,故障排查更困难。但是由于我目前只有一台服务器,无法演示多台服务器。

以我服务器上的一些使用docker部署的站点为例,先讲讲无其他中间件(CDN)的站点配置。

小李图床
这是之前兴起用兰空图床搭建的,没套CDN。
具体步骤如下:

  1. 域名解析到反向代理服务器,即添加A记录指向反向代理服务器的ip。
  2. (非必须)反向代理,我用Nginx Proxy Manager做反代,并且让反代指向雷池WAF
    需要说明的是,雷池WAF的默认端口为9443,因此我们通过访问http://雷池WAF所在服务器ip:9443配置防护站点。使用docker部署的站点也有自己对应的端口,比如小李图床这个站点就是使用docker部署的,该容器映射出的端口假设为a,使用http://小李图床所在服务器ip:a就能访问小李图床。做了反向代理,ip:port就可以变成域名来访问。但是反代和站点部署在同一服务器,站点又是docker部署的,ip需要变为172.17.0.1,这是虚拟网卡docker0的ip,可以使用下面命令查看:
    1
    ip addr show docker0
  3. 雷池防护站点配置
    配置时注意两处端口a保持一致,具体用哪一个端口,自定义,只要没有进程占用即可,端口b为站点实际访问时所用端口。上面也提到过,如果你的情况和我一样,使用docker部署的站点,且站点和反代为同一服务器,就按照上图使用172.17.0.1应该不会有问题。如果这些(反代、WAF、站点)部署于不同服务器上,就不应该是172.17.0.1了,项目部署在哪一个服务器上,就要使用对应服务器的ip。

效果测试:
尝试插入后门,输入下面url

1
https://lsky.xxfer.cn/webshell.php
进入雷池WAF后台,查看拦截信息

Picsur图床
这个站点套了层CDN。其实配置原理和上面类似,总结为一句话就是:
域名指向CDN,CDN指向雷池WAF映射出的端口,雷池WAF指向服务原始端口也就是上游服务器端口。
很多同学大概率和我的情况不太一样,但是只要理解了WAF的架构模式,再看上面这句话应该可以结合自己的情况配置成功了。
建议CDN回源协议选择SSL。
具体步骤:

  1. 域名解析到CDN
  2. CDN回源到雷池WAF
  3. 再从WAF指向站点所在服务器和端口

理解以后配置起来也挺快的。

测试防护效果

  • 确认网站可以正常访问
  • 尝试手动模拟攻击:
    模拟 SQL 注入,请访问http://<IP或域名>:<端口>/?id=1%20AND%201=1
    模拟 XSS,请访问http://<IP或域名>:<端口>/?html=<script>alert(1)</script>
    通过浏览器,你将会看到雷池已经发现并阻断了攻击请求:
  • 还有自动化测试防护:
    等待更新......

关于长亭雷池

以上展示的只是雷池社区版(免费)的部分使用,当然也有付费的,有需要的同学自行了解。具体事宜请参考官方文档