Nginx+ModSecurity3.0實現(xiàn)WAF防護

一、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

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(靜態(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

image.png

六、規(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日志非常方便。

image.png

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

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容