Ubuntu ModSecurity WAF(Nginx 應用程式防火牆 Open Source 解決方案)

先前 Windows ModSecurity WAF 這篇文章有說明,什麼是 WAF,以及如何在 IIS 上面安裝 WAF,這篇我要記錄一下如何在 Ubuntu + Nginx 上安裝 WAF 模組。


安裝 ModSecurity

  1. 安裝必要套件 LibModSecurity,或者可以參考選擇自行建置,底下參考網站有很多自行建置的方法。
    sudo apt-get install libmodsecurity3 # Ubuntu
    
  2. 下載與已安裝的 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
    
  3. 下載 ModSecurity/Nginx 連接器。
    git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
    
  4. 設置和建置 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
  5. 完成建置後,將模組移至 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
    
  6. 將模組路徑設定到 /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 {
    ...
    }
    
  7. 完成安裝後,此時尚未有任何站台有 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 設定

  1. 新增共用設定檔案 /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;
    
  2. 切換到要指定的站台的 cus_site_dev01.conf,補上底下的設定檔,代表該站台要啟用 ModSecurity 監控,nginx 設定可參考 此篇 的說明。
    server {
        listen 80;
        server_name localhost.domain.com;
    
        # 啟用 ModSecurity
        include /home/lawrence/NginxConfig/cus_modsec.conf; 
    
        location / {
            ...
        } 
    }
    
  3. 調整 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/
      
  4. 站台設定檔關聯,修改 modsecurity_iis.conf,補上底下的語法。
    # modsecurity 預設規則
    Include /etc/nginx/modsec/modsecurity.conf
    # Include /home/lawrence/NginxConfig/modsec/modsecurity.conf
    
  5. 在 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'"
    
  6. 完成上述設定後請執行設定檔檢查,若沒問題重新啟動服務後,使用瀏覽器執行 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


參考網站

留言