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

WAF 維基百科定義

網頁應用程式防火牆(英語:Web Application Firewall,縮寫:WAF)是一種特定形式的應用程式防火牆,用於過濾、監視和阻斷通過網頁服務的HTTP流量。透過監察HTTP流量,它可以防止利用網頁應用程式已知漏洞的攻擊,例如SQL 注入跨網站指令碼(XSS)、檔案包含和不正確的系統組態。

WAF 與傳統防火牆 Firewall 的差異

傳統防火牆主要的辨識範圍最多只到網路架構第四層-傳輸層 (OSI 4 layer),傳統防火牆無法分析 HTTP 與網站應用程序例如: HTML、SQL語言等,然而隨著科技進步,如今駭客已經能夠輕易入侵網站應用程式的漏洞,攻擊至第七層應用層 (OSI 7 layer),傳統防火牆無法對應用層的攻擊進行有效防禦,因此造就 WAF 的出現。

WAF 主要作用於 OSI 7 layer 應用層,可透過檢索技術與分析攻擊特徵對所有 HTTP/HTTPS 請求進行比對與過濾,透過調整WAF 防火牆通行規則,可加強篩選機制,限制並阻絕異常 IP 位址或異常的請求封包,只准許安全流量進入網站!

圖片來源 : https://host.com.tw/waf

ModSecurity 安裝

當 ModSecurity 專案最初設計時,它只是一個 Apache 模組。隨著時間的推移,由於大眾的需求,專案已擴展,以支援其他平台,包括 Nginx 和 IIS 等,2024/07/01  MunSecurity 代碼的維護已提供給開源社群,但目前(2023/12/05) v3 新版本仍尚未支援 IIS,因此本篇仍使用 v2.x 版本進行說明。

  • ModSecurity本身相依,Microsoft Visual C++ 可轉散發套件 2019,若本身電腦無此套則必須先安裝,也可參考 此篇 網站的說明步驟。
  • 首先下載 ModSecurityIIS_2.9.7-64b-64.msi 檔案並進行安裝,原則上就是一路下一步到最後,或者也可參考 此篇 網站的步驟圖示。
  • 安裝成功後,applicationHost.config檔(位於C:\Windows\System32\inetsrv\Config目錄下),會自動加入下列內容,表示IIS下所有網站都會預設使用ModSecurity防護,但預設是沒有任何規則的。
    <ModSecurity enabled="true" 
        configFile="C:\Program Files\ModSecurity IIS\modsecurity_iis.conf" />
  • 完成安裝後,此時尚未有任何站台有 WAF 防護規則,可以先到安裝路徑 C:\Program Files\ModSecurity IIS,將所需的設定檔複製到其它目錄,例如 D:\inetpub\ModSecurityConfig,當然你也可以直接使用原本的路徑,這邊只是不想重新安裝後設定檔被覆蓋而已。


ModSecurity 設定

  • 切換到要指定的站台的 web.config,補上底下的設定檔,代表該站台要啟用 ModSecurity 監控
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
        <!-- 資安設定 WAF -->
        <ModSecurity enabled="true" 
            configFile="D:\Service\ModSecurityConfig\modsecurity_iis.conf" />  
      </system.webServer>
    </configuration>
    
  • 調整 modsecurity.conf 設定
    • 預設的設定為偵測模式,將 SecRuleEngine DetectionOnly 的設定改成  On。
    • 配置建立暫存檔案的目錄,SecTmpDir,資料夾路徑也調整到自己定義好的資料夾。
    • 設定儲存永久資料(例如,IP位址數據,會話資料等)的路徑。,SecTmpDir,資料夾路徑也調整到自己定義好的資料夾。
    • 記得將指定的資料夾給予 IIS_IUSRS 與 IUSR 這兩個帳號完全控制的權限。
      # SecRuleEngine DetectionOnly
      # changed by lawrence
      SecRuleEngine On
      
      # SecTmpDir c:\inetpub\temp\
      # changed by lawrence
      SecTmpDir D:\Service\ModSecurityConfig\temp\
      
      # SecDataDir c:\inetpub\temp\
      # changed by lawrence
      SecDataDir D:\Service\ModSecurityConfig\temp\
      
      # Body 上傳大小限制
      # SecRequestBodyNoFilesLimit 131072 # 127KB 
      SecRequestBodyNoFilesLimit 5242880 # 5MB
      
      # ======= 若要開啟 Log 稽核功能要檢查底幾個設定 =======
      # 是否開啟日誌紀錄, On 開啟、Off 關閉
      # RelevantOnly 僅記錄 SecAuditLogRelevantStatus 指定的 HTTP 狀態
      SecAuditEngine RelevantOnly 
      
      # HTTP 狀態,底下代表僅記錄 5xx、4xx(但不包含 404)
      SecAuditLogRelevantStatus "^(?:5|4(?!04))"
      
      # Serial 將所有的 Log 記錄在同一個檔案、Concurrent 記錄在不同檔案
      SecAuditLogType Concurrent
      
      # 保存 Log 的路徑,請注意若指定 Concurrent 依然要打開此設定
      SecAuditLog c:\inetpub\logs\modsec_audit.log
      
      # 若指定 Concurrent 會將每個請求的明細獨立儲存在指定的資料夾
      SecAuditLogStorageDir c:\inetpub\logs\
      
  • 站台設定檔關聯,修改 modsecurity_iis.conf,補上底下的語法。
    # modsecurity 預設規則
    Include 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'"
    
  • 完成上述設定後重新啟動 IIS 服務後,使用瀏覽器執行 http://你要服務站台的網域?WAFHealthCheck=test,若無法正常存取網頁並回傳 403 代表 WAF 設定已生效,如下圖所示。
    事件檢視器中攔截到非法請求

    違反 WAF 規則無法存取資源


更新 OWASP Core Rule Set(CRS) 防護規則

上述的設定僅安裝完 WAF 底層服務,但尚未包含防護規則,ModSecurity 本身有提供開源的 OWASP CRS 給大家使用,你可以自行選擇要安裝的規則、或者購買別人設定好的規則,只是無論使用哪種方式,conf 還是要定期更新,才能得到最佳的防護,底下是更新規則的參考步驟。

  • 下載最新版本的防護規則,本文撰寫時最新 Release 版為 v3.3.4 https://github.com/coreruleset/coreruleset/releases
  • 將下載的 crs-setup.conf.example 搬移到設定的資料夾 D:\inetpub\ModSecurityConfig,並重新命名為 crs-setup.conf。
  • 將下載的 rules 資料夾搬移到設定的資料夾 D:\inetpub\ModSecurityConfig,並重新命名為 owasp_crs。
  • 啟用所需的規則檔案,這裡我是參考 微軟 Azure 雲端服務上面的設定,你可以視需求進行增加或減少所需的規則,底下為 modsecurity_iis.conf 內的完整語法。
    # OWASP CRS v3 rules
    Include crs-setup.conf   
    # Select all available CRS rules:
    # Include owasp_crs\*.conf
    
    # CRS v3.3.5
    # 參考微軟 Azure Web 應用程式防火牆 DRS 和 CRS 規則群組和規則
    # https://learn.microsoft.com/zh-tw/azure/web-application-firewall/ag/application-gateway-crs-rulegroups-rules?tabs=drs21
    
    # 客製化個人防護規則
    Include owasp_crs\REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
      
    # CRS 初始化配置
    Include owasp_crs\REQUEST-901-INITIALIZATION.conf
      
    # Include owasp_crs\REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf
    # Include owasp_crs\REQUEST-905-COMMON-EXCEPTIONS.conf 
    
    # IP信譽函式庫
    # Include owasp_crs\REQUEST-910-IP-REPUTATION.conf
    
    # Azure 設定,HTTP請求方法偵測,鎖定方法 (PUT、PATCH)
    Include owasp_crs\REQUEST-911-METHOD-ENFORCEMENT.conf 
    
    # 拒絕服務規則
    Include owasp_crs\REQUEST-912-DOS-PROTECTION.conf
    
    # Azure 設定,防範埠和環境掃描器
    Include owasp_crs\REQUEST-913-SCANNER-DETECTION.conf 
    
    # Azure 設定,URL協定檢測,可防範通訊協定和編碼問題
    Include owasp_crs\REQUEST-920-PROTOCOL-ENFORCEMENT.conf 
    
    # Azure 設定,HTTP協定攻擊偵測,防止標頭插入、要求走私和回應分割
    Include owasp_crs\REQUEST-921-PROTOCOL-ATTACK.conf 
    
    # Include owasp_crs\REQUEST-922-MULTIPART-ATTACK.conf
    
    # Azure 設定,LFI本地文件漏洞檢測,防止檔案和路徑攻擊
    Include owasp_crs\REQUEST-930-APPLICATION-ATTACK-LFI.conf 
    
    # Azure 設定,RFI 遠端檔案檢測,防止遠端檔案包含 (RFI) 攻擊
    Include owasp_crs\REQUEST-931-APPLICATION-ATTACK-RFI.conf
    
    # Azure 設定,RCE 遠端指令執行偵測,防止遠端程式碼執行攻擊
    Include owasp_crs\REQUEST-932-APPLICATION-ATTACK-RCE.conf 
    
    # Azure 設定,PHP 攻擊偵測,防止 PHP 插入式攻擊
    Include owasp_crs\REQUEST-933-APPLICATION-ATTACK-PHP.conf 
    
    # NodeJS 攻擊偵測
    # Include owasp_crs\REQUEST-934-APPLICATION-ATTACK-NODEJS.conf
    
    # Azure 設定,XSS攻擊偵測,防止跨網站指令碼攻擊
    Include owasp_crs\REQUEST-941-APPLICATION-ATTACK-XSS.conf 
    
    # Azure 設定,SQL 注入攻擊偵測,防止 SQL 插入式攻擊
    Include owasp_crs\REQUEST-942-APPLICATION-ATTACK-SQLI.conf
    
    # Azure 設定,防止工作階段固定攻擊
    Include owasp_crs\REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf 
    
    # Azure 設定,防止 JAVA 攻擊
    Include owasp_crs\REQUEST-944-APPLICATION-ATTACK-JAVA.conf 
    
    # ********** 這個檔案很重要 **********
    # 基於風險值偵測入站請求
    # 會根據入站請求的閾值檢查異常分數並相應地阻止請求的地方
    # 若移除此項目可能部分請求僅會列警告而不會擋下
    Include owasp_crs\REQUEST-949-BLOCKING-EVALUATION.conf
    
    # 資料外洩檢測
    # Include owasp_crs\RESPONSE-950-DATA-LEAKAGES.conf
    
    # SQL 資料外洩偵測
    # Include owasp_crs\RESPONSE-951-DATA-LEAKAGES-SQL.conf
    
    # JAVA資料外洩
    # Include owasp_crs\RESPONSE-952-DATA-LEAKAGES-JAVA.conf
    
    # PHP 資料外洩
    # Include owasp_crs\RESPONSE-953-DATA-LEAKAGES-PHP.conf
    
    # IIS 洩漏數據
    # Include owasp_crs\RESPONSE-954-DATA-LEAKAGES-IIS.conf
    
    # 基於風險值偵測出站請求
    # Include owasp_crs\RESPONSE-959-BLOCKING-EVALUATION.conf
    
    # 入站、出站風險值關聯
    # Include owasp_crs\RESPONSE-980-CORRELATION.conf
    
    # 客製化個人防護規則,重載、更新、刪除偵測規則
    Include owasp_crs\RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
    
  • 上面有兩個規則是 ModSecurity CRS 提供給我們客製規則使用的,原本的檔案名稱是 .example,若需使用請刪除 .example 結尾的附檔名即可,請特別注意,conf 的語法若因為太長需要換行,請小心反斜線後方,千萬不可以有空白,否則會壞掉
    • REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf,客製自定義規則,或者經過某些條件檢查後,要移除標準規則用
    • RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf,移除、修改啟用規則用
  • 啟用 DDoS : 額外新增要預防 DDoS 阻斷服務攻擊,因此必須另外設定偵測頻率,這邊一樣要視需求進行調整,請到 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf 新增底下的語法,這個是設定參數的範例
    # DDoS 攻擊設定,
    # 此設定會在 1 秒內識別超過 2 次出現的 100 個請求(不包括靜態檔案)
    # 符合 DoS 攻擊的資格,導致請求使用者端被封鎖 60 秒(或10分鐘)
    SecAction \
        "id:900001,\
        phase:1,\
        nolog,\
        pass,\
        t:none,\
        setvar:'tx.dos_burst_time_slice=1',\
        setvar:'tx.dos_counter_threshold=100',\
        setvar:'tx.dos_block_timeout=600'"
    
  • 啟用 Google OAuth 登入 : Google 登入會被誤判認為是攻擊,詳細錯誤說明請參考此處,若要避開此問題,請到 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf 新增底下的語法,這個就是移除標準規則的範例
    # 允許 Google OAuth 登入
    # https://security.stackexchange.com/questions/236491/how-to-exclude-rule-930120-for-google-oauth
    # https://github.com/coreruleset/coreruleset/issues/1922
    SecRule ARGS:scope \
        "@contains https://www.googleapis.com/auth/userinfo.profile" \
        "id:'9000000',\
        phase:2,\
        t:none,\
        t:lowercase,\
        pass,\
        nolog,\
        ctl:ruleRemoveById=930120"  
  • 啟用 PUT & DELETE : 現有規則設定會擋住這兩個 Http Method,但我的站台使用 RESTful API 的 Design Patterns,所以必須允許此設定,請到 RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf 新增底下語法,這個是更新現有規則的範例
    # 初始化設定會擋住 PUT & DELETE,這邊需要複寫它
    SecRuleUpdateActionById 901160 "setvar:'tx.allowed_methods=GET HEAD POST PUT DELETE OPTIONS'"
    


請記得任何變更都必須重新啟動 IIS 才會生效,並且底下這些語法皆不可通過測試才是起用成功。

http://localhost?WAFHealthCheck=test  #啟用狀態偵測
http://localhost?id=1' or '1=1 #SQL Injection
http://localhost?input='<script>alert("xss")</script>' #XSS
http://localhost?exec=/bin/bash  #Execute Bash 


DDoS 攻擊測試,使用 Kali 搭配滲透測試工具進行驗證。

DDoS Attack

DDoS Attack 被規則攔截


參考網站

留言