調整預先設定的 WAF 規則

Google Cloud Armor 運用 Google 的全球基礎架構和安全性系統,協助保護您的服務,防範分散式阻斷服務 (DDoS) 和網路攻擊。您可以調整 Cloud Armor 預先設定的 WAF 規則,自訂評估傳入要求的方式、精細調整威脅偵測,以及減少偽陽性。本頁面說明如何選擇敏感度等級、選擇加入或選擇不採用規則簽章,以及從檢查範圍中排除要求欄位。

預先設定的 WAF 規則包含多個簽章,這些簽章源自 OWASP 核心規則集。每個簽章都對應一項攻擊偵測規則。您可以調整這些規則,自訂評估傳入要求的方式,更符合應用程式的特定流量模式。您可以在擁有的 階層式安全性政策中,調整預先設定的 WAF 規則。如果服務繼承了階層式安全性政策,您就無法調整其規則。

選擇敏感度等級

每個簽章都有一個敏感度等級,對應至 OWASP 偏執等級。您可以選取 0 到 4 之間的敏感度,但敏感度等級 0 表示未啟用任何規則。

敏感度等級越低,表示簽章的可信度越高,產生偽陽性的可能性越低。根據預設,Cloud Armor 的敏感度層級設為 4,啟用後會評估規則集中的所有簽章。敏感度等級越高,安全性就越高,但產生偽陽性的風險也越高。選取預先設定 WAF 規則的敏感度等級時,系統會選擇加入敏感度等級小於或等於所選敏感度等級的特徵。在以下範例中,您選取 1 的敏感度等級,藉此調整預先設定的 WAF 規則:

evaluatePreconfiguredWaf(
  'sqli-v422-stable',
  {
    'sensitivity': 1
  }
)

選擇不採用規則簽章

如果認為預先設定的 WAF 規則比對出過多不必要的要求,或規則封鎖了應允許的流量,可以調整規則,停用誤判率高或其他非必要的簽章。如要停用特定預先設定 WAF 規則中的簽章,請在 evaluatePreconfiguredWaf 運算式中提供不想要的簽章 ID 清單。

以下範例從預先設定的 sqli-v422-stable (CRS 4.22) WAF 規則,排除兩組 CRS 規則 ID:

evaluatePreconfiguredWaf(
  'sqli-v422-stable',
  {
    'sensitivity': 4,
    'opt_out_rule_ids': ['owasp-crs-v042200-id942350-sqli', 'owasp-crs-v042200-id942360-sqli']
  }
)

從預先設定的 CRS 規則集排除簽章 ID 時,必須將簽章 ID 版本與規則集版本 (CRS 3.0 或 3.3) 進行比對,以免發生設定錯誤。

如要進一步瞭解預先設定的 WAF 規則運算式,請參閱自訂規則語言參考資料。

選擇加入規則簽章

您可以選擇加入原本停用的嚴重性等級規則簽章,而非選擇不採用規則簽章。如果特定敏感度層級中,您想選擇加入的規則簽章數量少於想選擇不採用的規則數量,建議您啟用規則簽章。如要選擇加入規則簽章,敏感度等級必須為 0。以下範例會停用所有敏感度層級的所有 cve-canary 簽章,然後明確啟用 owasp-crs-v042200-id044228-cve 和 owasp-crs-v042200-id144228-cve:

evaluatePreconfiguredWaf(
  'cve-canary',
  {
    'sensitivity': 0,
    'opt_in_rule_ids': ['owasp-crs-v042200-id044228-cve', 'owasp-crs-v042200-id144228-cve']
  }
)

從檢查範圍中排除要求欄位

自訂應用程式有時會在要求欄位 (例如標頭、Cookie、查詢參數、URI 或要求主體) 中包含合法內容,而這些內容與預先設定的 WAF 規則中的簽章相符。如要減少偽陽性,請在安全性政策規則中新增排除清單,將這些要求欄位排除在檢查範圍之外。請注意,如果 WAF 規則附加了要求欄位排除項目,就無法使用 allow 動作。

設定要求欄位排除項目時,您會將其與目標建立關聯。目標可以是所有規則集 (全域排除項目)、整個預先設定的 WAF 規則,或是預先設定 WAF 規則下的簽章清單。使用欄位運算子和欄位值,指定完全或部分相符。可用的欄位運算子如下:

  • EQUALS:如果欄位值等於指定值,運算子就會比對成功。
  • STARTS_WITH:如果欄位值開頭為指定值,運算子就會比對成功。
  • ENDS_WITH:如果欄位值的結尾是指定值,運算子就會比對成功。
  • CONTAINS:如果欄位值包含指定值,運算子就會比對成功。
  • EQUALS_ANY:如果欄位值為任何值,運算子就會比對成功。

調整排除限制

服務層級後端政策 (全域和區域) 的預設調整排除限制為 100。這項限制適用於每個目標,並控管您在安全性政策規則中可設定的排除條件數量上限。目標是規則集和規則 ID 的組合。這項限制適用於下列欄位的排除條件:

舉例來說,如果您有預先設定的 WAF 規則 (例如 evaluatePreconfiguredWaf('sqli-v422-stable')),且想排除特定目標 (例如 sqli-v422-stable 下的 owasp-crs-v042200-id942100-sqli) 的要求欄位,最多可以設定 100 個要求標頭、100 個要求 Cookie、100 個要求查詢參數、100 個要求 URI 和 100 個要求主體,從該目標中排除。

下列各節說明全域排除項目、可排除檢查的要求欄位,以及相關範例。

全域排除條件

如要將排除項目套用至安全性政策規則下的所有規則集,請將 --target-rule-set 旗標設為「*」,指定全域排除項目。您可以使用全域排除項目排除任何要求欄位類型,例如標頭、Cookie、查詢參數、URI 或要求主體。請勿為全域排除項目指定目標規則 ID。

要求標頭

要求標頭名稱清單,在預先設定的 WAF 規則評估期間,系統會排除這些標頭的值,不進行檢查。

排除項目僅適用於目標中原本會檢查要求標頭值的簽章。包括與 OWASP 核心規則集中下列要求旗標相關聯的簽章:

  • REQUEST_HEADERS

只有指定要求標頭的值會排除在檢查範圍外。系統仍會檢查名稱。

要求 Cookie

要求 Cookie 名稱清單,在預先設定的 WAF 規則評估期間,系統會排除這些 Cookie 的值,不進行檢查。

排除條件僅適用於目標中原本會檢查要求 Cookie 值的簽章。包括與 OWASP 核心規則集中下列要求旗標相關聯的簽章:

  • REQUEST_COOKIES

只有指定要求 Cookie 的值會排除在檢查範圍外。系統仍會檢查名稱。

要求查詢參數

要求查詢參數名稱清單,在預先設定的 WAF 規則評估期間,系統會排除這些參數的值,不進行檢查。

排除項目僅適用於目標中原本會檢查要求參數的簽章。包括與 OWASP 核心規則集中下列要求旗標相關聯的簽章:

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

只有指定查詢參數的值會排除在檢查範圍外,這些參數可能位於查詢字串或要求主體中。但系統仍會檢查名稱。

由於查詢參數是 URI 和要求行的一部分,因此系統會在排除指定的查詢參數後,重新組合這些欄位以進行檢查。不過,如果簽章會檢查整個要求主體 (例如與要求旗標 REQUEST_BODY 相關聯的簽章),則不會套用查詢參數排除項目。

舉例來說,如果您排除名為「args」的查詢參數,但要求主體中含有「args」參數,且「args」的值相符,則檢查整個要求主體的簽章仍可能顯示相符項目。

要求網址

要求行中的 URI 清單 (不含查詢字串資料),在預先設定的 WAF 規則評估期間,系統會排除這些 URI,不進行檢查。

排除項目僅適用於目標中原本會檢查要求 URI 的簽章。包括與 OWASP 核心規則集中下列要求旗標相關聯的簽章:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

排除上述任何欄位時,系統會完全排除該欄位,不進行檢查,也不會重新組合。

要求主體

指定在預先設定的 WAF 規則評估期間,要從檢查中排除的要求主體值。

這項排除設定僅適用於目標中檢查要求主體值的簽章,例如與 OWASP 核心規則集中的 REQUEST_BODY 要求旗標相關聯的簽章。

只有符合指定值的要求主體,才會排除在檢查範圍外。

欄位值

如果使用的欄位運算子不是 EQUALS_ANY,則必須指定欄位值。

要求標頭、要求 Cookie 和要求查詢參數的欄位值,允許使用的字元集包含下列字元:

  • !、#、$、%、&、*、+、-、.、^、_、`、|、~
  • 英文字母 A 到 Z (大小寫皆可)
  • 數字字元 0 到 9

如果是要求主體,欄位值允許的字元集包含所有可列印的 ASCII 字元,但不包括 '、\`,(, and)`:

  • 空格 () 和特殊字元:!、"、#、$、%、&、*、+、,、-、.、/、:、;、<、=、>、?、@、[、]、^、_、`、{、|、}、~
  • 英文字母 A 到 Z (大小寫皆可)
  • 數字字元 0 到 9

對這些要求欄位套用排除條件時,系統會將設定的欄位值與要求中的值 (不區分大小寫,轉換後) 進行比較。如要排除不屬於允許字元集的特定字元,則不需執行額外編碼。

如果是要求 URI,欄位值必須採用 URI 格式,如下所示:

  • 可以使用配置,但僅限 http 或 https。
  • 可使用主機,也可以是 IP 位址。
  • 可使用通訊埠。
  • 允許使用路徑。
  • 不允許查詢。
  • 不允許使用片段。

套用要求 URI 的排除條件時,系統會將設定的欄位值與要求行中的 URI (不區分大小寫,轉換後) 進行比較,不含查詢字串。要求行中的 URI 可以是相對或絕對路徑。設定要求 URI 的排除條件時,請考量這一點。

範例

第一個範例會更新 PRIORITY 中 POLICY_1 安全性政策的規則,為所有規則集新增全域排除設定。這會將包含 bad-body-value 的要求主體排除在檢查範圍外:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_1 \
    --target-rule-set "*" \
    --request-body-to-exclude "op=CONTAINS,val=bad-body-value"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_1:安全性政策名稱

第二個範例會更新 PRIORITY 的安全性政策 POLICY_2 中的規則,為預先設定的 WAF 規則 sqli-v422-stable 下的所有簽章新增排除設定,將所有要求 Cookie 排除在檢查範圍之外:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_2 \
    --target-rule-set "sqli-v422-stable" \
    --request-cookie-to-exclude "op=EQUALS_ANY"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_2:安全性政策名稱

第三個範例會更新 PRIORITY 位於 POLICY_3 的安全性政策規則,為預先設定的 WAF 規則 xss-v422-stable 下的簽章 owasp-crs-v042200-id941140-xss 和 owasp-crs-v042200-id941270-xss 新增排除設定,將開頭為 abc 或結尾為 xyz 的要求標頭排除在檢查範圍之外:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_3 \
    --target-rule-set "xss-v422-stable" \
    --target-rule-ids "owasp-crs-v042200-id941140-xss,owasp-crs-v042200-id941270-xss" \
    --request-header-to-exclude "op=STARTS_WITH,val=abc" \
    --request-header-to-exclude "op=ENDS_WITH,val=xyz"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_3:安全性政策名稱

第四個範例會更新 PRIORITY 的安全性政策 POLICY_4 中的規則,為預先設定的 WAF 規則 sqli-v422-stable 下的所有簽章新增排除設定。這會將等於 bad-param 的要求查詢參數 (從 URI 查詢字串或主體酬載剖析) 排除在檢查範圍之外:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_4 \
    --target-rule-set "sqli-v422-stable" \
    --request-query-param-to-exclude "op=EQUALS,val=bad-param"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_4:安全性政策名稱

第五個範例會更新 PRIORITY 的安全性政策 POLICY_5 中的規則,為預先設定的 WAF 規則 lfi-v422-stable 下的簽章 owasp-crs-v042200-id930100-lfi 新增排除設定。這會將包含 /bad-path 的要求 URI 排除在檢查範圍外:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_5 \
    --target-rule-set "lfi-v422-stable" \
    --target-rule-ids "owasp-crs-v042200-id930100-lfi" \
    --request-uri-to-exclude "op=CONTAINS,val=/bad-path"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_5:安全性政策名稱

第六個範例會更新 PRIORITY 的安全性政策 POLICY_6 中的規則,移除 sqli-v422-stable 下規則 ID owasp-crs-v042200-id942110-sqli 和 owasp-crs-v042200-id942120-sqli 的所有要求欄位排除項目。

gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_6 \
    --target-rule-set "sqli-v422-stable" \
    --target-rule-ids "owasp-crs-v042200-id942110-sqli,owasp-crs-v042200-id942120-sqli"

更改下列內容:

  • PRIORITY:規則的優先順序
  • POLICY_6:安全性政策名稱

對自訂 Content-Type 標頭值套用剖析

Cloud Armor 根據預先設定的 WAF 規則評估要求主體時,Content-Type 標頭會指出要求主體中的資料格式。根據預設,Cloud Armor 會將要求主體的內容視為單一字串,並根據預先設定的 WAF 規則,對所有內容進行檢查和比對。不過,如果傳入的要求採用不同的編碼,您可以設定更精確的剖析。

Cloud Armor 支援下列編碼類型:

  • JSON
  • GraphQL

詳情請參閱「要求主體內容剖析」。

後續步驟