前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >centos7环境下ModSecurity-envoy编译和测试(二)-野路子技术宅

centos7环境下ModSecurity-envoy编译和测试(二)-野路子技术宅

原创
作者头像
野路子技术宅
发布2023-01-30 12:49:24
1.7K0
发布2023-01-30 12:49:24
举报
文章被收录于专栏:手码记录手码记录

@@ ~~ ^ ^ &&

相信光,相信相信的力量.

技术是安身立命之本,实践出真知,熟能生巧,佐以业务能力,遇上风口之时,可逆天改命!

本文同步发布在作者的个人博客,欢迎转载。野路子技术宅博客

http://www.yousee.top

=====================================================================

modsec.png

=====================================================================

通过上一章的《centos7环境下ModSecurity-envoy编译和测试(一)》,希望大家能顺利开展编译工作。本章紧接着完成测试工作。

本章目标:

完成modsecurity-envoy在本地centos7环境下配置和拦截测试


在本地虚拟机134环境测试

配置IPS阻断模式拦截非法其你去

配置webhook收集接收拦截日志

工作根目录 : /root/waf/ModSecurity-envoy/ModSecurity-envoy


https://github.com/vmware-archive/ModSecurity-envoy

一、下载规则集

cd ${ModSecurity-envoy}/conf

查看lds.yml文件,确认crs文件存放目录:

vi conf/conf.lds.yml

before envoy.router because order matters!

代码语言:txt
复制
    - name: envoy.filters.http.modsecurity
代码语言:txt
复制
      config:
代码语言:txt
复制
        rules\_inline: |
代码语言:txt
复制
          Include "conf/modsecurity.v3.0.3.conf"
代码语言:txt
复制
          Include "owasp-modsecurity-crs-3.1.1/crs-setup.conf.example"
代码语言:txt
复制
          Include "owasp-modsecurity-crs-3.1.1/rules/\*.conf"

这地方会造成混淆,如果把crs文件下载到conf目录,启动envoy服务会报错异常:

2023-01-06 16:09:37.177error http-filter-modsecurity/http_filter.cc:52 Failed to load rules: Rules error. File: <<reference missing or not informed>>. Line: 2. Column: 60. "owasp-modsecurity-crs-3.1.1/crs-setup.conf.example": Not able to open file. Looking at: 'owasp-modsecurity-crs-3.1.1/crs-setup.conf.example', 'owasp-modsecurity-crs-3.1.1/crs-setup.conf.example', '<<reference missing or not informed>>/owasp-modsecurity-crs-3.1.1/crs-setup.conf.example', '<<reference missing or not informed>>/owasp-modsecurity-crs-3.1.1/crs-setup.conf.example'.

2023-01-06 16:09:37.178info external/envoy/source/server/lds_api.cc:60 lds: add/update listener 'listener_0'

2023-01-06 16:09:37.178info external/envoy/source/server/listener_manager_impl.cc:761 all dependencies initialized. starting workers

2023-01-06 16:09:37.180info external/envoy/source/server/server.cc:516 starting main dispatch loop

确保owasp-modsecurity-crs-3.1.1与conf目录平级!

cd ${ModSecurity-envoy}/

wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.1.1.tar.gz

tar xvzf v3.1.1.tar.gz

二、启动集成WAF的envoy服务

cd /home/ModSecurity-envoy/

nohup ./envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info 

启动错误

udo ./envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info

type.googleapis.com/envoy.api.v2.Listener: node 'id' and 'cluster' are required. Set it either in 'node' config or via --service-node and --service-cluster options.

参照老外资料提示,增加service-cluseter及service-node参数。

代码语言:txt
复制
https://stackoverflow.com/questions/55999360/envoy-and-statsd-error-node-id-and-cluster-id-are-required

修正启动命令为:

nohup ./envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info  --service-cluster 'front-envoy' --service-node 'front-envoy'  >out.file 2>&1 &

ps -Af|grep envoy

tail -f out.file

服务正常运行

三、修改lds.yaml配置文件

vi conf/lds.yaml

增加配置如下:

1、 access_log开启access日志

2、 SecRuleEngine配置waf运行模式

3、 webhook配置WAF日志采集服务

version_info: "1"

resources:

  • "@type": type.googleapis.com/envoy.api.v2.Listener

name: listener_0

address:

代码语言:txt
复制
socket\_address:
代码语言:txt
复制
  address: 0.0.0.0
代码语言:txt
复制
  port\_value: 8585

filter_chains:

  • filters:
代码语言:txt
复制
- name: envoy.http\_connection\_manager
代码语言:txt
复制
  config:
代码语言:txt
复制
    codec\_type: auto
代码语言:txt
复制
    stat\_prefix: ingress\_http
代码语言:txt
复制
    access\_log:
代码语言:txt
复制
       name: envoy.file\_access\_log
代码语言:txt
复制
       typed\_config:
代码语言:txt
复制
         "@type": type.googleapis.com/envoy.config.accesslog.v2.FileAccessLog
代码语言:txt
复制
         path: /root/waf/accesslog.txt
代码语言:txt
复制
    route\_config:
代码语言:txt
复制
      name: local\_route
代码语言:txt
复制
      virtual\_hosts:
代码语言:txt
复制
      - name: backend
代码语言:txt
复制
        domains:
代码语言:txt
复制
        - "\*"
代码语言:txt
复制
        routes:
代码语言:txt
复制
        - match:
代码语言:txt
复制
            prefix: "/"
代码语言:txt
复制
          route:
代码语言:txt
复制
            cluster: service1
代码语言:txt
复制
          metadata:
代码语言:txt
复制
            filter\_metadata:
代码语言:txt
复制
              envoy.filters.http.modsecurity:
代码语言:txt
复制
                # disable: true
代码语言:txt
复制
                # disable\_request: true
代码语言:txt
复制
                # disable\_response: true
代码语言:txt
复制
    http\_filters:
代码语言:txt
复制
    # before envoy.router because order matters!
代码语言:txt
复制
    - name: envoy.filters.http.modsecurity
代码语言:txt
复制
      config:
代码语言:txt
复制
        rules\_inline: |
代码语言:txt
复制
          Include "conf/modsecurity.v3.0.3.conf"
代码语言:txt
复制
          Include "owasp-modsecurity-crs-3.1.1/crs-setup.conf.example"
代码语言:txt
复制
          Include "owasp-modsecurity-crs-3.1.1/rules/\*.conf"
代码语言:txt
复制
          SecRuleEngine On #阻断模式
代码语言:txt
复制
          #SecRuleEngine DetectionOnly #监测模式,不阻断
代码语言:txt
复制
          SecRule ARGS:param1 "test" "id:1,phase:1,deny,status:400,msg:'Test rule'" # 测试request请求test参数
代码语言:txt
复制
          SecRule REQUEST\_BODY  "blocktest" "id:2,phase:2,deny,status:400,msg:'Test rule'" # 测试post模式的body参数
代码语言:txt
复制
        webhook:
代码语言:txt
复制
          http\_uri:
代码语言:txt
复制
            uri: http://localhost:10000/wh\_callback
代码语言:txt
复制
            cluster: service2
代码语言:txt
复制
            timeout:
代码语言:txt
复制
              seconds: 3
代码语言:txt
复制
          secret: webhook\_secret
代码语言:txt
复制
    - name: envoy.router
代码语言:txt
复制
      config: {}

关于CRS的phase1-5阶段说明,参照资料如下:

代码语言:txt
复制
https://www.jianshu.com/p/2981dd8e23dc
代码语言:txt
复制
Request Header(phase:1):处理 requesst line 和 request headers
代码语言:txt
复制
Request Body(phase:2):处理 request body
代码语言:txt
复制
Response Header(phase:3):处理 response headers
代码语言:txt
复制
Response Body(phase:4):处理 response body
代码语言:txt
复制
Logging(phase:5):日志记录,添加header

关于lds.xml 文件修改说明:

代码语言:txt
复制
    SecRuleEngine On
代码语言:txt
复制
    SecRuleEngine DetectionOnly
代码语言:txt
复制
                  SecRule ARGS:param1 "test" "id:1,phase:1,deny,status:400,msg:'Test rule'"
代码语言:txt
复制
                 SecRule REQUEST\_BODY  "blocktest" "id:2,phase:2,deny,status:400,msg:'Test rule'"
代码语言:txt
复制
    可用的值是:
代码语言:txt
复制
        On:开启规则匹配并进行相应的拦截
代码语言:txt
复制
        Off:关闭规则匹配,默认关闭
代码语言:txt
复制
        DetectionOnly:开启规则匹配,但不执行任何拦截操作(阻止,拒绝,放弃,允许,代理和重定向)

四、启动webhook服务

1、安装nodejs v14.15.4

安装过程略

2、启动webhook服务

代码语言:txt
复制
项目地址 :https://github.com/oiuv/webhook
代码语言:txt
复制
修改webhook.js,精简逻辑为打印日志。

const http = require('http');

const { spawn } = require('child_process') // 子进程, 用来执行脚本

http.createServer((req, res) => {

代码语言:txt
复制
console.log(`--- ${req.method} --- ${req.url} ---`);
代码语言:txt
复制
console.log(`--- headers : ${JSON.stringify(req.headers)} ---`)
代码语言:txt
复制
console.log(`--- ${JSON.stringify(req.trailers)} ---`)
代码语言:txt
复制
res.setHeader("Content-Type", "application/json");
代码语言:txt
复制
// request
代码语言:txt
复制
if (req.method === 'POST') {
代码语言:txt
复制
    // 获取body
代码语言:txt
复制
    let body = '';
代码语言:txt
复制
    req.on('data', (data) => {
代码语言:txt
复制
        // console.log(`--- data: ${data} ---`);
代码语言:txt
复制
        body += data;
代码语言:txt
复制
    });
代码语言:txt
复制
    req.on('end', () => {
代码语言:txt
复制
        let payload = JSON.parse(body);
代码语言:txt
复制
       // console.log(`--- ${payload.repository} ---`);
代码语言:txt
复制
       console.log(`------${body}------`);
代码语言:txt
复制
        // response
代码语言:txt
复制
        let json = JSON.stringify({
代码语言:txt
复制
            status: "success",
代码语言:txt
复制
            code: 200
代码语言:txt
复制
        });
代码语言:txt
复制
        res.end(json);
代码语言:txt
复制
    });
代码语言:txt
复制
}
代码语言:txt
复制
else {
代码语言:txt
复制
    let json = JSON.stringify({
代码语言:txt
复制
        status: "OK",
代码语言:txt
复制
        code: 200
代码语言:txt
复制
    });
代码语言:txt
复制
    res.end(json);
代码语言:txt
复制
}

}).listen(10000)

3、其他开源webhook

代码语言:txt
复制
未测试使用,有兴趣同学可以测试这个项目。
代码语言:txt
复制
https://github.com/adnanh/webhook

五、简单命令行测试

ps -aux|grep envoy

kill掉进程并重启envoy服务

nohup ./envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info  --service-cluster 'front-envoy' --service-node 'front-envoy'  >out.file 2>&1 &

1、发送phase1、phase2的测试请求:

代码语言:txt
复制
curl -X GET "http://192.168.13.134:8585/get?param1=test" -H "accept: application/json" 

响应返回

代码语言:txt
复制
ModSecurity Action

查看日志文件

代码语言:txt
复制
tail -f   /var/log/modsec\_audit.log
代码语言:txt
复制
ModSecurity: Access denied with code 200 (phase 1). Matched "Operator `Rx' with parameter `test' against variable `ARGS:param1' (Value: `test' ) [file "<<reference missing or not informed>>"] [line "7"] [id "1"] [rev ""] [msg "Test rule"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "192.168.13.134"] [uri "/get"] [unique\_id "167355977637.969769"] [ref "o0,4v16,4"]

2、body测试请求

代码语言:txt
复制
curl -v -XPOST -H "Content-Type:application/xml" http://192.168.13.134:8585/ -d ' blocktest '

响应返回

代码语言:txt
复制
    \* upload completely sent off: 11 out of 11 bytes
代码语言:txt
复制
    < HTTP/1.1 400 Bad Request
代码语言:txt
复制
    < content-length: 19
代码语言:txt
复制
    < content-type: text/plain
代码语言:txt
复制
    < date: Thu, 12 Jan 2023 22:13:56 GMT
代码语言:txt
复制
    < server: envoy

从两次测试数据看,配置达到预期结果,实现waf拦截目的。

六、使用开源gotestwaf测试Modesecurity

操作系统:centos7

客户端IP : 192.168.13.132

目标客户端 IP :192.168.13.134

1、gotestwaf项目地址

代码语言:txt
复制
https://github.com/wallarm/gotestwaf

2、安装docker环境

代码语言:txt
复制

3、安装golang

代码语言:txt
复制

4、过程测试

代码语言:txt
复制
docker pull wallarm/gotestwaf
代码语言:txt
复制
set PWD=/root/waf/goTestWaf
代码语言:txt
复制
docker run -v ${PWD}/reports:/root/reports wallarm/gotestwaf --grpcPort 9000 --url=http://192.168.13.134:8585/   --skipWAFBlockCheck

查看攻击日志

cat /var/log/modsec_audit.log

七、后台运行Modsecurity-envoy程序

生产环境使用nohup启动服务,关闭xshell回话窗口后,服务也同时终止,没法持续提供服务。

nohup ./envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info  --service-cluster 'front-envoy' --service-node 'front-envoy'  >out.file 2>&1 &

计划通过shell脚本运行守护进程,解决会话关闭问题。

linux环境shell守护进程参考资料:

代码语言:txt
复制
https://blog.csdn.net/qq\_32348883/article/details/123167216

1、方案设计

代码语言:txt
复制
自定义daemon.sh脚本
代码语言:txt
复制
设置crontab定时任务执行脚本
代码语言:txt
复制
循环检测服务是否已经启动

2、脚本定义daemon.sh


#!/bin/sh

#添加本地执行路径

export LD_LIBRARY_PATH=./

while true; do

代码语言:txt
复制
    #启动一个循环,定时检查进程是否存在
代码语言:txt
复制
    server=`ps aux | grep envoy-static | grep -v grep`
代码语言:txt
复制
    if [ ! "$server" ]; then
代码语言:txt
复制
        #如果不存在就重新启动
代码语言:txt
复制
        nohup envoy-static -c conf/envoy-modsecurity-example-lds.yaml -l info  --service-cluster 'front-envoy' --service-node 'front-envoy'  &
代码语言:txt
复制
        #启动后沉睡10s
代码语言:txt
复制
        sleep 10
代码语言:txt
复制
    fi
代码语言:txt
复制
    #每次循环沉睡10s
代码语言:txt
复制
    sleep 5

done

3、启动脚本

chmod -u+rwx daemon.sh

nohup ./daemon.sh >out.file 2>&1 &

4、关闭服务

代码语言:txt
复制
ps -aux |grep daemon.sh 
代码语言:txt
复制
kill -9 进程
代码语言:txt
复制
ps -aux |grep envoy-static
代码语言:txt
复制
kill -9 进程

七、未解决问题 TODO

1、全局拦截跳转页面配置

需求:全局配置,拦截跳转到提示界面

结果:没完成配置实验,待后续测试。TODO

SecDefaultAction "phase:1,deny,log,noauditlog,status:400,redirect:http://modsecurity.cn/practice/intercept.html?url=%{REQUEST_FILENAME}&intercept_domain=%{request_headers.host}"

SecDefaultAction "phase:2,deny,log,noauditlog,status:400redirect:http://modsecurity.cn/practice/intercept.html?url=%{REQUEST_FILENAME}&intercept_domain=%{request_headers.host}"

八、其他参考资料

1、WAF部署方式介绍

https://blog.csdn.net/qq_38265137/article/details/106742893

2、# owasp crs加载规则优先级说明

https://coreruleset.org/docs/deployment/quick_start/

The order of file inclusion in your webserver configuration should always be:

  1. modsecurity.conf
  2. crs-setup.conf (this file)
  3. rules/*.conf (the CRS rule files)

3、ModSecurity OWASP核心规则集的两种配置模式 - 异常评分模式、独自控制模式

代码语言:txt
复制
异常评分模式 Anomaly Scoring mod 
代码语言:txt
复制
独自控制模式 Self-contained mode
代码语言:txt
复制
    案例1:
代码语言:txt
复制
        只要检测到威胁,则使用”deny”关键词对此次访问进行阻断,同时向服务器返回403错误代码。
代码语言:txt
复制
         SecDefaultAction "phase:1,log,auditlog,deny,status:403"
代码语言:txt
复制
         SecDefaultAction "phase:2,log,auditlog,deny,status:403"
代码语言:txt
复制
    案例2:
代码语言:txt
复制
        检测到威胁,返回应用服务host对应的homepage,便于识别触发了哪个服务;或者配置跳转到另外的页面地址
代码语言:txt
复制
         SecDefaultAction "phase:1,log,auditlog,redirect:'http://%{request\_headers.host}/',tag:'Host: %{request\_headers.host}'"
代码语言:txt
复制
         SecDefaultAction "phase:2,log,auditlog,redirect:'http://%{request\_headers.host}/',tag:'Host: %{request\_headers.host}'"
代码语言:txt
复制
修改配置测试自我控制模型 - 测试403模式 - 没有拦截生效!!
代码语言:txt
复制
    vi owasp-modsecurity-crs-3.1.1/crs-setup.conf
代码语言:txt
复制
    经检查,是lds.xml 规则覆盖导致。
代码语言:txt
复制
检查配置
代码语言:txt
复制
http://www.modsecurity.cn/chm/SecRuleEngine.html
代码语言:txt
复制
模式说明
代码语言:txt
复制
http://www.manongjc.com/detail/56-xvprumdwxcrsitx.html
代码语言:txt
复制
异常评分模式:由于每次请求都会匹配所有规则,因此在高并发情况下,效率相对较低,服务器资源占用较高,但误报率相对较低;
代码语言:txt
复制
           当检测到威胁时,并不会直接阻断此次请求,而是向下继续进行规则匹配,每个匹配成功的规则都会增加”异常分数”,在对请求数据检测结束时,以及对返回数据检测结束时,都会对异常分数的总和进行判断,如果大于设置的阈值,才会进行阻断动作,并向客户端返回403代码,审计日志中也会记录此次访问中所有匹配成功的规则信息。
代码语言:txt
复制
独自控制模式:检测到一次威胁就直接阻断请求,因此在高并发情况下,效率相对较高,服务器资源占用较小,但误报率相对较高。除此之外该模式还有一个优点,即可以通过全局配置,设置当访问被拦截后,跳转到自定义的提示页面。
代码语言:txt
复制
独自控制模式配置,跳转到自定义提示页面,可参见:
代码语言:txt
复制
    http://modsecurity.cn/practice/post/8.html
代码语言:txt
复制
两种配置模式的区别如下(在crs-setup.conf中进行配置):
代码语言:txt
复制
    http://www.manongjc.com/detail/56-xvprumdwxcrsitx.html

4、ModSecurity 拦截指定国家IP的请求

代码语言:txt
复制
http://modsecurity.cn/practice/post/14.html

5、crs组织机构官方网站

https://coreruleset.org/

6、关联资料:WAF绕过攻击(bypass)

https://www.hacking8.com/sectips/bypasswaf.html

7 、其他

webhook配置定义:

https://github.com/vmware-archive/ModSecurity-envoy/blob/master/http-filter-modsecurity/http_filter.proto

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章目标:
  • 一、下载规则集
  • before envoy.router because order matters!
  • 二、启动集成WAF的envoy服务
  • 三、修改lds.yaml配置文件
  • 四、启动webhook服务
    • 1、安装nodejs v14.15.4
      • 2、启动webhook服务
        • 3、其他开源webhook
        • 五、简单命令行测试
          • 1、发送phase1、phase2的测试请求:
            • 2、body测试请求
            • 六、使用开源gotestwaf测试Modesecurity
              • 1、gotestwaf项目地址
                • 2、安装docker环境
                  • 3、安装golang
                    • 4、过程测试
                    • 七、后台运行Modsecurity-envoy程序
                      • 1、方案设计
                        • 2、脚本定义daemon.sh
                          • 3、启动脚本
                            • 4、关闭服务
                            • 七、未解决问题 TODO
                              • 1、全局拦截跳转页面配置
                              • 八、其他参考资料
                                • 1、WAF部署方式介绍
                                  • 2、# owasp crs加载规则优先级说明
                                    • 3、ModSecurity OWASP核心规则集的两种配置模式 - 异常评分模式、独自控制模式
                                      • 4、ModSecurity 拦截指定国家IP的请求
                                        • 5、crs组织机构官方网站
                                          • 6、关联资料:WAF绕过攻击(bypass)
                                            • 7 、其他
                                            相关产品与服务
                                            容器服务
                                            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档