Ubuntu ModSecurity WAF(Nginx 應用程式防火牆 Open Source 解決方案)
先前 Windows ModSecurity WAF 這篇文章有說明,什麼是 WAF,以及如何在 IIS 上面安裝 WAF,這篇我要記錄一下如何在 Ubuntu + Nginx 上安裝 WAF 模組。
安裝 ModSecurity
- 安裝必要套件 LibModSecurity,或者可以參考選擇自行建置,底下參考網站有很多自行建置的方法。
sudo apt-get install libmodsecurity3 # Ubuntu
- 下載與已安裝的 nginx 相同版本的 Source Code ,並且壓縮。
$ nginx -v # 1.18.0 $ wget http://nginx.org/download/nginx-1.18.0.tar.gz $ tar zxvf nginx-1.18.0.tar.gz $ rm nginx-1.18.0.tar.gz
- 下載 ModSecurity/Nginx 連接器。
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
- 設置和建置 ModSecurity 動態模組,成功建置後會產生一個 ngx_http_modsecurity_module.so 檔案到 ~/nginx-1.18.0/objs 目錄底下。
$ cd ~/nginx-1.18.0 $ ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx x $ make modules
- 完成建置後,將模組移至 nginx 目錄底下。
$ sudo mkdir -p /etc/nginx/modules $ sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules # $ sudo cp objs/ngx_http_modsecurity_module.so /home/lawrence/NginxConfig/modules
- 將模組路徑設定到 /etc/nginx/nginx.conf,但請小心放置的位置很重要,一定要在 event 上面,否則會收到 nginx: [emerg] "load_module" directive is specified too late in /etc/nginx/nginx.conf,的錯誤訊息。
include /etc/nginx/modules-enabled/*.conf; # Lawrence,載入外部模組 # ModSecurity # load_module /home/lawrence/NginxConfig/modules/ngx_http_modsecurity_module.so; load_module /etc/nginx/modules/ngx_http_modsecurity_module.so; events { ... }
- 完成安裝後,此時尚未有任何站台有 WAF 防護規則,請先使用底下的語法下載 ModSecurity 設定檔 modsecurity.conf。
$ mkdir /etc/nginx/modsec $ wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended $ mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf # 我是搬到自己指定的資料夾 # $ mkdir /home/lawrence/NginxConfig/modsec # $ wget -P /home/lawrence/NginxConfig/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended # $ mv /etc/nginx/modsec/modsecurity.conf-recommended /home/lawrence/NginxConfig/modsec/modsecurity.conf
ModSecurity 設定
- 新增共用設定檔案 /home/lawrence/NginxConfig/cus_modsec.conf,請自行按照需求調整路徑。
# 啟用 ModSecurity modsecurity on; modsecurity_rules_file /etc/nginx/modsec/modsecurity_nginx.conf; # modsecurity_rules_file /home/lawrence/NginxConfig/modsec/modsecurity_nginx.conf;
- 切換到要指定的站台的 cus_site_dev01.conf,補上底下的設定檔,代表該站台要啟用 ModSecurity 監控,nginx 設定可參考 此篇 的說明。
server { listen 80; server_name localhost.domain.com; # 啟用 ModSecurity include /home/lawrence/NginxConfig/cus_modsec.conf; location / { ... } }
- 調整 modsecurity.conf 設定。
- 預設的設定為偵測模式,將 SecRuleEngine DetectionOnly 的設定改成 On。
- 配置建立暫存檔案的目錄,SecTmpDir,資料夾路徑也調整到自己定義好的資料夾。
- 設定儲存永久資料(例如,IP位址數據,會話資料等)的路徑,SecTmpDir,資料夾路徑也調整到自己定義好的資料夾。
# SecRuleEngine DetectionOnly # changed by lawrence SecRuleEngine On # SecTmpDir /tmp/ # changed by lawrence SecTmpDir /home/lawrence/NginxConfig/temp/ # SecDataDir /tmp/ # changed by lawrence SecDataDir /home/lawrence/NginxConfig/temp/ # SecAuditLog /var/log/modsec_audit.log # changed by lawrence SecAuditLog /home/lawrence/NginxConfig/log/
- 站台設定檔關聯,修改 modsecurity_iis.conf,補上底下的語法。
# modsecurity 預設規則 Include /etc/nginx/modsec/modsecurity.conf # Include /home/lawrence/NginxConfig/modsec/modsecurity.conf
- 在 modsecurity_iis.conf 新增驗證模式,主要是為了要測試 ModSecurity 是否生效。
# 測試站台功能規則(暫時,後續搬到 RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf) SecRule ARGS:WAFHealthCheck "test" "id:9000,deny,status:403,msg:'Our test rule has triggered'"
- 完成上述設定後請執行設定檔檢查,若沒問題重新啟動服務後,使用瀏覽器執行 http://你要服務站台的網域?WAFHealthCheck=test,若無法正常存取網頁並回傳 403 代表 WAF 設定已生效,如下圖所示。
sudo nginx -t sudo systemctl restart nginx
更新 OWASP Core Rule Set(CRS) 防護規則
設定的部分跟 ARR 是一樣的,只是差在設定檔的路徑不太一樣,可以參考一下 Windows WAF 設定 說明,設定路徑參考如下。
# OWASP CRS v3 rules
Include /home/lawrence/NginxConfig/modsec/crs-setup.conf
# Select all available CRS rules:
# Include /home/lawrence/NginxConfig/modsec/owasp_crs/*.conf
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。