調整 Google Cloud Armor 預先設定的網路應用程式防火牆規則

Google Cloud Armor 提供預先設定的 WAF 規則,每項規則都包含多個簽章,這些簽章來自 OWASP 核心規則集 (CRS)。每個簽章都對應規則集中的攻擊偵測規則。系統會根據預先設定的網路應用程式防火牆規則評估傳入要求。如果要求與預先設定的網頁應用程式防火牆規則相關聯的任何簽章相符,即符合該規則。當 evaluatePreconfiguredWaf() 運算式傳回 true 值時,即為相符。

選擇敏感程度

每個簽章都有對應至 OWASP 偏執等級的敏感度等級。您可以選取介於 04 之間的靈敏度,但靈敏度等級 0 表示預設不會啟用任何規則。

靈敏度越低,代表簽章可信度越高,越不可能產生偽陽性結果。提高敏感度可加強安全性,但也會增加產生偽陽性的風險。為 WAF 規則選取敏感程度時,您會選擇敏感程度小於或等於所選敏感程度的簽章。在下列範例中,您會選取 1 的敏感度層級,藉此調整預先設定的 WAF 規則:

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

選擇不採用規則簽章

如果您認為預先設定的網路應用程式防火牆規則比必要情況比對更多要求,或是規則封鎖了需要允許的流量,可以調整規則,停用雜訊或其他不必要的簽章。如要停用特定預先設定網頁應用程式防火牆規則中的簽章,請在 evaluatePreconfiguredWaf() 運算式中提供不要的簽章 ID 清單。

以下範例從預先設定的 sqli-v33-stable (CRS 3.3) 網路應用程式防火牆規則排除兩組 CRS 規則 ID:

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

從預先設定的 CRS 規則集選擇停用簽章 ID 時,您必須將簽章 ID 版本與規則集版本 (CRS 3.0 或 3.3) 相符,以免發生設定錯誤。

您也可以使用舊版運算式 evaluatePreconfigureExpr() 停用簽章 ID。如要進一步瞭解預先設定的 WAF 規則運算式,請參閱自訂規則語言參考資料

採用規則簽章

您不必停用規則簽章,而是可以在其他已停用的靈敏度層級中啟用規則簽章。如果要在特定敏感度層級中使用的規則簽章數量,少於要停用的規則數量,建議您選擇啟用規則簽章。如要選擇採用規則簽章,敏感度等級必須為 0。以下範例會停用所有敏感度層級的所有 cve-canary 簽章,然後明確啟用 owasp-crs-v030001-id044228-cveowasp-crs-v030001-id144228-cve

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

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

您的自訂應用程式可能在要求欄位 (例如標頭、Cookie、查詢參數或 URI) 中包含與預先設定的 WAF 規則中的簽章相符的內容,但您知道這些內容是合法的。在這種情況下,您可以將要求欄位與安全性政策規則建立關聯,藉此排除要求欄位檢查,減少誤判。請注意,如果 WAF 規則附加了要求欄位排除項目,您就無法使用 allow 動作。

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

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

以下各節將進一步說明可從檢查中排除的要求欄位,並提供相關範例。

要求標頭

這份清單列出要求標頭名稱,系統會在預先設定的網頁應用程式防火牆規則評估期間,排除這些標頭的值。

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

  • REQUEST_HEADERS

系統只會排除指定要求標頭的值,不會檢查這些值。 我們仍在檢查名稱。

要求取得 Cookie

要求 Cookie 名稱清單,這些 Cookie 的值在預先設定的網頁應用程式防火牆規則評估期間,不會接受檢查。

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

  • REQUEST_COOKIES

系統只會排除指定要求 Cookie 的值,不會檢查其他內容。 我們仍在檢查名稱。

要求查詢參數

要求查詢參數名稱清單,這些參數的值在預先設定的網頁應用程式防火牆規則評估期間,會排除在檢查範圍之外。

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

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

系統只會從檢查中排除指定查詢參數的值,這些值可能位於查詢字串或 POST 內文中。系統仍在檢查名稱。

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

舉例來說,如果您排除名為「args」的查詢參數,但要求在 POST 內文中含有「args」參數,且「args」的值相符,您可能仍會看到檢查整個要求內文的簽章相符。

要求 URI

要求行中的 URI 清單 (不含查詢字串資料),在預先設定的網頁應用程式防火牆規則評估期間,會排除在檢查範圍之外。

這項排除條件僅適用於目標中的簽章,這些簽章原本會檢查要求 URI。這包括與 OWASP Core Rule Set 中下列要求標記相關聯的簽章:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

排除上述任一欄位時,該欄位會完全從檢查中排除,且不會重新組裝。

欄位值

如果使用 EQUALS_ANY 以外的欄位運算子,就必須指定欄位值。

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

  • !#$%&*+-.^_`|~
  • 英文字母 AZ (包括大小寫)
  • 數字字元 09

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

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

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

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

範例

第一個範例會更新 PRIORITY 中的安全性政策 POLICY_1 規則,在 sqli-v33-stable WAF 規則下新增所有簽章的排除設定,以排除檢查所有要求 Cookie:

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

第二個範例會更新安全性政策 POLICY_2PRIORITY 中的規則,在 xss-v33-stable WAF 規則下新增簽章的排除設定 owasp-crs-v030301-id941140-xssowasp-crs-v030301-id941270-xss,排除開頭為 abc 或結尾為 xyz 的要求標頭,不進行檢查:

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

第三個範例會更新安全性政策 POLICY_3 PRIORITY 中的規則,為 sqli-v33-stable WAF 規則下的所有簽章新增排除設定。這不包括等於 bad-param 的要求查詢參數 (從 URI 查詢字串或主體酬載剖析):

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

第四個範例會更新安全性政策 POLICY_4 中的規則,在 PRIORITY 新增簽章 owasp-crs-v030301-id930100-lfi 的排除設定,位於 lfi-v33-stable WAF 規則下方。這會排除包含 /bad-path 的要求 URI,避免檢查:

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

第五個範例會更新安全性政策 POLICY_5 中的規則,PRIORITY 移除規則 ID owasp-crs-v030301-id942110-sqliowasp-crs-v030301-id942120-sqli 的所有要求欄位排除項目 (位於 sqli-v33-stable 下方)。

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

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

Google Cloud Armor 根據預先設定的 WAF 規則評估 POST 主體時,Content-Type 標頭會指出要求主體中資料的格式。根據預設,Google Cloud Armor 會將 POST 主體內容視為一個字串,所有內容都符合預先設定的網路應用程式防火牆規則檢查和比對資格。不過,如果傳入的要求採用不同編碼,您可以設定更精確的剖析方式。Google Cloud Armor 支援下列編碼類型:

  • JSON
  • GraphQL

詳情請參閱「剖析 POST 內文內容」。

後續步驟