ModSecurity:一款优秀的开源WAF

标签: 工具 ModSecurity3.0 waf web应用防火墙 | 发表时间:2019-09-10 15:00 | 作者:owensky
出处:https://www.freebuf.com

一、ModSecurity3.0介绍

ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发。作为WAF产品,ModSecurity专门关注HTTP流量,当发出HTTP请求时,ModSecurity检查请求的所有部分,如果请求是恶意的,它会被阻止和记录。

优势:

完美兼容nginx,是nginx官方推荐的WAF

支持OWASP规则

3.0版本比老版本更新更快,更加稳定,并且得到了nginx、Inc和Trustwave等团队的积极支持

免费

ModSecurity的功能:

SQL Injection (SQLi):阻止SQL注入

Cross Site Scripting (XSS):阻止跨站脚本攻击

Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击

Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击

Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击

PHP Code Injectiod:阻止PHP代码注入

HTTP Protocol Violations:阻止违反HTTP协议的恶意访问

HTTPoxy:阻止利用远程代理感染漏洞进行攻击

Shellshock:阻止利用Shellshock漏洞进行攻击

Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击

Scanner Detection:阻止黑客扫描网站

Metadata/Error Leakages:阻止源代码/错误信息泄露

Project Honey Pot Blacklist:蜜罐项目黑名单

GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断

劣势:

不支持检查响应体的规则,如果配置中包含这些规则,则会被忽略,nginx的的sub_filter指令可以用来检查状语从句:重写响应数据,OWASP中相关规则是95X。

不支持OWASP核心规则集DDoS规则REQUEST-912-DOS- PROTECTION.conf,nginx本身支持配置DDoS限制

不支持在审计日志中包含请求和响应主体

二、安装部署

测试环境:centOS7.6阿里云镜像

升级软件和内核

  yum update

安装nginx: http://nginx.org/en/linux_packages.html#mainline

     

yum install yum-utils

vim /etc/yum.repos.d/nginx.repo

[nginx-stable]

name=nginx stable repo

baseurl= http://nginx.org/packages/centos/$releasever/$basearch/

gpgcheck=1

enabled=1

gpgkey= https://nginx.org/keys/nginx_signing.key

[nginx-mainline]

name=nginx mainline repo

baseurl= http://nginx.org/packages/mainline/centos/$releasever/$basearch/

gpgcheck=1

enabled=0

gpgkey= https://nginx.org/keys/nginx_signing.key

yum install nginx

yum install epel-release

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

报错解决:Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

解决办法:一句话:把/etc/yum.repos.d/epel.repo,文件第3行注释去掉,把第四行注释掉,修改为

1. [epel]

2. name=Extra Packages for Enterprise Linux 6 – $basearch

3. baseurl= http://download.fedoraproject.org/pub/epel/6/$basearch

4. #mirrorlist= https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

克隆GitHub存储库:

  git clone --depth 1 -b v3/master --single-branch    https://github.com/SpiderLabs/ModSecurity

编译源代码:

     

$ cd ModSecurity

$ git submodule init

$ git submodule update

$ ./build.sh

$ ./configure

$ make

$ make install

注意:安装中有报错fatal: No names found, cannot describe anything.是正常现象

下载用于ModSecurity的NGINX连接器:

  git clone --depth 1    https://github.com/SpiderLabs/ModSecurity-nginx.git

确定哪个版本的NGINX是运行在主机上的ModSecurity模块将加载:

     

[root@guigu ModSecurity]# nginx -v

nginx version: nginx/1.17.3

下载与安装版本对应的源代码:

     

wget http://nginx.org/download/nginx-1.17.3.tar.gz

tar zxvf nginx-1.17.3.tar.gz

编译动态模块,复制到模块标准目录:

     

cd nginx-1.17.3

#./configure --with-compat --add-dynamic-module=../ModSecurity-nginx

$ make modules

cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/

将以下load_module指令添加到/etc/nginx/nginx.conf的main中:

load_module modules/ngx_http_modsecurity_module.so;

确定nginx模块加载成功:

  nginx -t

三、防护效果测试

ModSecurity 3简单示例

创建Demo web应用vim /etc/nginx/nginx.conf

     

server {

listen 8085;
location / { default_type text/plain; return 200 "Thank you for requesting ${request_uri}\n"; }

}

重新加载nginx:nginx -s reload

确认nginx正常工作:curl -D – http://localhost

保护Demo web应用

创建/etc/nginx/modsec文件夹:mkdir /etc/nginx/modsec

下载推荐的ModSecurity配置文件

     

wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended

mv modsecurity.conf-recommended modsecurity.conf

vim modsecurity.conf #在些文件中编辑以下配置

SecRuleEngine DetectionOnly

SecRuleEngine On

创建ModSecurity的主配置文件

  vim /etc/nginx/modsec/main.conf

Include the recommended configuration

  Include /etc/nginx/modsec/modsecurity.conf

A test rule

  SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403"

报错解决:[emerg] “modsecurity_rules_file” directive Rules error.

     

vim /etc/nginx/modsec/modsecurity.conf

#SecUnicodeMapFile unicode.mapping 20127

配置nginx反向代理,vim /etc/nginx/conf.d/proxy.conf

#include /etc/nginx/conf.d/*.conf; #把这一行注释掉,不然80端口会有冲突

     

server {

listen 80;

modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; location / { proxy_pass [http://0.0.0.0:8085;](http://0.0.0.0:8085/) proxy_set_header Host $host; }

     

nginx -s reload #重新加载nginx

curl -D - http://localhost/foo?testparam=123 #能正常返回“Thank you for requesting /foo?testparam=123”

curl -D - http://localhost/foo?testparam=test #则返回"403 Forbidden",说明前面配置的那条modsecuriy规则生效了,并阻拦了testparam参数中带test的请求

在/var/log/nginx/error.log中可以看到拦截的详细日志

部署OWASP规则–CRS(Core Rule Set)

安装运行nikto漏洞扫描工具,用于测试CRS的防御效果

     

git clone https://github.com/sullo/nikto #下载nikto

cd nikto

perl program/nikto.pl -h localhost #用nikto扫描nginx搭建的web系统(反向代理)

扫描结果是+ 7687 requests: 0 error(s) and 308 item(s) reported on remote host #扫描出308个问题

启用OWASP CRS

     

cd /etc/nginx/modsec/

wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.0.2.tar.gz #下载OWASP CRS

cd owasp-modsecurity-crs-3.0.2/

cp crs-setup.conf.example crs-setup.conf

在modsecurity主配置文件中include CRS的配置和规则

  vim /etc/nginx/modsec/main.conf

Include the recommended configuration

  Include /etc/nginx/modsec/modsecurity.conf

OWASP CRS v3 rules

     

Include /usr/local/owasp-modsecurity-crs-3.0.2/crs-setup.conf

Include /usr/local/owasp-modsecurity-crs-3.0.2/rules/*.conf

测试CRS

     

nginx -s reload #重新加载nginx配置

curl http://localhost #返回Thank you for requesting /

curl -H "User-Agent: Nikto" http://localhost #返回403 Forbidden,说明WAF防护已经生效,此处匹配的规则是user-agent中不能包含漏洞扫描器名字

perl nikto/program/nikto.pl -h localhost #再次用nikto扫描nginx搭建的web系统

扫描结果是+ 7687 requests: 0 error(s) and 83 item(s) reported on remote host #扫描出83个问题,比308个少了很多

在安装ModSecurity时,我们将演示应用程序配置为为每个请求返回状态代码200,但实际上并没有返回这些文件,Nikto将这200个状态码解释为它请求的文件确实存在,所以报告出83个问题,为了优化nikto,去除误报,我们做如下配置

  cp nikto/program/nikto.conf.default nikto/program/nikto.conf

vim nikto/program/nikto.conf #在第76行最后加上;-sitefiles,如下所示

  @@DEFAULT=@@ALL;-@@EXTRAS;tests(report:500);-sitefiles

之后再次用nikto扫描

  perl program/nikto.pl -h localhost

扫描结果是+ 7583 requests: 0 error(s) and 7 item(s) reported on remote host

可以看出问题只有7个问题,由于ModSecurity不支持响应(response)的检查,所以涉及此类的漏洞无法防御。但总体还是抵御了绝大部分的nikto的漏洞扫描。

参考链接:

https://www.nginx.com/resources/library/modsecurity-3-nginx-quick-start-guide/

https://github.com/SpiderLabs/ModSecurity

https://github.com/SpiderLabs/ModSecurity/tree/v3/master

*本文作者:owensky,转载请注明来自FreeBuf.COM

相关 [modsecurity 开源 waf] 推荐:

ModSecurity:一款优秀的开源WAF

- - FreeBuf互联网安全新媒体平台
一、ModSecurity3.0介绍. ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发. 作为WAF产品,ModSecurity专门关注HTTP流量,当发出HTTP请求时,ModSecurity检查请求的所有部分,如果请求是恶意的,它会被阻止和记录.

开源Web应用防火墙(WAF)- ModSecurity v2.7发布

- - FreeBuf.COM
ModSecurity是知名的开源web应用防火墙,它可以作为你的服务器基础安全设施,是广大站长的福音. 目前支持Apache,IIS7和Nginx. 新版改进 1.不需要对现有网络进行调整,只需要分分钟的时间将ModSecurity模块加载进你的web服务器. 2.因为ModSecurity嵌入到你的web服务器中,所以他会很好的利用负载均衡的优势 3.在数据的处理中,ModSecurity的资源消耗很小.

浅谈绕过WAF的数种方法

- Lynn - 80sec
08年初诞生了一种SQL群注攻击,黑客在全球范围内对asp,asp.net加MSSQL架构的网站进行了疯狂扫荡. 由于MSSQL支持多语句注入,黑客通过一条结合游标的SQL语句就能将整个数据库的字段内容自动进行篡改,可以在网站上无差别的进行网页木马攻击. 互联网是快速更新迭代的,但是很多没有开发能力的单位都是通过外包建立网站,网站的程序一上线就再也无人维护,很多程序存在各种漏洞无法修补,于是WAF便有了市场,现今门槛低且最能解决问题的是针对IIS/apache的软件WAF,通常一个模块一个扩展就能搞定,当然也有耗资百万千万的硬件WAF,然而如果WAF拦截规则出现漏洞,这百万千万的硬件也就是一堆废铁.

工具推荐:Raptor WAF,轻量级WEB应用防火墙

- - FreeBuf.COM | 关注黑客与极客
Raptor是一款采用C语言编写的WEB应用防火墙,使用DFA来阻止SQL注入、Xss目录遍历等攻击. 在80端口开启httpd服务并上传一些东西:. 复制存在漏洞的PHP代码到WEB目录:. 现在你可以在 http://localhost:8883/test.php 测试Xss攻击了. *原文: GitHub ,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM ).

[转][转]杂谈如何绕过WAF(Web应用防火墙)

- - heiyeluren的blog(黑夜路人的开源世界)
技术分享:杂谈如何绕过WAF(Web应用防火墙). 2014-12-23 共200694人围观,发现21个不明物体 WEB安全. 这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家. 可能在大家眼中WAF(Web应用防火墙)就是“不要脸”的代名词. 如果没有他,我们的“世界”可能会更加美好.

为Nginx加入一个使用深度学习的软WAF

- - FreeBuf互联网安全新媒体平台
本文介绍如何向Nginx增加了一个使用Tensorflow C库的软WAF模块,模块主体基于Naxsi. 这里,之前有Dalao发表过这样一篇文章: 基于卷积神经网络的SQL注入检测. 这是一个开源的项目,但是由于速度的关系,我不打算使用这篇文章的模型,仅仅采用这篇文章使用的数据集. 这样可以节省很多特征工程的时间.

Google开源LevelDB

- 酿泉 - Solidot
Google宣布在BSD许可证下开源其键值存储引擎LevelDB. LevelDB C++库可用于多种不同环境,如被浏览器用于存储最近访问的网页缓存,或者被操作系统使用去储存安装的软件包和依赖包清单,或被应用程序用于存储用户设置. Google称,即将发布的新版Chrome浏览器,就包含了基于LevelDB的IndexedDB HTML5 API实现.

再论开源

- - 谢益辉
几年前我写过一些关于开源的 想法,如今再来看开源,我觉得问题已经不在说教上,而是在趋势上. 倒退十年或更久,那时候程序员相对还比较稀缺,软件闭源开发出来之后别人模仿的成本高,而这些年计算机教育的普及让码农数量变得越来越多,更多人懂编程了,模仿的成本大幅下降. 写软件作为谋生的目的已经在弱化,更多的是为了自己的实际需求,或社区名声:你不开源.

SoftEther VPN开源

- - Solidot
日本筑波大学的全球分布式公共VPN中继服务器软件SoftEther VPN正式在GPLv2许可证下开源,源代码托管在Github、SourceForge和Google Code上. SoftEther VPN是VPN Gate的底层VPN引擎,在开源之后用户将可以编译出自己定制的二进制包. SoftEther VPN提供了一种分布式的免费公共VPN中继服务,服务器由志愿者托管,因此很少能提供长时间的VPN连接,但代理服务器的不断变化也增加了封杀难度.

Facebook 开源 Detectron

- - 最新更新 – Solidot
Facebook 在 Apache 2.0 许可证下 开源了它的目标识别平台 Detectron, 源代码托管在 GitHub 上. Detectron 用 Python 开发,基于 Caffe2 深度学习框架. Facebook 同时公开了超过 70 个预先训练的模型. Detectron 项目始于 2016 年,实现了一系列最新的目标识别算法如 Mask R-CNN,该软件平台在社交巨人的视觉感知系统的进步上扮演了重要角色.