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

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

有時候 WAF 可能會封鎖您想要允許應用程式的要求。 WAF 排除清單可讓您省略 WAF 評估中的特定要求屬性。 其餘的要求會評估為一般。

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

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

識別要排除的要求屬性

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

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

您可以指定確切的要求標頭、主體、Cookie 或查詢字串屬性比對。 或者,您可以指定部分相符專案。 使用下列運算子來設定排除:

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

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

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

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

注意

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

依索引鍵和值要求屬性

當您設定排除時,您必須判斷要從 WAF 評估中排除索引鍵或值。

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

My-Header: 1=1

標頭 ( 1=1 ) 的值可能會偵測為 WAF 的攻擊。 但是,如果您知道這是案例的合法值,您可以設定 標頭值的 排除。 若要這樣做,您可以使用 RequestHeaderValues 比對變數、運算子 包含 和選取器 ( 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 等於 /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 等於 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 等於 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 Contains sleep 要求本文: {"sleep(5)": "test"} sleep(5)
要求本文 RequestArgKeys EqualsAny N/A 要求本文: {".zshrc": "value", "sleep(5)":"value2"} .zshrcsleep(5)
要求本文 RequestArgNames 等於 test 要求本文: {"test": ".zshrc"} .zshrc
要求本文 RequestArgNames EqualsAny N/A 要求本文: {"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
要求本文 RequestArgValues 等於 test 要求本文: {"test": ".zshrc"} .zshrc
要求本文 RequestArgValues EqualsAny N/A 要求本文: {"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
標題 RequestHeaderKeys 等於 X-Scanner 標題:{"X-Scanner": "test"} X-scanner
標題 RequestHeaderKeys EqualsAny N/A 標題:{"X-Scanner": "test", "x-ratproxy-loop": "value"} X-Scannerx-ratproxy-loop
標題 RequestHeaderNames 等於 head1 標題:{"head1": "X-Scanner"} X-scanner
標題 RequestHeaderNames EqualsAny N/A 標題:{"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
標題 RequestHeaderValues 等於 head1 標題:{"head1": "X-Scanner"} X-scanner
標題 RequestHeaderValues EqualsAny N/A 標題:{"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
Cookie RequestCookieKeys Contains /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 等於 arg1 標題:{"Cookie": "arg1=/etc/passwd"} /etc/passwd
Cookie RequestCookieNames EqualsAny N/A 標題:{"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd.cshrc
Cookie RequestCookieValues 等於 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. 設定比對變數、運算子和選取器。 然後選取儲存

您可以設定多個排除專案。

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

下一步