背景
通过nginx的镜像流量及modsecurity开源waf相互配置,来达到Waf旁路部署的效果,搭建环境做了测试记录,一方面为了符合等保规范,另一方面也是为了推动安全建设。
FAQ: 为什么不直接串行部署?
首先,企业对生产网的流量出错容忍度其实很低,一切都要给生产让路,毕竟有了饭吃才能谈其他的,常用的串行部署都是为了能够实时封禁,这样一旦发生误报误封,一分钟造成的损失都是难以估量的,可如果把串行部署的waf改为只记录,不封禁的配置的话,waf就仅仅起到了影响了server处理速度的作用,不如旁路部署来的灵活,因此常见的银行证券类实时性要求较高的企业里,waf设备的部署都是旁路。
测试环境: centos7+nginx 1.17.5+modsecurity 3.0
一、 nginx的镜像流量配置
ngx_http_mirror_module模块在nginx版本1.13.4以后可以使用,通过创建镜像请求来实现原始请求的镜像,对镜像请求的响应将被忽略。
Example Configuration
1
2
3
4
5
6
7
8
9 location / {
mirror /mirror;
proxy_pass http://backend; ##实际转发URL地址
}
location = /mirror {
internal;
proxy_pass http://test_backend$request_uri; ##备份转发URL地址
}
二、 nginx+modsecurity的旁路waf配置
本文中的配置严格参照modsecurity官网给的md文件做参考, 如有不同请以官方配置手册为准。ModSecurity_3_NGINX_Quick_Start_Guide.pdf.
1 | [root@centos24-4 ModSecurity]# rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm |
- 创建一个虚拟server,该server监听端口80,并作为后续演示的入口。
1 | vim /etc/nginx/conf.d/proxy.conf |
- 配置了一个监听在8085的Web-server,返回状态代码200和包含所请求URI的消息:
1 | vim /etc/nginx/conf.d/echo.conf |
1 | [root@centos24-4 modules]# curl -I http://localhost |
- 安装依赖组件
1 | yum group install "Development Tools" |
- 将modsecurity编译为nginx动态模块
安装必需的必备软件包后,下一步就是将ModSecurity编译为NGINX动态模块。在ModSecurity 3 0的新模块化体系结构中,libmodsecurity是包含所有规则和功能的核心组件。
从git上克隆代码并编译安装。
1 | [root@centos24-4 ModSecurity]# git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity |
- 下载用于ModSecurity的NGINX连接器并将其编译为动态模块
modsecurity体系结构的第二个主要组件是将libmodsecurity链接到运行它的Web服务器的连接器。NGINX和Apache HTTP Server有单独的connector。
A 克隆github-repo
1 | git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git |
B 查看nginx版本,并下载对应版本的nginx源代码,即使只是需要编译动态模块依然是需要源码的。
C 编译动态模块并将其复制到模块的标准目录中
1 | [root@centos24-4 opt]# nginx -V |
D 加载NGINX ModSecurity Connector动态模块
1 | vim /etc/nginx/nginx.conf |
- 配置nginx与modsecurity
配置ModSecurity 3.0通过阻止某些请求来测试Web应用程序.
1 | [root@centos24-4 nginx]# sudo mkdir /etc/nginx/modsec |
将modsecurity.conf中现有的SecRuleEngine修改为On:
1 | # SecRuleEngine DetectionOnly |
创建自定义规则来测试
1 | vim /etc/nginx/modsec/main.conf |
在nginx的conf中添加相应的规则来测试
1 | vim /etc/nginx/conf.d/proxy.conf |
通过发出在查询字符串testparam参数的值中包含字符串test的请求,验证步骤4中配置的规则是否正常工作,出现403证明触发了相应的规则,进一步可以在log里看到触发的是我们自定义的规则。
1 | [root@centos24-4 conf.d]# curl -I http://localhost/foo?testparam=thisisatestofmodsecurity |
三、测试对镜像流量是否有响应
测试拓扑
nginx.conf文件配置如下图,其中X-Real-IP是用来获得客户端真实IP转发给镜像流量用于识别。
在WebServer18-3上用python虚拟一个Server来接收请求:
1 | [root@centos18-3 opt]# python -m SimpleHTTPServer 8888 |
在测试机18-1上发起如下测试请求:
1 | [root@centos18-1 op_e]# curl -I http://192.168.24.1/modsec/foo?testparam=thisisatestofmodsecurity |
可以看到18.3Server给返回的是404,同时在24.4waf上抓包,可以看到有告警日志,说明规则匹配成功,且达到了旁路接入waf的效果。
总结
相同的效果可以通过tcpcopy的思路也能做,且tcpcopy可以进行更多的流量分析,不只是通过nginx走的流量.