Nginx應用ModSecurity建立簡易Web Application Firewall

Nginx應用ModSecurity建立簡易Web Application Firewall

ModSecurity已往推出Apache Web Server模組, 可以當作WAF(Web Application Firewall), 也支援Nginx與IIS, 這次實驗的是使用ModSecurity V3, 與Nginx配合有更佳的處理效能。

本次範例使用Debian Linux Jessie, Nginx官網提供的原始碼(使用1.2.0穩定版), 以及ModSecurity提供的ModSecurity-Nginx Connector來連接LibModSecurity。

Nginx下載: https://nginx.org/download/nginx-1.12.0.tar.gz

ModSecurity-Nginx在GitHub的說明: https://github.com/SpiderLabs/ModSecurity-nginx

前置作業


需要安裝編譯器與Nginx, LibModSecurity需要的函式庫
apt-get install sudo git build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-prefork-dev libxml2-dev libcurl4-openssl-dev


apt-get install g++ flex bison curl doxygen libyajl-dev libgeoip-dev libtool dh-autoreconf libcurl4-gnutls-dev libxml2 libpcre++-dev libxml2-dev


由於是參考ModSecurity舊式模組編譯方法, 有些函式庫可能不需要(apache2-prefork-dev)

下載與編譯LibModSecurity


依照說明(https://github.com/SpiderLabs/ModSecurity/wiki/Compilation-recipes), 將ModSecurity下載
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

編譯時會花上很多時間, 需要耐心等候, LibModSecurity會安裝在/usr/local/modsecurity/lib目錄下

下載與編譯Nginx, ModSecurity-Nginx Connector


cd /usr/local/src
wget https://nginx.org/download/nginx-1.12.0.tar.gz
tar zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git modsecurity-nginx
./configure --add-module=modsecurity-nginx

ModSecurity-Nginx Connector模組我放在解開來的Nginx原始碼目錄之下, 將其編譯為Nginx模組

建立網站設定檔


cd /usr/local/nginx/conf
nano nginx.conf

修改網站設定, 在這裡我沒有安裝資料庫或是Server-Side Script, 只是單純做Load Balancer(實際需要用proxy_pass功能), 實際運行可交由後端Web Server(Apache/Nginx...等), 測試ModSecurity功能也只放了一個簡單的HTML網頁
(2017/5/3更新: 使用proxy_pass連接後端Web Server群組)
upstream backend {
server 192.168.123.1;
server 192.168.123.2;
server 192.168.123.3;
}

server {
listen 80;
server_name localhost;

modsecurity on;

location / {
modsecurity_rules_file rules.conf;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Referer $http_referer;
proxy_redirect off;
proxy_pass http://backend;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

修改一個預建好的server區段, 加入ModSecurity設定, 還不要啟動Nginx, 先把ModSecurity規則檔建立起來

下載與建立ModSecurity設定與規則檔


取得設定檔
cd /opt
git clone https://github.com/SpiderLabs/ModSecurity.git
cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf


編輯設定與規則檔modsecurity.conf
nano /usr/local/nginx/conf/modsecurity.conf


將SecRuleEngine設為On
# -- Rule engine initialization ----------------------------------------------

# Enable ModSecurity, attaching it to every transaction. Use detection
# only to start with, because that minimises the chances of post-installation
# disruption.
#
SecRuleEngine On


我們需要ModSecurity提供的CRS(Core Rule Set), 可在https://github.com/SpiderLabs/owasp-modsecurity-crs下載
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

當前目錄就會產生"owasp-modsecurity-crs"目錄, 裡面的子目錄"rules"就有預設好的各種規則

將crs-setup.conf.example與各種規則加進設定檔
cd /usr/local/nginx/conf/owasp-modsecurity-crs
cp crs-setup.conf.example /usr/local/nginx/conf/crs-setup.conf
cd rules
cp REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
cp RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
cat *.conf > /usr/local/nginx/conf/csr.conf
cp *.data /usr/local/nginx/conf


準備好了modsecurity.conf, crs-setup.conf與csr.conf, 把它們合成一個檔案
cd /usr/local/nginx/conf
cat modsecurity.conf crs-setup.conf csr.conf > rules.conf

rules.conf就是前面Nginx的nginx.conf所需要的"modsecurity_rules_file rules.conf;"設定

啟動Nginx ModSecurity WAF


WAF大致完成, 規則的設定其實有點難以了解, 如果你用的是市面上常見的CMS, 例如WordPress, cPanel, osCommerce, Joomla...ModSecurity已經對這些CMS寫好規則
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

就能啟動Nginx了, 如果需要測試Nginx設定檔語法是否正確, 可用-t參數來測試:
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf


Audit Log預設為"/var/log/modsec_audit.log", 若有HTTP Request觸發規則, 會產生HTTP 403錯誤, 並紀錄在modsec_audit.log
2017-04-28 16:31 發佈

Ryan Lai wrote:
ModSecurity...(恕刪)


目前我是拿 Nginx 來當 reverse-proxy & Load Balance,Web Site都在別台VM
這樣的配置也可以追加 ModSecurity 嗎!?
System Engineer
可以的
HOPE000 wrote:
目前我是拿 Nginx...(恕刪)
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?
' + '