- 简单记录一下使用雷池Waf专业版的感受
前言
- 作为雷池社区专业版第一波内测用户,很高兴有机会亲自见证这样一款强大的Waf崛起,从社区版到专业版,雷池已连续迭代更新多个版本,不断优化,不断根据用户反馈改进提升
- 真心来说,相比使用过的其他Waf产品,雷池是唯一一款让我满意的产品,不是我故意贬低其他Waf产品,从安全,防护能力,智能化等方面综合来讲,雷池确实可以排在前面
功能
- 前面我已经写过一篇文章简单讲述了一下雷池的功能,大家可以参考一下
[post cid="2896" cover="" size="small"/]
- 雷池分为社区版,专业版,企业版,作为普通用户,如果你想追求更好的防护而迫于经济压力无法采购大厂安全产品,那么你完全可以考虑入手雷池专业版,最重要的是专业版还可以商用!
- 相比社区版,专业版具有以下功能,详情可见:版本对比 | 雷池 WAF 社区版 (chaitin.cn)
所有社区版能力
Web 攻击加强防护
黑 IP 加强情报防护
自定义拦截页面
基于地理位置的访问控制
上游服务器负载均衡
- 为什么我会选择雷池专业版,作为个人站长,我希望的Waf是占用小,易部署,防护强,功能多,而雷池专业版恰好满足了我所有的需求
负载均衡
- 雷池专业版可实现负载均衡,对于我来说,业务需要部署在多台服务器上,如果采用其他Waf产品,中间还需要部署一台负载均衡服务器,相比直接在Waf上实现负载均衡,增加了不少服务响应时长,雷池专业版刚好解决了这个问题
防护规则
- 雷池专业版补充了更多的漏洞防护规则,可以根据业务场景进行调整,保证业务安全
- 相比其他Waf产品,雷池可有效拦截信息泄露,扫描器,目录穿越等常规攻击
黑名单设置
- 从雷池升级专业版以来,添加了我最喜欢的功能,支持设置不同国家/地区省份访问黑名单
自定义拦截页面
- 雷池专业版还支持自定义拦截页面,对于一些小伙伴来说,这个可是福利
部署
- 相比某些Waf产品来说,雷池的部署以及升级非常Easy,只需要一条命令即可开始服务配置,这也是我喜欢雷池的原因之一,不用过多的敲代码,如果docker安装较慢,还提供了华为云加速安装命令
- 部署方式详细可见:安装雷池 | 雷池 WAF 社区版 (chaitin.cn)
雷池服务器配置最低要求
1. 操作系统:Linux
2. 指令架构:x86\_64
3. 软件依赖:Docker 20.10.6 版本以上
4. 最小化环境:1 核 CPU / 1 GB 内存 / 5 GB 磁盘
- 以下是使用1h2g单机部署作为演示的服务器性能消耗情况,使用docker部署,在测试拦截攻击的情况下雷池的占用也不高
- 雷池支持和业务部署在同一服务器上,只需修改一下web服务端口即可,但我不推荐这样部署,如果业务服务器配置较低很可能造成负载过高等一系列情况,还需要自己去修改服务端口,推荐还是采用单机docker部署雷池
- 以下是1panel结合雷池使用详细配置教程
1Panel部署雷池
修改容器网络
- 需要将Openresty修改为桥接网络模式,并且修改https外部映射为其他端口如2443
[scode type="blue" size="small"]改桥接端口之后,反向代理的思路就和使用Nginx Proxy Manager一样,不能写127.0.0.1:端口来反向代理[/scode]
- 点击应用参数修改docker-compose.yml,重构Openresty
version: '3'
services:
openresty:
image: openresty/openresty:latest #这里镜像注意对应自己的架构平台
container_name: ${CONTAINER_NAME}
restart: always
networks:
- 1panel-network
ports:
- "${PANEL_APP_PORT_HTTP}:80"
- "2443:2443"
volumes:
- ./conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
- ./conf/fastcgi_params:/usr/local/openresty/nginx/conf/fastcgi_params
- ./conf/fastcgi-php.conf:/usr/local/openresty/nginx/conf/fastcgi-php.conf
- ./log:/var/log/nginx
- ./conf/conf.d:/usr/local/openresty/nginx/conf/conf.d/
- ./www:/www
- ./root:/usr/share/nginx/html
- /etc/localtime:/etc/localtime
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true
修改监听端口
- 站点开启https,打开网站-配置文件,修改https监听端口为2443,与外部端口一致
雷池添加站点
- 一种是直接添加普通容器端口做上游,雷池Waf监听443端口,上传证书即可
- 另一种就是搭配openresty,具体方式如下:
- 添加上游服务为https://127.0.0.1:2443
- 域名填写与openresty站点一致
- 雷池WAF监听443端口
- 上传证书
- 这样子就正常添加了,正常网站配置还是由openresty 提供,雷池WAF做个下游
- 可能有些朋友的业务以旁路部署的方式比较合适,以下就简单说一下如何进行旁路部署
旁路部署
- 虽然说社区版和专业版并没有提供旁路部署(非反向代理接入)方式,但我们依旧可以实现旁路部署,以下是使用1panel进行旁路部署
- 先简单分析一下雷池社区版安装脚本
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
- 以下是脚本分析结果
- 显示雷池(SafeLine)WAF的图形
- 定义了一个名为qrcode的函数,用于显示雷池项目讨论组的二维码。
定义了几个辅助函数:
- command_exists:检查给定的命令是否存在
- check\_container\_health():检查 Docker 容器的健康状态,如果容器健康,就返回健康状态,否则返回错误信息
- space_left:返回给定目录的可用空间
- start_docker:启动 Docker 服务并设置为开机自启
- confirm():向用户提供一个确认提示,用户可以选择 ‘Y’ 或 ‘N’
- info(), warning(), abort():这些函数用于显示不同级别的信息,包括一般信息、警告和错误
- onexit():当用户中断脚本时,这个函数会被调用,显示一个错误信息并退出脚本
- 检查CPU 是否支持 ssse3 指令集,如果不支持则终止安装
- 脚本是否在 Bash 中运行
- STDIN 是否是标准输入设备
- 脚本是否没有参数
- 脚本是否以 root 权限运行
- Docker 是否已经安装,如果没有,询问用户是否需要自动安装
- Docker 服务是否正常工作,如果异常则终止安装
- Docker Compose Plugin 是否存在,如果没有,询问用户是否需要自动安装
- 提示用户输入雷池安装目录,默认为/data/safeline,并检查目录的存储空间是否足够
- 创建安装目录,并下载compose.yaml文件和.env文件
- 在.env文件中设置一些配置参数,如安装目录、镜像标签、管理端口等
- 始下载Docker镜像,并启动Docker容器
- 示雷池WAF社区版安装成功的二维码,并提供访问控制台的链接
- 脚本内容主以检查环境,创建文件夹及.env文件和启动docker-compose为主
- 以下是写入.env文件内容
echo "SAFELINE_DIR=$(pwd)" >> .env # 设置当前路径为雷池社区版的根路径
echo "IMAGE_TAG=latest" >> .env # 设置镜像的 tag
echo "MGT_PORT=9443" >> .env # 管理容器服务使用的端口
echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> .env # /dev/urandom是一个很长的随机数文本,tr -dc 命令用于删除非字母、非数字的字符,用于生成随机的 postgres 密码
echo "SUBNET_PREFIX=172.22.222" >> .env # 定义 docker 虚拟网卡的子网前缀
- 文件内容后面可自己填写,无需脚本
- 再把compose.yaml文件下载下来进行分析
- 在Docker Compose文件中,定义了以下几个服务:
postgres
(PostgreSQL数据库服务):用于存储SafeLine WAF社区版的数据,包括配置信息和日志redis
(Redis服务):用于作为缓存和消息队列,以提供快速的数据访问和通信management
(SafeLine管理API服务):这是SafeLine WAF的管理接口,允许用户配置和管理WAF的规则和策略detector
(SafeLine Detector服务):SafeLine WAF的核心组件,用于检测和拦截恶意流量mario
(SafeLine Mario服务):SafeLine WAF的一个组件,用于处理日志数据和性能监控tengine
(SafeLine Tengine服务):一个Web服务器,用于代理和处理网络流量,实现Web应用防火墙的功能
名称 | 定义 | 详情 |
---|---|---|
safeline-mgt | 管理容器 | 接收管理后台行为,向其他服务或容器推送消息 |
safeline-detector | 检测容器 | 执行检测的容器,从 Tengine 进入的流量会转发到该节点检测 |
safeline-mario | 日志容器 | 记录与统计恶意行为的节点 |
safeline-tengine | 网关 | 转发网关,有简单的过滤功能 |
safeline-pg | 关系型数据库 | 存储攻击日志、保护站点、黑白名单配置的数据库 |
- 要实现旁路接入,先要干掉Tengine,再在Openresty中安装t1k拓展
部署配置
- 在/data/safeline目录下创建.env文件,写入内容:
SAFELINE_DIR=/data/safeline
MGT_PORT=9443
POSTGRES_PASSWORD=Postgres密码
REDIS_PASSWORD=Redis密码
SUBNET_PREFIX=192.168.199
IMAGE_TAG=latest-stream
IMAGE_PREFIX=chaitin
- 在/data/safeline目录下创建docker-compose.yml文件,以下是修改的docker compose 5.0.0版本文件:
[scode type="blue" size="small"]每次更新的compose文件都有修改,请根据实际版本进行修改[/scode]
yaml 代码:networks:
safeline-ce:
name: safeline-ce
driver: bridge
ipam:
driver: default
config:
- gateway: ${SUBNET_PREFIX:?SUBNET_PREFIX required}.1
subnet: ${SUBNET_PREFIX}.0/24
driver_opts:
com.docker.network.bridge.name: safeline-ce
services:
postgres:
container_name: safeline-pg
restart: always
image: postgres:15.2
volumes:
- ${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=safeline-ce
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.2
command: [postgres, -c, max_connections=200]
mgt:
container_name: safeline-mgt
restart: always
image: ${IMAGE_PREFIX}/safeline-mgt:${IMAGE_TAG:?image tag required}
volumes:
- /etc/localtime:/etc/localtime:ro
- ${SAFELINE_DIR}/resources/mgt:/app/data
ports:
- ${MGT_PORT:-9443}:1443
healthcheck:
test: curl -k -f https://localhost:1443/api/open/health
environment:
- MGT_PG=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-pg/safeline-ce?sslmode=disable
depends_on:
- postgres
- fvm
dns:
- 119.29.29.29
- 223.5.5.5
- 180.76.76.76
- 1.2.4.8
- 114.114.114.114
- 8.8.8.8
logging:
options:
max-size: "100m"
max-file: "10"
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.4
detect:
container_name: safeline-detector
restart: always
image: ${IMAGE_PREFIX}/safeline-detector:${IMAGE_TAG}
volumes:
- ${SAFELINE_DIR}/resources/detector:/resources/detector
- ${SAFELINE_DIR}/logs/detector:/logs/detector
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/detector
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.5
mario:
container_name: safeline-mario
restart: always
image: ${IMAGE_PREFIX}/safeline-mario:${IMAGE_TAG}
volumes:
- ${SAFELINE_DIR}/resources/mario:/resources/mario
- ${SAFELINE_DIR}/logs/mario:/logs/mario
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/mario
- GOGC=100
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-pg/safeline-ce
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.6
tengine:
container_name: safeline-tengine
restart: always
image: ${IMAGE_PREFIX}/safeline-tengine:${IMAGE_TAG}
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/resolv.conf:/etc/resolv.conf:ro
- ${SAFELINE_DIR}/resources/nginx:/etc/nginx
- ${SAFELINE_DIR}/resources/detector:/resources/detector
- ${SAFELINE_DIR}/logs/nginx:/var/log/nginx
- ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
environment:
- TCD_MGT_API=https://${SUBNET_PREFIX}.4:1443/api/open/publish/server
- TCD_SNSERVER=${SUBNET_PREFIX}.5:8000
# deprecated
- SNSERVER_ADDR=${SUBNET_PREFIX}.5:8000
ulimits:
nofile: 131072
network_mode: host
luigi:
container_name: safeline-luigi
restart: always
image: ${IMAGE_PREFIX}/safeline-luigi:${IMAGE_TAG}
environment:
- MGT_IP=${SUBNET_PREFIX}.4
volumes:
- /etc/localtime:/etc/localtime:ro
- ${SAFELINE_DIR}/resources/luigi:/app/data
depends_on:
- detect
- mgt
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.7
fvm:
container_name: safeline-fvm
restart: always
image: ${IMAGE_PREFIX}/safeline-fvm:${IMAGE_TAG}
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.8
bridge:
container_name: safeline-bridge
restart: always
image: ${IMAGE_PREFIX}/safeline-bridge:${IMAGE_TAG}
command:
- /app/bridge
- serve
- -n
- unix
- -a
- /app/run/safeline.sock
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run:/app/run
logging:
options:
max-size: "100m"
max-file: "10"
networks:
safeline-ce:
ipv4_address: ${SUBNET_PREFIX}.9
depends_on:
- mgt
启动服务
shell 代码:docker compose up -d
替换Tengine
- 打开1Panel控制面板,在应用商店安装Openresty
- 应用商店安装的Openresty可能不包含t1k模块,可以在docker-compose文件中添加安装命令
- 在详情里面编辑Compose文件内容,添加以下配置
entrypoint:
- /bin/sh
- -c
- |
luarocks install lua-resty-t1k --server https://luarocks.cn
ln -s /usr/local/openresty/luajit/share/lua/5.1/resty/* /usr/local/openresty/lualib/resty/
/usr/local/openresty/bin/openresty -g "daemon off;"
volumes:
- /data/safeline/resources/detector:/resources/detector
- 这将在启动Openresty之前安装t1k模块,以避免lua文件找不到的问题
- 同时,将/data/safeline/resources/detector映射到容器内部,以建立t1k与WAF之间的通讯
网站配置
- 在网站中添加反代文件dali.conf,并在配置文件中添加以下内容
access_by_lua_block {
local t1k = require "resty.t1k"
local t = {
mode = "block", -- block or monitor or off, default off
host = "unix:/resources/detector/snserver.sock",
port = 8000,
connect_timeout = 1000,
send_timeout = 1000,
read_timeout = 1000,
req_body_size = 1024,
keepalive_size = 256,
keepalive_timeout = 60000,
remote_addr = "http_x_forwarded_for: 1",
}
local ok, err, _ = t1k.do_access(t, true)
if not ok then
ngx.log(ngx.ERR, err)
end
}
header_filter_by_lua_block {
local t1k = require "resty.t1k"
t1k.do_header_filter()
}
- 最后在站点的反向代理配置文件中添加以下内容
include /www/common/daili.conf;
- 由于 1Panel 的静态站点不使用 location 块,所以无法直接使用上面的 conf
- 如需对静态站点也套上Waf,可以新建static_daili.conf,写入以下内容:
location ~ / {
index index.html index.htm index.php default.php default.htm default.html;
include /www/common/daili.conf;
}
- 最后在站点的反向代理配置文件中添加以下内容
include /www/common/static_daili.conf;
- 再测试waf,拦截成功即代表配置成功
- 此方法比较麻烦,并且可能会出现其他未知问题,不推荐盲目折腾
套CDN获取源ip
- 如果你的网站套了CDN,那么你需要设置一下ip获取方式
- 一般情况下参照官网配置即可:其他问题 | 雷池 WAF 社区版 (chaitin.cn)
- 如果你使用华为cdn,那么你HTTP Header需要设置为
Cdn-Src-Ip
,其他cdn也一样
是订阅模式吗?
暂无点赞
OωO 用过社区版 很想试试专业版,感觉专业版很爽,没钱只能看看专业版 ::aru:crying::
暂无点赞
而且ddos我的服务器的人都是在第四层攻击的,求问这样做咋防
谁给你说雷池可以放dd
暂无点赞
暂无点赞
没有多余的服务器 ::twemoji:cry::
暂无点赞
::aru:angry:: 哈哈哈,不错写的。
::aru:knife:: 道长大驾光临,鄙人有失远迎
那为什么是拿个宝剑戳我?
道长来给我融点资 ::aru:pouting::
我很穷
坐守千万市值公司弱弱的说了一句:“我很穷” ::twemoji:sweat::
暂无点赞
暂无点赞
暂无点赞
暂无点赞
暂无点赞
暂无点赞
已添加贵站的链接~
暂无点赞
很详细!不错
感谢友人到访!多指教
暂无点赞
暂无点赞
[secret] 大佬大佬。求分享ip定位
[/secret]
[secret] 插件下载地址,附带说明
https://wwo.lanzouo.com/iH0GV1snibxa
[/secret]
感谢🙏🙏
加载!
暂无点赞
暂无点赞
暂无点赞
暂无点赞
我来看看佬,不愧是佬啊
暂无点赞
我来水个评论 ::twemoji:proud::
欢迎友人到访!(/ω\)
暂无点赞
暂无点赞