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 被規則攔截 |
參考網站
- Windows下IIS安装ModSecurity的相关教程
- 如何使用ModSecurity WAF 来保护Windows IIS - 安装
- ModSecurity中文手冊
- OWASP ModSecurity Core Rule Set (CRS)
- [NGINX] ModSecurity #2 安裝OWASP CRS 並 測試是否生效
- 使用ModSecurity保護AEM網站免受DoS攻擊
- 微軟 Azure 規則 - Web 應用程式防火牆 DRS 和 CRS 規則群組和規則
- ModSecurity OWASP规则集的两种配置模式
- ModSecurity配置GeoIP模块来拦截非指定国家的所有IP
- 企業安全建設之 WAF 防禦
- WAF防禦軌跡
Mod_Security解析階段 可以參考 吳惠麟的"打造安全無虞的網站-使用ModSecurity"
開源碼W.A.F實作 https://cert.tanet.edu.tw/pdf/sub2.pdf。
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。