网站LOGO
静若安然
页面加载中
11月6日
网站LOGO 静若安然
记录个人学习生活和成长历程
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    新一代Web渗透入侵防御检测工具
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。

    新一代Web渗透入侵防御检测工具

    Akria · 原创 ·
    Web 安全网安 · Web安全
    共 13133 字 · 约 7 分钟 · 2712
    本文最后更新于2024年03月28日,已经过了222天没有更新,若内容或图片失效,请留言反馈
    • 简单记录一下使用雷池Waf专业版的感受

    前言

    • 作为雷池社区专业版第一波内测用户,很高兴有机会亲自见证这样一款强大的Waf崛起,从社区版到专业版,雷池已连续迭代更新多个版本,不断优化,不断根据用户反馈改进提升
    • 真心来说,相比使用过的其他Waf产品,雷池是唯一一款让我满意的产品,不是我故意贬低其他Waf产品,从安全,防护能力,智能化等方面综合来讲,雷池确实可以排在前面

    功能

    • 前面我已经写过一篇文章简单讲述了一下雷池的功能,大家可以参考一下

    [post cid="2896" cover="" size="small"/]

    • 雷池分为社区版,专业版,企业版,作为普通用户,如果你想追求更好的防护而迫于经济压力无法采购大厂安全产品,那么你完全可以考虑入手雷池专业版,最重要的是专业版还可以商用!
    • 相比社区版,专业版具有以下功能,详情可见:版本对比 | 雷池 WAF 社区版 (chaitin.cn)
    html 代码:
    所有社区版能力
    Web 攻击加强防护
    黑 IP 加强情报防护
    自定义拦截页面
    基于地理位置的访问控制
    上游服务器负载均衡
    • 为什么我会选择雷池专业版,作为个人站长,我希望的Waf是占用小,易部署,防护强,功能多,而雷池专业版恰好满足了我所有的需求

    负载均衡

    • 雷池专业版可实现负载均衡,对于我来说,业务需要部署在多台服务器上,如果采用其他Waf产品,中间还需要部署一台负载均衡服务器,相比直接在Waf上实现负载均衡,增加了不少服务响应时长,雷池专业版刚好解决了这个问题

    防护规则

    • 雷池专业版补充了更多的漏洞防护规则,可以根据业务场景进行调整,保证业务安全
    • 相比其他Waf产品,雷池可有效拦截信息泄露,扫描器,目录穿越等常规攻击

    黑名单设置

    • 从雷池升级专业版以来,添加了我最喜欢的功能,支持设置不同国家/地区省份访问黑名单

    自定义拦截页面

    • 雷池专业版还支持自定义拦截页面,对于一些小伙伴来说,这个可是福利

    部署

    • 相比某些Waf产品来说,雷池的部署以及升级非常Easy,只需要一条命令即可开始服务配置,这也是我喜欢雷池的原因之一,不用过多的敲代码,如果docker安装较慢,还提供了华为云加速安装命令
    • 部署方式详细可见:安装雷池 | 雷池 WAF 社区版 (chaitin.cn)
    bash 代码:
    雷池服务器配置最低要求
    
    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
    yaml 代码:
    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,具体方式如下:
    1. 添加上游服务为https://127.0.0.1:2443
    2. 域名填写与openresty站点一致
    3. 雷池WAF监听443端口
    4. 上传证书
    • 这样子就正常添加了,正常网站配置还是由openresty 提供,雷池WAF做个下游

    • 可能有些朋友的业务以旁路部署的方式比较合适,以下就简单说一下如何进行旁路部署

    旁路部署

    • 虽然说社区版和专业版并没有提供旁路部署(非反向代理接入)方式,但我们依旧可以实现旁路部署,以下是使用1panel进行旁路部署
    • 先简单分析一下雷池社区版安装脚本
    bash 代码:
    bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
    • 以下是脚本分析结果
    1. 显示雷池(SafeLine)WAF的图形
    2. 定义了一个名为qrcode的函数,用于显示雷池项目讨论组的二维码。
    3. 定义了几个辅助函数:

      • command_exists:检查给定的命令是否存在
      • check\_container\_health()​:检查 Docker 容器的健康状态,如果容器健康,就返回健康状态,否则返回错误信息
      • space_left:返回给定目录的可用空间
      • start_docker:启动 Docker 服务并设置为开机自启
      • confirm():向用户提供一个确认提示,用户可以选择 ‘Y’ 或 ‘N’
      • info(), warning(), abort():这些函数用于显示不同级别的信息,包括一般信息、警告和错误
      • ​onexit():当用户中断脚本时,这个函数会被调用,显示一个错误信息并退出脚本
    4. 检查CPU 是否支持 ssse3 指令集,如果不支持则终止安装
    5. 脚本是否在 Bash 中运行
    6. STDIN 是否是标准输入设备
    7. 脚本是否没有参数
    8. 脚本是否以 root 权限运行
    9. Docker 是否已经安装,如果没有,询问用户是否需要自动安装
    10. Docker 服务是否正常工作,如果异常则终止安装
    11. Docker Compose Plugin 是否存在,如果没有,询问用户是否需要自动安装
    12. 提示用户输入雷池安装目录,默认为/data/safeline,并检查目录的存储空间是否足够
    13. 创建安装目录,并下载compose.yaml文件和.env文件
    14. 在.env文件中设置一些配置参数,如安装目录、镜像标签、管理端口等
    15. 始下载Docker镜像,并启动Docker容器
    16. 示雷池WAF社区版安装成功的二维码,并提供访问控制台的链接

    • 脚本内容主以检查环境,创建文件夹及.env文件和启动docker-compose为主
    • 以下是写入.env文件内容
    bash 代码:
    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文件中,定义了以下几个服务:
    1. postgres(PostgreSQL数据库服务):用于存储SafeLine WAF社区版的数据,包括配置信息和日志
    2. redis(Redis服务):用于作为缓存和消息队列,以提供快速的数据访问和通信
    3. management(SafeLine管理API服务):这是SafeLine WAF的管理接口,允许用户配置和管理WAF的规则和策略
    4. detector(SafeLine Detector服务):SafeLine WAF的核心组件,用于检测和拦截恶意流量
    5. mario(SafeLine Mario服务):SafeLine WAF的一个组件,用于处理日志数据和性能监控
    6. tengine(SafeLine Tengine服务):一个Web服务器,用于代理和处理网络流量,实现Web应用防火墙的功能
    名称定义详情
    safeline-mgt管理容器接收管理后台行为,向其他服务或容器推送消息
    safeline-detector检测容器执行检测的容器,从 Tengine 进入的流量会转发到该节点检测
    safeline-mario日志容器记录与统计恶意行为的节点
    safeline-tengine网关转发网关,有简单的过滤功能
    safeline-pg关系型数据库存储攻击日志、保护站点、黑白名单配置的数据库
    • 要实现旁路接入,先要干掉Tengine,再在Openresty中安装t1k拓展

    部署配置

    • 在/data/safeline目录下创建.env文件,写入内容:
    bash 代码:
    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文件内容,添加以下配置
    yaml 代码:
    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,并在配置文件中添加以下内容
    nginx 代码:
    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()
    }
    • 最后在站点的反向代理配置文件中添加以下内容
    nginx 代码:
    include /www/common/daili.conf;

    • 由于 1Panel 的静态站点不使用 location 块,所以无法直接使用上面的 conf
    • 如需对静态站点也套上Waf,可以新建static_daili.conf,写入以下内容:
    nginx 代码:
    location ~ / {
        index index.html index.htm index.php default.php default.htm default.html; 
        include /www/common/daili.conf;
    }
    • 最后在站点的反向代理配置文件中添加以下内容
    nginx 代码:
    include /www/common/static_daili.conf;

    • 再测试waf,拦截成功即代表配置成功
    • 此方法比较麻烦,并且可能会出现其他未知问题,不推荐盲目折腾

    套CDN获取源ip

    • 如果你的网站套了CDN,那么你需要设置一下ip获取方式
    • 一般情况下参照官网配置即可:其他问题 | 雷池 WAF 社区版 (chaitin.cn)
    • 如果你使用华为cdn,那么你HTTP Header需要设置为Cdn-Src-Ip,其他cdn也一样
    声明:本文由 Akria(博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。
    现在已有

    23

    条评论
    我要发表评论
    1. 头像
      Nnkin
      • 等级:Lv.2
      • 角色:访客
      • 在线:本月

      是订阅模式吗?

      · · · 四川-成都
    2. 头像
      xiaoxu
      头像 xiaoxu
      • 等级:Lv.1
      • 角色:访客
      • 在线:很久之前

      OωO 用过社区版 很想试试专业版,感觉专业版很爽,没钱只能看看专业版😅 😅 😅

      · · · 重庆-重庆
    3. 头像
      ztrztr
      • 等级:Lv.4
      • 角色:访客
      • 在线:很久之前

      而且ddos我的服务器的人都是在第四层攻击的,求问这样做咋防

      · · · 北京-北京
      1. 头像
        Anran ztrztr

        谁给你说雷池可以放dd

        · · · 海外
    4. 头像
      ztrztr
      • 等级:Lv.4
      • 角色:访客
      • 在线:很久之前

      没有多余的服务器 😇 😇 😇

      · · · 北京-北京
    5. 头像
      懋和道人
      • 等级:Lv.2
      • 角色:综合 · 好友
      • 在线:很久之前

      😀 😀 😀 哈哈哈,不错写的。

      · · · 江苏-南通
      1. 头像
        Anran 懋和道人

        😀 😀 😀 道长大驾光临,鄙人有失远迎

        · · · 海外
        1. 头像
          懋和道人
          • 等级:Lv.2
          • 角色:综合 · 好友
          • 在线:很久之前
          Anran

          那为什么是拿个宝剑戳我?

          · · · 江苏-南通
          1. 头像
            Anran 懋和道人

            道长来给我融点资😅 😇 😇

            · · · 海外
            1. 头像
              懋和道人
              • 等级:Lv.2
              • 角色:综合 · 好友
              • 在线:很久之前
              Anran

              我很穷

              · · · 江苏-南通
              1. 头像
                Anran 懋和道人

                坐守千万市值公司弱弱的说了一句:“我很穷” 😅 😅 😅

                · · · 海外
    6. 头像
      TeacherDu
      • 等级:Lv.2
      • 角色:访客
      • 在线:很久之前

      已添加贵站的链接~

      · · · 北京-北京
    7. 头像
      刘郎
      • 等级:Lv.2
      • 角色:访客
      • 在线:很久之前

      很详细!不错

      · · · 海外
      1. 头像
        Anran 刘郎

        感谢友人到访!多指教

        · · · 海外
    8. 头像
      小月
      头像 小月
      • 等级:Lv.2
      • 角色:访客
      • 在线:很久之前

      大佬大佬。求分享ip定位

      · · · 海外
      1. 头像
        Anran 小月

        插件下载地址,附带说明
        https://wwo.lanzouo.com/iH0GV1snibx

        · · · 海外
        1. 头像
          小月
          头像 小月
          • 等级:Lv.2
          • 角色:访客
          • 在线:很久之前
          Anran

          感谢🙏🙏

          · · · 海外
          1. 头像
            小月
            头像 小月
            • 等级:Lv.2
            • 角色:访客
            • 在线:很久之前
            小月

            加载!

            · · · 海外
    9. 头像
      歆宋
      • 等级:Lv.1
      • 角色:访客
      • 在线:很久之前

      我来看看佬,不愧是佬啊

      · · · 湖北-武汉
    10. 头像
      神秘奇男子
      头像 神秘奇男子
      • 等级:Lv.1
      • 角色:访客
      • 在线:很久之前

      我来水个评论😀 😀 😀

      · · · 海外
      1. 头像

        欢迎友人到访!(/ω\)

        · · · 海外
    博客logo 静若安然 记录个人学习生活和成长历程 51统计 百度统计
    ICP 蜀ICP备2023037012号-1

    💻️ Akria 昨天 18:19 在线

    🕛

    本站已运行 7 年 72 天 15 小时 0 分
    静若安然. © 2017 ~ 2024.
    网站logo

    静若安然 记录个人学习生活和成长历程
     
     
     
     
     
     
     
     

    23

    1

  • 下一篇