<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WAF on Colinx Blog</title><link>/tags/waf/</link><description>Recent content in WAF on Colinx Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 18 Dec 2023 00:00:00 +0000</lastBuildDate><atom:link href="/tags/waf/index.xml" rel="self" type="application/rss+xml"/><item><title>安全不是特权 - 雷池 WAF 使用体验及部署安装教程</title><link>/posts/%E5%AE%89%E5%85%A8%E4%B8%8D%E6%98%AF%E7%89%B9%E6%9D%83-%E9%9B%B7%E6%B1%A0waf%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%8F%8A%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</link><pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate><guid>/posts/%E5%AE%89%E5%85%A8%E4%B8%8D%E6%98%AF%E7%89%B9%E6%9D%83-%E9%9B%B7%E6%B1%A0waf%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%8F%8A%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</guid><description>
&lt;p>自从开始倒腾服务器，部署各种各样服务以来，网站安全一直是那个令我焦虑的一个话题。暴露了那么多服务在公网，总免不了有无聊的人或者别有用心的人在搞事。(当然也有可能不是人类 hhh) 之前也有几次被攻击的历史，比如阿里云控制台一堆 SSH 爆破攻击记录，还有 Wordpress 被攻陷，出现一堆奇怪的文章和评论。虽然损失不是很大，但是处理起来还是有点麻烦的。(被攻击之后学乖了，老老实实定期备份) 况且我在明敌在暗，我们总是处于被动的那个，时间一长，网站的风险和潜在的损失还是不小的，最好是可以有一些防火墙和策略能够拦截点大部分不友好的请求。&lt;/p>
&lt;p>很早以前就有调研过世面上的网站防火墙类产品，主要就几种类型：&lt;/p>
&lt;ul>
&lt;li>各大云厂商配套的 WAF, 不过收费都很贵&lt;/li>
&lt;li>Cloudflare 等 CDN 服务商提供的服务，不过必须要接入其 CDN 反代才能用。而且大陆地区联通性并不好&lt;/li>
&lt;li>&lt;a href="https://github.com/SpiderLabs/ModSecurity">ModSecurity&lt;/a> 等开源方案，开源免费可自托管，不过配置比较麻烦，而且没有好用的 web 页面&lt;/li>
&lt;/ul>
&lt;p>近期刚好关注到雷池 WAF 这个项目比较火，看了下是国内一个安全公司搞得，看 Github Repo 和官方文档像模像样的，虽然文档跟大多数中文项目一样，很多地方写的不够清晰，一些小细节没有跟最新的版本同步，但是&lt;strong>总体而言，可用，不难用。值得一试&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312182326408.png" alt="Pasted image 20231218222249">&lt;/p>
&lt;h2 id="使用体验">
使用体验
&lt;a href="#%e4%bd%bf%e7%94%a8%e4%bd%93%e9%aa%8c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>谈一谈我为什么选择使用雷池 WAF:&lt;/p>
&lt;ul>
&lt;li>免费，开源 (这点存疑，没有详细审计过所有 submoudule, 目前看起来只有部分开源，仓库里大部分都是文档啥的。不过有有安全厂商实名，应该不会做出来一些自毁招牌的操作)&lt;/li>
&lt;li>支持通过 &lt;code>docker compose&lt;/code> 自部署&lt;/li>
&lt;li>功能够用。基本反代站点配置，SSL, 多种规则的黑白名单，频率限制，人机验证，攻击历史看板&lt;/li>
&lt;/ul>
&lt;p>目前已经使用了有几个月了，来谈一谈一些个人感受&lt;/p>
&lt;p>优点：&lt;/p>
&lt;ul>
&lt;li>又要免费，又要能自部署，又要有方便使用的 web 页面，目前这个好像是唯一能选的&amp;hellip;&lt;/li>
&lt;li>支持 &lt;code>docker compose&lt;/code> 自部署，可以自行编排和自定义很多配置&lt;/li>
&lt;li>TOTP 认证，加分&lt;/li>
&lt;li>UI 简约清晰，加分&lt;/li>
&lt;/ul>
&lt;p>缺点：&lt;/p>
&lt;ul>
&lt;li>有一些小 bug, 挺影响使用体验的，比如我最开始用的那个版本，那时候还不知道这个只能 TOTP 验证，又找不到地方和文档设置初始账号密码，但是进首页直接跳到了仪表盘，又一直刷报错。这种情况没登录就不应该显示仪表盘界面的，非常误导人，我还以为是强制开了 HTTPS 但是我没有上传 SSL 证书导致的后端请求一直报错。&lt;/li>
&lt;li>开源了但是又没有完全开。人家企业做这个的本意是推销自家的收费套餐，这个没毛病。但是请不要挂羊头卖狗肉，影响不好。GitHub Repo 都是些文档内容，有个所谓的语义检测引擎倒是放了一点代码，但是这个代码量级太少了，像个玩具项目，不像是正儿八经投入使用的引擎的源码。看了下这个社区版本的文档之类的，从头到尾就没有提过怎么参与项目贡献代码，挂了个 GitHub 链接似乎只是诱导大家去 star, 这样好做宣传。合着这个所谓的社区版就只是部署了之后有个按钮，可以共享攻击记录的 ip?&lt;/li>
&lt;li>&lt;code>docker compose&lt;/code> 写的方式令人费解。竟然需要在&lt;code>.env&lt;/code> 文件中自定义一个内网网段，然后用 docker compose 的时候自动创建一个子网，每个容器根据子网的前缀指定了一个 ip, 然后其他容器连接都是在环境变量里写死&amp;hellip;.明明可以用 compose 文件里定义的 service name 或者 container name 作为 alias 使用内置的 dns 轻松实现的服务发现，为什么搞得如此麻烦？而且有没有考虑过，如果要更新，再执行 compose up 的时候，先前的子网 ip 是被占用的，每次还得先看一下当前用了哪些子网，然后找个没用的，这操作也是没谁了&amp;hellip; 你说人家懂吧，他还通过 env 文件自定义 compose 创建的子网前缀，说人家不懂吧，用 container name 做 alias 自动实现服务发现这么简单的方式竟然不用。可能有安全或者性能方面的考量？不过我个人使用还是全部删掉了写死子网前缀的配置，这个使用方法真实太离谱了&lt;/li>
&lt;li>目前只会记录疑似恶意的请求，正常请求不会记录，没法通过这个来看网站总访问情况了，有点可惜&lt;/li>
&lt;/ul>
&lt;h2 id="安装部署流程">
安装部署流程
&lt;a href="#%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2%e6%b5%81%e7%a8%8b" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>简单分享下我调优后的安装流程，不使用写死的子网前缀做服务发现。&lt;/p>
&lt;h3 id="1-获取-compose-文件">
1. 获取 compose 文件
&lt;a href="#1-%e8%8e%b7%e5%8f%96-compose-%e6%96%87%e4%bb%b6" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>官方文档默认提供的不是通过 &lt;code>docker compose&lt;/code> 安装，而是他们的一个脚本。可能是为了照顾广大墙内被 CSDN &amp;ldquo;惯坏&amp;quot;的用户吧，脚本里除了基本的环境检测，主要是提供 docker 的便捷安装，但是怎么说呢&amp;hellip;本意是给墙内用户便捷安装，但是为什么安装的操作还是到 docker 官方安装脚本，有没有一种可能，大部分大陆的服务器访问这个站点都很慢甚至连不上呢？但凡这里切一下 docker ce 镜像源都没这么离谱&amp;hellip;&lt;/p>
&lt;p>回到正题，这里还是大家通过 &lt;code>docker compose&lt;/code> 安装。没安装 docker 的建议先去安装，有条件的可以直接按照官方文档来，&lt;a href="https://docs.docker.com/engine/install/ubuntu/">安装文档链接&lt;/a>. 也可以参考我之前写的 RSSMAN 部署文档中 Docker 安装的部分，有讲解在国内环境下提前更换镜像源以更快完成下载安装。&lt;a href="https://rss101.colinx.one/deploy/rssman-full-guide/#1-docker">Docker 安装-RSSMAN 部署指南 - RSS101&lt;/a>
&lt;a href="https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/">RSSMan 部署指南&lt;/a>&lt;/p>
&lt;p>之后获取官方最新的 compose 文件。文档里贴的链接是在离线安装的章节有个 compose 文件链接 &lt;a href="https://waf-ce.chaitin.cn/release/latest/compose.yaml">https://waf-ce.chaitin.cn/release/latest/compose.yaml&lt;/a>&lt;/p>
&lt;p>当然也可以直接去 Github 找，在 release 文件夹下。https://github.com/chaitin/SafeLine/blob/main/release/latest/compose.yaml&lt;/p>
&lt;p>之后需要按照文档指示，在 compose 文件同文件夹位置，创建一个&lt;code>.env&lt;/code>文件，并填写相关的变量。这里推荐使用我调整后的版本。后续如果官方对于整个架构有更新，以官方的为准，可以自行根据需要调整 compose 文件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">services&lt;/span>:
&lt;span style="color:#f92672">safeline.manager&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-manager&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">chaitin/safeline-mgt-api:${IMAGE_TAG:?image tag required}&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">${SAFELINE_DIR?safeline dir required}/resources/management:/resources/management&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/nginx:/resources/nginx&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/logs:/logs&lt;/span>
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
&lt;span style="color:#f92672">ports&lt;/span>:
- &lt;span style="color:#ae81ff">${MGT_PORT:-9443}:1443&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">MANAGEMENT_RESOURCES_DIR=/resources/management&lt;/span>
- &lt;span style="color:#ae81ff">NGINX_RESOURCES_DIR=/resources/nginx&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-db/safeline-ce&lt;/span>
- &lt;span style="color:#ae81ff">MARIO_URL=http://safeline-mario:3335&lt;/span>
- &lt;span style="color:#ae81ff">FVM_MANAGER_URL=safeline.fvm-manager:9004&lt;/span>
- &lt;span style="color:#ae81ff">MANAGEMENT_LOGS_DIR=/logs/management&lt;/span>
&lt;span style="color:#f92672">dns&lt;/span>:
- &lt;span style="color:#ae81ff">119.29.29.29&lt;/span>
- &lt;span style="color:#ae81ff">223.5.5.5&lt;/span>
- &lt;span style="color:#ae81ff">8.8.8.8&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">cap_drop&lt;/span>:
- &lt;span style="color:#ae81ff">net_raw&lt;/span>
&lt;span style="color:#f92672">safeline.detector&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-detector&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">chaitin/safeline-detector:${IMAGE_TAG}&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/detector:/resources/detector&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/logs/detector:/logs/detector&lt;/span>
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">LOG_DIR=/logs/detector&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">cap_drop&lt;/span>:
- &lt;span style="color:#ae81ff">net_raw&lt;/span>
&lt;span style="color:#f92672">safeline.mario&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-mario&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">chaitin/safeline-mario:${IMAGE_TAG}&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/mario:/resources/mario&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/logs/mario:/logs/mario&lt;/span>
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">LOG_DIR=/logs/mario&lt;/span>
- &lt;span style="color:#ae81ff">GOGC=100&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline.postgres/safeline-ce&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">cap_drop&lt;/span>:
- &lt;span style="color:#ae81ff">net_raw&lt;/span>
&lt;span style="color:#f92672">safeline.tengine&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-gateway&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">chaitin/safeline-tengine:${IMAGE_TAG}&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/nginx:/etc/nginx&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/management:/resources/management&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/detector:/resources/detector&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/logs/nginx:/var/log/nginx&lt;/span>
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
&lt;span style="color:#75715e"># - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache&lt;/span>
- &lt;span style="color:#ae81ff">tengine-cache:/usr/local/nginx/cache&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">MGT_API=https://safeline.manager:1443/api/publish/server&lt;/span>
&lt;span style="color:#f92672">ulimits&lt;/span>:
&lt;span style="color:#f92672">nofile&lt;/span>: &lt;span style="color:#ae81ff">131072&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">ports&lt;/span>:
- &lt;span style="color:#ae81ff">80&lt;/span>:&lt;span style="color:#ae81ff">80&lt;/span>
- &lt;span style="color:#ae81ff">443&lt;/span>:&lt;span style="color:#ae81ff">443&lt;/span>
&lt;span style="color:#f92672">safeline.fvm-manager&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-fvm-manager&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">chaitin/safeline-fvm-manager:${IMAGE_TAG}&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">FVM_LOGS_DIR=/logs/management&lt;/span>
- &lt;span style="color:#ae81ff">DETECTOR_URL=http://safeline-detector:8001&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/logs:/logs&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">cap_drop&lt;/span>:
- &lt;span style="color:#ae81ff">net_raw&lt;/span>
&lt;span style="color:#f92672">safeline.postgres&lt;/span>:
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">safeline-db&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">always&lt;/span>
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">postgres:15-alpine&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#ae81ff">${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data&lt;/span>
- &lt;span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">POSTGRES_USER=safeline-ce&lt;/span>
- &lt;span style="color:#ae81ff">POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}&lt;/span>
&lt;span style="color:#f92672">networks&lt;/span>:
- &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">cap_drop&lt;/span>:
- &lt;span style="color:#ae81ff">net_raw&lt;/span>
&lt;span style="color:#f92672">command&lt;/span>: [&lt;span style="color:#ae81ff">postgres, -c, max_connections=200]&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
&lt;span style="color:#f92672">tengine-cache&lt;/span>:
&lt;span style="color:#f92672">networks&lt;/span>:
&lt;span style="color:#f92672">safeline&lt;/span>:
&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;span style="color:#f92672">driver&lt;/span>: &lt;span style="color:#ae81ff">bridge&lt;/span>
&lt;span style="color:#f92672">driver_opts&lt;/span>:
&lt;span style="color:#f92672">com.docker.network.bridge.name&lt;/span>: &lt;span style="color:#ae81ff">safeline&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-安装部署">
2. 安装部署
&lt;a href="#2-%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>部署成功后，第一次使用理论上会跳转到 TOTP 绑定页面。我之前这里卡到 bug, 第一次访问不是首页，没有看到那个绑定 TOTP 的二维码，后面就一直没法跳转到绑定页面了&amp;hellip;.不知道后面这个 bug 修复了没有，如果大家也遇到这个问题可以考虑全部清理干净，重新安装。&lt;/p>
&lt;p>TOTP 软件推荐和对比：&lt;/p>
&lt;ul>
&lt;li>Microsoft Authenticator( 微软出品，支持云同步，国内可用，微软账户验证有单独的通道和验证方式，速度和体积一般)&lt;/li>
&lt;li>Google Authenticator (谷歌出品，简约好用，体积小速度快，可惜大陆地区没法云同步)&lt;/li>
&lt;li>BitWarden (支持使用自建实例，可惜 app 略卡)&lt;/li>
&lt;/ul>
&lt;h2 id="总结">
总结
&lt;a href="#%e6%80%bb%e7%bb%93" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>雷池 WAF 目前来看是一款够用，不难用的免费 WAF, 建议一试。&lt;/p>
&lt;p>此外重要数据还是要经常备份，多副本 + 多地存储，数据无价！&lt;/p></description></item></channel></rss>