OpenResty + ModSecurity + OWASP CRS
本篇将介绍如何使用OpenResty和ModSecurity 来构建自己的WAF,安装过程整体与Nginx是类似的,但也有些区别,在文中会特别指出,本篇算是用openresty对前面两篇nginx和crs的集中介绍。
Preface
版本信息
- CentOS Linux release 7.6.1810 (Core)
- nginx version: openresty/1.13.6.1
- ModSecurity 3.0
安装依赖
# yum install epel-release -y
# 安装modsecurity依赖
# yum install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre pcre-devel libxml2 libxml2-devel autoconf automake lmdb-devel ssdeep-devel ssdeep-libs lua-devel libmaxminddb-devel git apt-utils autoconf automake build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev ibpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev -y
# 安装nginx/openresty依赖
# yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
下载
# mkdir /opt/waf #创建一个专属目录
# cd /opt/waf
# git clone --depth -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity # 下载ModSecurity
# wget https://openresty.org/download/openresty-1.13.6.1.tar.gz # 下载openresty
# git clone --depth https://github.com/SpiderLabs/ModSecurity-nginx.git # 下载ModSecurity-nginx连接器
# pwd
/opt/waf
# ls
ModSecurity ModSecurity-nginx openresty-1.13.6.1.tar.gz
编译ModSecurity
# cd /opt/waf/
# cd ModSecurity/ # 切换到ModSecurity目录
# git submodule init # 初始化
# git submodule update # 更新
# ./build.sh
# ./configure
# make
# make install
【注】在执行build.sh会出现如下错误,可忽略。
fatal: No names found, cannot describe anything
编译modsecurity_module
# cd /opt/waf/
# tar xvf openresty-1.13.6.1.tar.gz
# ls
ModSecurity ModSecurity-nginx openresty-1.13.6.1 openresty-1.13.6.1.tar.gz
# cd openresty-1.13.6.1/
# ./configure --with-compat --add-dynamic-module=/opt/waf/ModSecurity-nginx # 需用绝对路径,相对路径会出问题
# gmake # 不能使用make modules命令
# gmake install
... 上一步的输出
cp objs/ngx_http_modsecurity_module.so '/usr/local/openresty/nginx/modules/ngx_http_modsecurity_module.so'
gmake[]: Leaving directory `/opt/waf/openresty-1.13.6.1/build/nginx-1.13.'
gmake[]: Leaving directory `/opt/waf/openresty-1.13.6.1/build/nginx-1.13.'
mkdir -p /usr/local/openresty/site/lualib /usr/local/openresty/site/pod /usr/local/openresty/site/manifest
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/bin/openresty
openresty默认安装到/usr/local/openresty,最终的是ngx_http_modsecurity_module.so库文件ok。
配置
基本测试
为了便于后续操作,创建一个openresty的符号链接。
# ln -s /usr/local/openresty/bin/openresty /usr/bin/openresty
# openresty -v
nginx version: openresty/1.13.6.1
# cd /usr/local/openresty/nginx/conf
# head - nginx.conf
load_module /usr/local/openresty/nginx/modules/ngx_http_modsecurity_module.so; # 首行加入
# openresty # 启动
# openresty -s reload # 重载配置(如果已启动则重载配置即可)
# openresty -t # 测试ok
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful
启用WAF
# cd /usr/local/openresty/nginx
# ls
client_body_temp conf fastcgi_temp html logs modules proxy_temp sbin scgi_temp uwsgi_temp
# mkdir modsec # 创建一个专属modsecurity的规则文件夹
# cd modsec/
# sudo wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
# mv modsecurity.conf-recommended modsecurity.conf
修改modsecurity.conf配置文件
# vim modsecurity.conf
# -- Rule engine initialization ----------------------------------------------
...
SecRuleEngine On <== 设置为On
拷贝mapping文件。
# cp /opt/waf/ModSecurity/unicode.mapping .
# ls
main.conf modsecurity.conf unicode.mapping
创建一个主规则文件main.conf,内容如下。
# cat /etc/nginx/modsec/main.conf
# Include the recommended configuration
Include /usr/local/openresty/nginx/modsec/modsecurity.conf
# A test rule
SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403"
修改nginx配置文件,简要图示如下:

...
server {
listen ;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main;
modsecurity on;
modsecurity_rules_file /usr/local/openresty/nginx/modsec/main.conf;
location / {
default_type text/plain;
return "Thank you for requesting ${request_uri}\n";
}
...
- modsecurity on:启用Nginx WAF;
- modsecurity_rules_file:指定规则文件路径。
测试WAF
# curl localhost
Thank you for requesting /
[root@localhost conf]# curl localhost/foo?testparam=thisisatestofmodsecurity # 携带恶意参数test
<html>
<head><title> Forbidden</title></head>
<body bgcolor="white">
<center><h1> Forbidden</h1></center> <<= 禁止访问
<hr><center>openresty/1.13.6.1</center>
</body>
</html>
可以看到参数testparam中带有test关键字会被拦截。
CRS
OpenResrty 配置文件nginx.conf请参考:https://www.cnblogs.com/Hi-blog/p/ModSecurity.html#autoid-3-4-0
CRS请参考:OWASP ModSecurity Core Rule Set (CRS)的基本使用
OpenResty + ModSecurity + OWASP CRS的更多相关文章
- 网站waf检测
		WAFW00F WAFW00F识别和指纹Web应用防火墙(WAF)产品. 其工作原理是首先通过发送一个正常http请求,然后观察其返回有没有一些特征字符,若没有在通过发送一个恶意的请求触发waf拦截来 ... 
- kali linux之防火墙识别
		通过检查回包,可能识别端口是否经过防火墙过滤,设备多种多样,结果存在一定的误差 Send Response Type SYN NO Filtered(先发送syn 如果不给回复 防火墙可 ... 
- 针对Web的信息搜集
		信息收集(Information Gathering),信息收集是指通过各种方式获取所需要的信息,在整个渗透测试环节中,信息搜集是整个渗透过程中最为重要的一环,信息搜集可占据整个渗透测试80%左右的工 ... 
- OWASP ModSecurity Core Rule Set (CRS)的基本使用
		Preface 前述文章开源WAF工具ModSecurity,介绍了ModSecurity作为Nginx的动态加载模块的基本安装和使用. 本篇简单介绍ModSecurity CRS规则集的使用. # ... 
- ModSecurity:一款优秀的开源WAF
		一.ModSecurity3.0介绍 ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发. ... 
- Azure WAF防火墙工作原理分析和配置向导
		Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ... 
- [security] security engine things
		1. luarock luarock 之于 lua,就好比 pip 之于 python https://luarocks.org/ 2. lua的库 [root@base package]# ls ... 
- modsecurity3.0  nginx 安装
		备注: 使用的是modsecurity 3.0 的版本,也是nginx 官方推荐使用的,同时使用的是nginx 的dynamic module 1. 环境准备 https://github.com/S ... 
- Azure上通过haproxy实现APP Gateway或WAF的http跳转https
		Azure上的APP Gateway是七层负载均衡服务,WAF是APP Gateway服务的扩展.在实现七层负载均衡的同时,增加了WAF的功能,可以对后台的HTTP服务进行保护. Azure WAF采 ... 
随机推荐
- 修改json源码支持datetime序列化
			修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ... 
- c# 窗体开发3 文件处理技术
			以字节形式向磁盘写入数据通常称为字节流(比特流) 常常使用System.Io 常用的类 类 说明 File 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. ... 
- C# MVC  过滤器
			APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ... 
- windows系统tomcat上开发的j2ee程序,如何适配linux系统上奔跑的websphere7
			公司需要将几个windows系统tomcat中间件下开发的j2ee系统部署到linux系统websphere7中间件下去运行. 这就需要做系统的适配工作.由于时间比较久了,具体问题就不详细写了.把这个 ... 
- P1387 最大正方形 |动态规划
			题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔 ... 
- 严格次短路的求法-spfa
			#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #inc ... 
- 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)
			1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ... 
- VBA/Excel-实例系列-04-求两个数组的交集
			原创: Z Excel高效办公之VBA 2017-03-10 Part 1:逻辑过程 已有两个数组,要求单个数组中信息无重复 以最短的数组作为循环,分别判断该数组中的元素是否在另一个数组中 如果某一元 ... 
- 用FPGA设计LCD 转 VGA
			这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃 ... 
- 【JS】394- 简明 JavaScript 函数式编程-入门篇
			转载自公众号"程序员成长指北" 写在开头 本文较长,总共分为三大部分:(对于函数式编程以及其优点有一定理解的童鞋,可以直接从 第二部分 开始阅读) 第一部分:首先会通过实际代码介绍 ... 
