ModSecurity:一款優秀的開源WAF

  • 2019 年 10 月 4 日
  • 筆記

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