Nginx+ModSecurity3.0实现WAF防护

一、ModSecurity介绍

ModSecurity是一个入侵侦测与防护引擎,它主要是用于Web应用程序,简称WAF。它可以作为Web服务器的模块或是单独的应用程序来运作。
ModSecurity支持和新规则集CRS,CRS是保护Web应用免收0day攻击的规则,此外ModSecurity还支持并行文本匹配、GeoIP解析、内容注入、自动化规则更新和脚本等。

ModSecurity 3.0
ModSecurity 2.0时期,ModSecurity是相对nginx支持不是很完善,有性能损耗和内存泄露等bug,目前的3.0版本,引入了libmodsecurity模块,它作为ModSecurity的一个接口,将接受的web流量应用于传统的ModSecurity进行处理,目前使用ModSecurity Nginx Connector 连接器与libmodsecurity兼容。
ModSecurity 2.0 与3.0的区别

  • 所有Apache依赖都被去除
  • 性能更高、新架构、新功能

ModSecurity 3.0 还作为 Nginx-Plus 官方钦定 WAF 引入了商业市场。Nginx-waf也是基于编译好的libmodsecurity

image.png

二、编译安装ModSecurity 3.0

2.1、安装libModSecurity

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 
cd /opt/
git clone https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git checkout -b v3/master origin/v3/master
sh build.sh
git submodule init
git submodule update
./configure
make
make install

2.2、安装nginx connector(静态编译)

export MODSECURITY_INC="/opt/ModSecurity/headers/"
export MODSECURITY_LIB="/opt/ModSecurity/src/.libs/"
cd /opt/
git clone https://github.com/SpiderLabs/ModSecurity-nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xvzf nginx-1.12.2.tar.gz
cd /opt/nginx-1.12.2
./configure --add-module=/opt/ModSecurity-nginx 
make
make install

2.3、nginx dynamic module (动态加载nginx连接器)可选

git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
wget https://nginx.org/download/nginx-1.13.8.tar.gz
tar xvf nginx-1.13.8.tar.gz
cd nginx-1.13.8
./configure  --add-dynamic-module=../ModSecurity-nginx
make modules
cp objs/ngx_http_modsecurity_module.so /usr/local/nginx/modules(此处为Nginx 安装位置,我的nginx 也是源码编译)

nginx加载模块

#在nginx main中引用
load_module modules/ngx_http_modsecurity_module.so;

三、添加OWASP规则

OWASP 是一个安全社区,开发和维护着一套免费的应用程序保护规则CRS,用户可以根据自己的需求选择不同的规则,也可以通过 ModSecurit y手工创建安全过滤器、定义攻击并实现主动的安全输入验证。OWASP-CRS

ModSecurity CRS提供一下类别的保护来防止攻击:

HTTP Protection(HTTP防御);
Real-time Blacklist Lookups(实时黑名单查询);
HTTP Denial of Service Protections(HTTP的拒绝服务保护);
Common Web Attacks Protection(常见的Web攻击防护);
Automation Detection(自动化检测);
Integration with AV Scanning for File Uploads(文件上传防病毒扫描);
Tracking Sensitive Data(跟踪敏感数据);
Trojan Protection(木马防护);
Identification of Application Defects(应用程序缺陷的鉴定);
Error Detection and Hiding(错误检测和隐藏)

3.1、下载OWASP规则并生成配置文件

cd /opt/
git clone --depth 1 -b v3.0/master https://github.com/SpiderLabs/owasp-modsecurity-crs.git
cp -rf owasp-modsecurity-crs  /usr/local/nginx/conf/
cd /usr/local/nginx/conf/owasp-modsecurity-crs
cp crs-setup.conf.example  crs-setup.conf

3.2、配置OWASP规则

sed -ie 's/SecDefaultAction "phase:1,log,auditlog,pass"/#SecDefaultAction "phase:1,log,auditlog,pass"/g' crs-setup.conf
sed -ie 's/SecDefaultAction "phase:2,log,auditlog,pass"/#SecDefaultAction "phase:2,log,auditlog,pass"/g' crs-setup.conf
##开启阻挡
sed -ie 's/#.*SecDefaultAction "phase:1,log,auditlog,deny,status:403"/SecDefaultAction "phase:1,log,auditlog,deny,status:403"/g' crs-setup.conf
sed -ie 's/# SecDefaultAction "phase:2,log,auditlog,deny,status:403"/SecDefaultAction "phase:2,log,auditlog,deny,status:403"/g' crs-setup.conf

3.3、启用ModSecurity和CRS规则

配置ModeSecurity

  • SecRuleEngine:是否接受来自ModSecurity-CRS目录下的所有规则的安全规则引擎。因此,我们可以根据需求设置不同的规则。要设置不同的规则有以下几种。
  • SecRuleEngine On:将在服务器上激活ModSecurity防火墙,它会检测并阻止该服务器上的任何恶意攻击。
  • SecRuleEngine DetectionOnly:如果设置这个规则它只会检测到所有的攻击,并根据攻击产生错误,但它不会在服务器上阻止任何东西。
  • SecRuleEngine Off:这将在服务器上上停用ModSecurity的防火墙。
  • SecRequestBodyAccess:它会告诉ModSecurity是否会检查请求,它起着非常重要的作用。它只有两个参数ON或OFF。
  • SecResponseBodyAccess:如果此参数设置为ON,然后ModeSecurity可以分析服务器响应,并做适当处理。它也有只有两个参数ON和Off,我们可以根据求要进行设置。
  • SecDataDir:定义ModSecurity的工作目录,该目录将作为ModSecurity的临时目录使用。
cd /opt/ModSecurity/
cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
##开启安全引擎接受来自ModSecurity-CRS目录下的规则
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsec/modsecurity.conf

配置OWASP-CRS规则

cd /usr/local/nginx/conf/owasp-modsecurity-crs/rules
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf 
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

nginx目录中引入规则和配置

cat >> /usr/local/nginx/owasp_waf.conf << EOF
include /usr/local/nginx/conf/modsecurity.conf
include /usr/local/nginx/conf/owasp-modsecurity-crs/crs-setup.conf
include /usr/local/nginx/conf/owasp-modsecurity-crs/rules/*.conf
EOF

四、配置Nginx支持ModSecurity

modsecurity_rules_file
属于直接加载本地配置文件,和本地规则库

    server {
        listen       80;
        server_name  localhost;
        modsecurity on;
        modsecurity_rules_file  /usr/local/nginx/conf/comodo_waf.conf;
       #modsecurity_rules_file  /usr/local/nginx/conf/owasp_waf.conf;
        location / {
            root   html;
            index  index.html index.htm;
        }

modsecurity_rules_remote
属于从远端下载modsecurity配置文件,并支持身份验证,(但是*.data配置文件无法通过远端直接拉取,需要其他访问注入)

server {
    modsecurity on;
    location / {
        root /var/www/html;
        modsecurity_rules_remote my-server-key https://my-own-server/rules/download;
    }
}

modsecurity_rules
允许将ModSecurity规则直接包含在nginx配置中,以下示例是从文件加载规则,并为不同目录、别名注入特定配置,说白了就是可以对每个location开启安全规则引擎、日志级别等等。

server {
    modsecurity on;
    location / {
        root /var/www/html;
        modsecurity_rules_file /etc/my_modsecurity_rules.conf;
    }
    location /ops {
        root /var/www/html/opts;
        modsecurity_rules '
          SecRuleEngine On
          SecDebugLog /tmp/modsec_debug.log
          SecDebugLogLevel 9
          SecRuleRemoveById 10
        ';
    }
}

五、Comodo WAF Rule

OWASP-CRS规则过于严苛,正常操作也会被阻挡,直接访问nginx欢迎页面直接被403拒绝,除了手动修改规则之外,也可以使用第三方的规则库,这里介绍comodo规则库

使用方法与CRS一样,在nginx的conf目录下新建comodo_waf.conf配置文件,加入以下参数,并引入规则库

SecRuleEngine On
SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecDebugLog /var/log/nginx/modsec_debug.log
SecDebugLogLevel 0
SecAuditEngine RelevantOnly
SecRequestBodyAccess On
SecDataDir /tmp
SecTmpDir /tmp
SecPcreMatchLimit 250000
SecPcreMatchLimitRecursion 250000
SecAuditLogStorageDir /var/log/nginx
SecAuditLogType Concurrent
SecStatusEngine On

include "/usr/local/nginx/cwaf_rules_nginx/rules.conf.main"
include /usr/local/nginx/conf/modsecurity.conf

最后在nginx配置文件中进行引用

server {
modsecurity_rules_file  /usr/local/nginx/conf/comodo_waf.conf;
        }

测试结果:通过tcpcopy实时流量测试,通过对业务系统进行注入,匹配到了comodo规则的SQLmap attack detected攻击,返回了403 forbidden

image.png

六、规则库更新

owasp-crs

cd /usr/local/nginx/conf/owasp-modsecurity-crs/util
#更新crs和geoip
./upgrade.py --crs --geoip

更新成功,怎会提示规则已经更新到最新
[root@localhost util]# ./upgrade.py --crs --geoip
crs:
From https://github.com/SpiderLabs/owasp-modsecurity-crs

  • branch HEAD -> FETCH_HEAD
    Already up to date.

geoip:
Already up-to-date.


FQA
如果在更新规则库时报错error: unknown option ff-only,原因是git版本过低导致,CentOS 7yum 安装的git版本默认是1.8.3.1,而此版本不支持选项 ff-only,需要更新到最新的git

yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum update git
#查看版本
git --version

七、AuditConsole

AuditConsole是一个J2EE web应用程序,它在一个servlet容器中运行,并且能够从ModSecurity模块接收audit-event数据。AuditConsole用来审计和调试ModSecurity日志非常方便。

image.png

接收事件:控制台可以从mlogc接收事件,也可以通过ModSecurity的日志文件上传。以串行格式的审计日志文件。
但是在最新版本的ModSecurity 3.x版本中,没有mlogc模块,所以无法使用mlogc来发送Audit.log,并且直接将ModSecurity 3.x的日志上传,会报错,无法加载,只支持1.x和2.x

image.png

你可能感兴趣的:(Nginx+ModSecurity3.0实现WAF防护)