一、ModSecurity介紹
ModSecurity是一個入侵偵測與防護引擎,它主要是用于Web應(yīng)用程序,簡稱WAF。它可以作為Web服務(wù)器的模塊或是單獨的應(yīng)用程序來運作。
ModSecurity支持和新規(guī)則集CRS,CRS是保護Web應(yīng)用免收0day攻擊的規(guī)則,此外ModSecurity還支持并行文本匹配、GeoIP解析、內(nèi)容注入、自動化規(guī)則更新和腳本等。
ModSecurity 3.0
ModSecurity 2.0時期,ModSecurity是相對nginx支持不是很完善,有性能損耗和內(nèi)存泄露等bug,目前的3.0版本,引入了libmodsecurity模塊,它作為ModSecurity的一個接口,將接受的web流量應(yīng)用于傳統(tǒng)的ModSecurity進行處理,目前使用ModSecurity Nginx Connector 連接器與libmodsecurity兼容。
ModSecurity 2.0 與3.0的區(qū)別
- 所有Apache依賴都被去除
- 性能更高、新架構(gòu)、新功能
ModSecurity 3.0 還作為 Nginx-Plus 官方欽定 WAF 引入了商業(yè)市場。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(靜態(tài)編譯)
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 (動態(tài)加載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規(guī)則
OWASP 是一個安全社區(qū),開發(fā)和維護著一套免費的應(yīng)用程序保護規(guī)則CRS,用戶可以根據(jù)自己的需求選擇不同的規(guī)則,也可以通過 ModSecurit y手工創(chuàng)建安全過濾器、定義攻擊并實現(xiàn)主動的安全輸入驗證。OWASP-CRS
ModSecurity CRS提供一下類別的保護來防止攻擊:
HTTP Protection(HTTP防御);
Real-time Blacklist Lookups(實時黑名單查詢);
HTTP Denial of Service Protections(HTTP的拒絕服務(wù)保護);
Common Web Attacks Protection(常見的Web攻擊防護);
Automation Detection(自動化檢測);
Integration with AV Scanning for File Uploads(文件上傳防病毒掃描);
Tracking Sensitive Data(跟蹤敏感數(shù)據(jù));
Trojan Protection(木馬防護);
Identification of Application Defects(應(yīng)用程序缺陷的鑒定);
Error Detection and Hiding(錯誤檢測和隱藏)
3.1、下載OWASP規(guī)則并生成配置文件
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規(guī)則
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規(guī)則
配置ModeSecurity
-
SecRuleEngine:是否接受來自ModSecurity-CRS目錄下的所有規(guī)則的安全規(guī)則引擎。因此,我們可以根據(jù)需求設(shè)置不同的規(guī)則。要設(shè)置不同的規(guī)則有以下幾種。 -
SecRuleEngine On:將在服務(wù)器上激活ModSecurity防火墻,它會檢測并阻止該服務(wù)器上的任何惡意攻擊。 -
SecRuleEngine DetectionOnly:如果設(shè)置這個規(guī)則它只會檢測到所有的攻擊,并根據(jù)攻擊產(chǎn)生錯誤,但它不會在服務(wù)器上阻止任何東西。 -
SecRuleEngine Off:這將在服務(wù)器上上停用ModSecurity的防火墻。 - SecRequestBodyAccess:它會告訴ModSecurity是否會檢查請求,它起著非常重要的作用。它只有兩個參數(shù)ON或OFF。
-
SecResponseBodyAccess:如果此參數(shù)設(shè)置為ON,然后ModeSecurity可以分析服務(wù)器響應(yīng),并做適當(dāng)處理。它也有只有兩個參數(shù)ON和Off,我們可以根據(jù)求要進行設(shè)置。 -
SecDataDir:定義ModSecurity的工作目錄,該目錄將作為ModSecurity的臨時目錄使用。
cd /opt/ModSecurity/
cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
##開啟安全引擎接受來自ModSecurity-CRS目錄下的規(guī)則
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsec/modsecurity.conf
配置OWASP-CRS規(guī)則
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目錄中引入規(guī)則和配置
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
屬于直接加載本地配置文件,和本地規(guī)則庫
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規(guī)則直接包含在nginx配置中,以下示例是從文件加載規(guī)則,并為不同目錄、別名注入特定配置,說白了就是可以對每個location開啟安全規(guī)則引擎、日志級別等等。
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規(guī)則過于嚴苛,正常操作也會被阻擋,直接訪問nginx歡迎頁面直接被403拒絕,除了手動修改規(guī)則之外,也可以使用第三方的規(guī)則庫,這里介紹comodo規(guī)則庫
使用方法與CRS一樣,在nginx的conf目錄下新建comodo_waf.conf配置文件,加入以下參數(shù),并引入規(guī)則庫
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;
}
測試結(jié)果:通過tcpcopy實時流量測試,通過對業(yè)務(wù)系統(tǒng)進行注入,匹配到了comodo規(guī)則的SQLmap attack detected攻擊,返回了403 forbidden

六、規(guī)則庫更新
owasp-crs
cd /usr/local/nginx/conf/owasp-modsecurity-crs/util
#更新crs和geoip
./upgrade.py --crs --geoip
更新成功,怎會提示規(guī)則已經(jīng)更新到最新
[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
如果在更新規(guī)則庫時報錯error: unknown option ff-only,原因是git版本過低導(dǎo)致,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應(yīng)用程序,它在一個servlet容器中運行,并且能夠從ModSecurity模塊接收audit-event數(shù)據(jù)。AuditConsole用來審計和調(diào)試ModSecurity日志非常方便。

接收事件:控制臺可以從mlogc接收事件,也可以通過ModSecurity的日志文件上傳。以串行格式的審計日志文件。
但是在最新版本的ModSecurity 3.x版本中,沒有mlogc模塊,所以無法使用mlogc來發(fā)送Audit.log,并且直接將ModSecurity 3.x的日志上傳,會報錯,無法加載,只支持1.x和2.x
