一、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
二、编译安装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
六、规则库更新
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 7
yum 安装的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日志非常方便。
接收事件:控制台可以从mlogc
接收事件,也可以通过ModSecurity
的日志文件上传。以串行格式的审计日志文件。
但是在最新版本的ModSecurity 3.x
版本中,没有mlogc
模块,所以无法使用mlogc来发送Audit.log
,并且直接将ModSecurity 3.x的日志上传,会报错,无法加载,只支持1.x和2.x