背景
前阵子公司多个项目,参与攻防演练。服务器没做什么安全配置。就一个nginx做一些拦截不规则请求,防盗链,限制IP的配置,完全是被攻击后才加上去的限制规则,又不是做安全出身,对攻击行为了解有限。做不到自动化,很有必要用安全工具来防护。
调研
综合对比下相关waf工具,发现雷池的生态比较齐全,有免费版和商业版,而且持续维护更新(这点很重要)(有很多免费开源的waf已经近几年不更新了,类似httpwaf)。
雷池社区版
长亭科技官网
雷池社区版是长亭科技根据企业版雷池 Web 应用防护系统提炼而来,核心检测能力由长亭首创的智能语义分析算法驱动。项目开源了语义分析算法的核心引擎和相关安全插件,控制台未开源。防护效果好,项目迭代快,界面清爽好用,虽然功能上比企业版本少,但完全满足 WAF 的基本需求。
有需求的金主还是建议上企业版,企业版防护功能更加丰富,让你的系统真正不让黑客越雷池半步。
- 防护效果:对通用漏洞和非通用漏洞的防护效果都不错,误报少。
- 技术先进性:核心技术是语义分析算法,相比正则规则的可对抗性更高、性能更好
- 项目质量:具备 WAF 各项基础能力,项目未完全开源,文档相对完善,有讨论组群解答各种问题(群里的工作人员相对活跃,回复很及时)
- 社区认可度:2800+ star,装机量 12000+
- 社区活跃度:持续有更新(社区版计划每周更新一版本)(企业版的服务会更好)
安装
雷池waf有三种安装方式供选择: - 在线安装 : 推荐安装方式
- 离线安装 : 服务器无法连接 Docker Hub 时选择
- 一键安装 : 最简单的安装方式
我选择离线安装,适用各种无外网环境。
根据官网文档安装教程,编写安装脚本,实现离线一键安装。
编写一键安装脚本。
#!/bin/bash
echo 加载镜像
cat image.tar.gz | gzip -d | docker load
echo 创建安装目录
DIR=/data/docker/safeline/
mkdir -p $DIR
echo 复制编排文件
cp -f compose.yaml $DIR
cd ..
rm -rf waf/
echo 添加配置
cat >> ${DIR}.env << EOF
SAFELINE_DIR=${DIR}
IMAGE_TAG=latest
MGT_PORT=9443
POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)
REDIS_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)
SUBNET_PREFIX=169.254.0
EOF
cat ${DIR}.env
echo 启动镜像
docker-compose -f ${DIR}compose.yaml up -d
echo 安装成功
echo 访问:http://ip:9443,登录雷池控制台
将镜像包、编排文件、安装脚本,上传到服务器:
执行脚本一键安装:chmod +x install.sh && ./install.sh
安装成功,访问雷池控制台:
配置
原来的部署架构
现在需要把雷池waf放在第一层,做安全防护,无效的请求直接拦截
配置雷池waf后的部署架构
第一步:
修改原来的nginx
将80端口改为81端口,443端口注释掉
重启nginx
第二步:
配置雷池waf
添加防护站点
配置80端口
配置443端口
http自动跳转到https
修改雷池waf的nginx配置,将80请求重定向到443,雷池预留了自定义配置参数
安装路径下,safeline/resources/nginx/custom_params
添加以下配置
return 307 https://www.waf.com$request_uri;
重启雷池waf的nginx
docker exec safeline-tengine nginx -t
还有很多好用的功能,小伙伴们就自行研究了。
类似:站点维护,黑白名单,人机验证。这都是很实用的功能。完全免费。长亭科技大大滴良心。
ps:自定义页面
很多小伙伴想自定义,403页面、维护页面,但是雷池waf默认是不允许修改的,每分钟会定时覆盖掉。
这里给你们提供一个自定义的思路,因为这些页面是通过nginx容器来代理跳转的,nginx里面修改配置就行了,然后重启,所以你懂的吧。
但还是提醒下免费版默认不允许商用的,这些自定义页面属于个人行为,小伙伴们研究研究自己玩玩就好。
升级
最近雷池waf发布了2.5.0版本,新增了频繁请求拦截功能
离线版没有一键升级怎么行
编写更新脚本
#!/bin/bash
#雷池waf安装目录
DIR=/data/docker/safeline/
echo 备份yaml
mv ${DIR}compose.yaml ${DIR}compose.yaml.old
cp -f compose.yaml ${DIR}
echo 加载镜像
docker load -i image.tar.gz
cd $DIR
echo 添加配置
sed -i "s/IMAGE_TAG=.*/IMAGE_TAG=latest/g" ".env"
grep "SAFELINE_DIR" ".env" > /dev/null || echo "SAFELINE_DIR=$(pwd)" >> ".env"
grep "IMAGE_TAG" ".env" > /dev/null || echo "IMAGE_TAG=latest" >> ".env"
grep "MGT_PORT" ".env" > /dev/null || echo "MGT_PORT=9443" >> ".env"
grep "POSTGRES_PASSWORD" ".env" > /dev/null || echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> ".env"
grep "REDIS_PASSWORD" ".env" > /dev/null || echo "REDIS_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> ".env"
grep "SUBNET_PREFIX" ".env" > /dev/null || echo "SUBNET_PREFIX=172.22.222" >> ".env"
echo 删除旧容器
docker-compose down
echo 启动新容器
docker-compose up -d
echo 更新成功
将镜像包、编排脚本、更新脚本,上传到服务器
执行更新
chmod +x update.sh && ./update.sh
更新成功