Share via


Web 應用程式防火牆排除清單

Azure 應用程式閘道 Web 應用程式防火牆 (WAF) 提供 Web 應用程式的保護。 本文說明 WAF 排除清單的設定。 這些設定位於與您的應用程式閘道相關聯的 WAF 原則中。 若要深入了解 WAF 原則,請參閱 Azure 應用程式閘道上的 Azure Web 應用程式防火牆建立應用程式閘道的 Web 應用程式防火牆原則

有時候 WAF 可能會封鎖您要允許的應用程式要求。 WAF 排除清單可讓您略過 WAF 評估的特定要求屬性。 要求的剩餘部分會評估為正常。

例如,Active Directory 會插入用於驗證的權杖。 在要求標頭中使用時,這些權杖可包含可能會從 WAF 規則觸發誤判偵測的特殊字元。 藉由將標頭新增至排除清單,您可以將 WAF 設定為忽略標頭,但 WAF 仍會評估剩餘的要求。

您可以在評估特定 WAF 規則時設定要套用的排除項目,或全域套用所有 WAF 規則的評估。 排除項目規則會套用至整個 Web 應用程式。

識別要排除的要求屬性

當您設定 WAF 排除項目時,必須指定應該從 WAF 評估中排除的要求屬性。 您可以設定下列要求屬性的 WAF 排除項目:

  • 要求標頭
  • 要求 Cookie
  • 要求屬性名稱 (引數) 可以新增為排除元素,例如:
    • 表單欄位名稱
    • JSON 實體
    • URL 查詢字串引數

您可以指定要精確比對要求標頭、本文、Cookie 或查詢字串屬性。 或您也可以指定部分相符。 使用下列運算子來設定排除項目:

  • 等於:此運算子適用於精確比對。 例如,若要選取名為 bearerToken 的標頭,請使用等於運算子搭配設定為 bearerToken 的選取器。
  • 開頭為:此運算子會比對開頭與指定之選取器值相符的所有欄位。
  • 結尾為:此運算子會比對結尾與指定之選取器值相符的所有欄位。
  • 包含:此運算子會比對包含與指定之選取器值相符的所有欄位。
  • 等於任何:此運算子符合所有要求欄位。 * 將會是選取器值。 例如,當您不知道指定比對變數的確切值,但想確保要求流量仍會從規則評估中排除時,則使用這個運算子。

處理排除項目時,WAF 引擎會根據下表執行區分大小寫/不區分大小寫的比對。 此外,不允許將規則運算式作為選取器,而且不支援 XML 要求本文。

要求本文部分 CRS 3.1 和更早版本 CRS 3.2 和更新版本
標頭* 不區分大小寫 不區分大小寫
Cookie* 不區分大小寫 區分大小寫
查詢字串* 不區分大小寫 區分大小寫
URL 編碼本文 不區分大小寫 區分大小寫
JSON 本文 不區分大小寫 區分大小寫
XML 本文 不支援 不支援
多部分本文 不區分大小寫 區分大小寫

*根據應用程式而定,標頭、Cookie 和查詢引數的名稱和值可能會區分大小寫或不區分大小寫。

注意

如需詳細資訊和疑難排解說明,請參閱 WAF 疑難排解

依金鑰和值要求屬性

設定排除項目時,您必須判斷是否要從 WAF 評估中排除金鑰或值。

例如,假設您的要求包含此標頭:

My-Header: 1=1

標頭的值 (1=1) 可能會被 WAF 偵測為攻擊。 但如果您知道這是案例的合法值,您可以設定標頭「值」的排除項目。 若要這樣做,您可以使用 RequestHeaderValues 比對變數、運算子 contains 和選取器 (My-Header)。 此設定會停止評估標頭 My-Header 的所有值。

注意

依索引鍵和值的要求屬性僅適用於 CRS 3.2 或更新版本和 Bot Manager 1.0 或更新版本。

依名稱要求屬性的運作方式與依值要求屬性相同,並在 CRS 3.1 和舊版中包含回溯相容性。 建議您依值使用要求屬性,而不要依名稱要求屬性。 例如,使用 RequestHeaderValues,而非 RequestHeaderNames

相反地,如果您的 WAF 將標頭名稱 (My-Header) 偵測為攻擊,您可以使用 RequestHeaderKeys 要求屬性來排除標頭「金鑰」RequestHeaderKeys 屬性僅適用於 CRS 3.2 或更新版本和 Bot Manager 1.0 或更新版本。

要求屬性範例

下表顯示一些範例,說明如何能夠為指定的比對變數建構排除項目。

要排除的屬性 matchVariable selectorMatchOperator 範例選取器 範例要求 要排除的內容
查詢字串 RequestArgKeys Equals /etc/passwd Uri:http://localhost:8080/?/etc/passwd=test /etc/passwd
查詢字串 RequestArgKeys EqualsAny N/A Uri:http://localhost:8080/?/etc/passwd=test&.htaccess=test2 /etc/passwd.htaccess
查詢字串 RequestArgNames Equals text Uri:http://localhost:8080/?text=/etc/passwd /etc/passwd
查詢字串 RequestArgNames EqualsAny N/A Uri:http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd.cshrc
查詢字串 RequestArgValues Equals text Uri:http://localhost:8080/?text=/etc/passwd /etc/passwd
查詢字串 RequestArgValues EqualsAny N/A Uri:http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd.cshrc
要求本文 RequestArgKeys 包含 sleep 要求本文:{"sleep(5)": "test"} sleep(5)
要求本文 RequestArgKeys EqualsAny N/A 要求本文:{".zshrc": "value", "sleep(5)":"value2"} .zshrcsleep(5)
要求本文 RequestArgNames Equals test 要求本文:{"test": ".zshrc"} .zshrc
要求本文 RequestArgNames EqualsAny N/A 要求本文:{"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
要求本文 RequestArgValues Equals test 要求本文:{"test": ".zshrc"} .zshrc
要求本文 RequestArgValues EqualsAny N/A 要求本文:{"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
頁首 RequestHeaderKeys Equals X-Scanner 標題:{"X-Scanner": "test"} X-scanner
頁首 RequestHeaderKeys EqualsAny N/A 標題:{"X-Scanner": "test", "x-ratproxy-loop": "value"} X-Scannerx-ratproxy-loop
頁首 RequestHeaderNames Equals head1 標題:{"head1": "X-Scanner"} X-scanner
頁首 RequestHeaderNames EqualsAny N/A 標題:{"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
頁首 RequestHeaderValues Equals head1 標題:{"head1": "X-Scanner"} X-scanner
頁首 RequestHeaderValues EqualsAny N/A 標題:{"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
Cookie RequestCookieKeys 包含 /etc/passwd 標題:{"Cookie": "/etc/passwdtest=hello1"} /etc/passwdtest
Cookie RequestCookieKeys EqualsAny N/A 標題:{"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} /etc/passwdtest.htaccess
Cookie RequestCookieNames Equals arg1 標題:{"Cookie": "arg1=/etc/passwd"} /etc/passwd
Cookie RequestCookieNames EqualsAny N/A 標題:{"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd.cshrc
Cookie RequestCookieValues Equals arg1 標題:{"Cookie": "arg1=/etc/passwd"} /etc/passwd
Cookie RequestCookieValues EqualsAny N/A 標題:{"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd.cshrc

注意

如果您使用 selectorMatchOperator EqualsAny 建立排除項目,則在選取器欄位中放置的任何項目都會在建立排除項目時,由後端轉換成 "*"。

排除範圍

排除項目可以設為套用至一組特定的 WAF 規則、套用至規則集,或跨全域所有規則。

提示

盡可能縮小並指定排除項目是很好的做法,以避免不小心讓攻擊者有惡意探索系統的機會。 當您需要新增排除規則時,請盡可能使用個別規則排除項目。

個別規則排除項目

您可以為特定規則、規則群組或規則集設定排除項目。 您必須指定排除所要套用的規則或多個規則。 您也需要指定應從 WAF 評估中排除的要求屬性。 若要完整排除規則群組,請只提供 ruleGroupName 參數,rules 參數只有在您想要將排除範圍限制為特定的群組規則時才有用。

當您使用 OWASP (CRS) 規則集 3.2 版或更新版本,或 Bot Manager 規則集 1.0 版或更新版本時,則可以使用每個規則排除項目。

範例

假設您希望 WAF 忽略 User-Agent 要求標頭的值。 User-Agent 標頭包含特性字串,可讓網路通訊協定對等互連識別要求軟體使用者代理程式的應用程式類型、作業系統、軟體廠商或軟體版本。 如需詳細資訊,請參閱 User-Agent

可能有許多原因而停用評估此標頭。 可能有一個字串 被 WAF 偵測到,並認為其為惡意的。 例如,User-Agent 標頭可能在字串包含傳統的 SQL 插入式攻擊 x=x。 在某些情況下,這可能是合法的流量。 因此,您可能需要從 WAF 評估中排除此標頭。

您可以使用下列方法來排除 User-Agent 標頭,使其免於受到所有 SQL 插入規則的評估:

若要使用 Azure 入口網站設定個別規則排除項目,請遵循下列步驟:

  1. 瀏覽至 WAF 原則,然後選取 [受控規則]

  2. 選取 [新增排除項目]

    Screenshot of the Azure portal that shows how to add a new per-rule exclusion for the W A F policy.

  3. 在 [套用至] 中,選取要套用排除項目的 CRS 規則集,例如 OWASP_3.2

    Screenshot of the Azure portal that shows the per-rule exclusion configuration for the W A F policy.

  4. 選取 [新增規則],然後選取您要套用排除項目的規則。

  5. 設定比對變數、運算子和選取器。 然後選取儲存

您可以設定多個排除項目。

您也可以只透過規則 942270,將 User-Agent 標頭從評估中排除:

請遵循上述範例中所述的步驟,然後在步驟 4 中選取規則 942270。

全域排除項目

您可以設定排除項目以套用至所有的 WAF 規則。

範例

假設您想要排除透過 URL 在要求中傳入的「使用者」參數中的值。 例如,假設您的環境中的 user 查詢字串引數經常會包含 WAF 視為惡意內容的字串,因此將其封鎖。 您可以排除所有名稱以 user 字詞開頭的查詢字串引數,如此 WAF 便不會評估該欄位的值。

下列範例示範如何從評估中排除 user 查詢字串引數:

若要使用 Azure 入口網站設定全域排除項目,請遵循下列步驟:

  1. 瀏覽至 WAF 原則,然後選取 [受控規則]

  2. 選取 [新增排除項目]

    Screenshot of the Azure portal that shows how to add a new global exclusion for the W A F policy.

  3. 在 [套用至]中,選取 [全域]

    Screenshot of the Azure portal that shows the global exclusion configuration for the W A F policy.

  4. 設定比對變數、運算子和選取器。 然後選取儲存

您可以設定多個排除項目。

因此,如果 WAF 掃描 URL http://www.contoso.com/?user%3c%3e=joe,便不會評估字串 joe,但仍會評估參數名稱 user%3c%3e

下一步