IBM Cloud Docs
使用 WAF 自訂規則

使用 WAF 自訂規則

WAF 自訂規則可針對 HTTP 流量提供強大的靈活性,並應用自訂條件來攔截、挑戰、記錄或允許特定要求。

您可以建立多種類型的 WAF 自訂規則。 不過,網站上的作用中規則數目受限於客戶方案。 請參閱 比較 CIS 計劃,以瞭解更多有關權利的資訊。

每個方案的作用中規則數目固定。 目前,您無法購買更多的活動規則。

在開始之前,最好先檢閱 Using 欄位、函式和表達式

您可以使用 UI、CLI、API 或 Terraform 建立、更新和刪除自訂規則。

在主控台中使用 WAF 自訂規則

在主控台中建立自訂規則

按照以下步驟在主控台中建立自訂規則:

WAF 自訂規則可使用現有的防火牆規則頁來設定。 之前在您的網域上建立的任何傳統防火牆規則,都會自動轉換為 WAF 自訂規則。

  1. 導覽至安全 > 防火牆規則

  2. 按一下建立

  3. 輸入選用的描述。

  4. 必要的話,選擇性地輸入優先順序。 優先順序為 0 時為空優先順序,最後評估。

  5. 使用送入要求區段中的使用者介面建置器來新增條件。 若要建置具有多個條件的表示式,請按一下下列任一項:

    • 以及- 評估使用_和_邏輯的條件
    • - 評估使用_或_邏輯的條件_或_先前的條件組

    建置條件時,可以看到「表示式預覽」以純文字顯示表示式。

    在「表示式預覽」中,您可以按一下以手動編輯表示式,而不使用「視覺化表示式建置器」,或是切換使用這兩者。 然而,視手動建構的表達式的複雜性而定,Visual Expression Builder 可能無法呈現它。

  6. 回應清單功能表中選取一個動作。

  7. 若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:

    • 儲存為草稿以儲存您的規則,但將其停用。
    • Save and deploy(儲存並部署 )可儲存您的規則並將其啟用。

在主控台中更新自訂規則

按照以下步驟更新主控台中的現有自訂規則:

  1. 導覽至安全 > 防火牆規則
  2. 在防火牆規則表中,找到要修改的規則,然後按一下該行右側的動作功能表。
  3. 選取編輯
  4. 對規則進行變更。
  5. 若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
    • 儲存為草稿以儲存您的規則,但將其停用。
    • Save and deploy(儲存並部署 )可儲存您的規則並將其啟用。

若要暫停或啟動現有規則清單中的任何規則,請按一下啟用切換鍵。

在主控台中刪除自訂規則

按照以下步驟刪除主控台中的現有自訂規則:

  1. 導覽至安全 > 防火牆規則
  2. 在防火牆規則表中,找到要修改的規則,然後按一下該行右側的動作功能表。
  3. 選取刪除
  4. 確認要執行規則刪除作業。

從 CLI 使用 WAF 自訂規則

從 CLI 建立自訂規則

若要從 CLI 建立自訂規則,請遵循下列步驟:

  1. 設定您的 CLI 環境

  2. 使用 CLI 登入您的帳戶。 輸入密碼後,系統會提示您要使用的帳號和區域:

    ibmcloud login --sso
    
  3. 執行下列指令以建立自訂規則:

    ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
    
    ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
    

    其中:

DNS_DOMAIN_ID
DNS 網域的 ID。
--match
指定規則執行時必須符合的條件。 有關匹配值,請參閱 使用欄位、函式和表達式

--action :要執行的規則動作。 有效值:"block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。 對於「block「和」skip」動作,請使用 JSON 檔案或 JSON 字串來取代。

--enabled

指出規則是否在作用中。 預設為 "false"。

--description

規則的簡短說明。

--json

用來說明自訂規則的 JSON 檔案或 JSON 字串。

  • JSON 資料中的必填欄位是 expression, action

    expression:指定規則執行時必須符合的條件。 action: 要執行的規則動作。 有效值:"block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。

  • 可選欄位是 description, enabled, logging, action_parameters

    action_parameters:規則動作參數。 ruleset: 跳過所有剩餘規則,或一或多個 WAF 受管理規則集。 有效值:currentphases: 跳過相符要求的 WAF 元件。 有效值:"http_ratelimit"、"http_request_firewall_managed"、"http_request_sbfm"。 products: 跳過特定安全產品的匹配請求。 有效值:"waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown"。 response: 定義「封鎖」動作的自訂回應。 status_code: 選擇一個 HTTP 狀態碼作為回應,範圍為 400-499。 content_type: 自訂回應的內容類型。 有效的回應類型為:text/html,text/plain, application/json, text/xmlcontent:回應正文。 description: 簡述該規則。 enabled: 指出規則是否在作用中。 logging: 符合跳過規則的日誌要求。 此欄位只適用於「跳過」動作。

    • enabled:停用時,匹配的請求不會出現在防火牆事件中。

範例 JSON 資料:


         {
           "description": "test-custom-rule",
           "expression": "(http.cookie contains \"test\")",
           "action": "skip",
           "logging": {
                   "enabled": true
               },
           "action_parameters": {
             "ruleset": "current",
               "phases": [
                       "http_ratelimit",
                       "http_request_firewall_managed",
                       "http_request_sbfm"
                   ],
                   "products": [
                       "waf",
                       "rateLimit",
                       "securityLevel",
                       "hot",
                       "bic",
                       "uaBlock",
                       "zoneLockdown"
                   ]
           },
           "enabled": true
         }
-i, --instance
實例名稱或 ID。 如果未設定,則使用 ibmcloud cis instance-set INSTANCE 指定的上下文實例。
--output
指定輸出格式,僅支援 JSON

從 CLI 更新自訂規則

執行下列指令,在 CLI 中更新自訂規則:

ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]


ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]

其中:

DNS_DOMAIN_ID
DNS 網域的 ID。
RULE_ID
規則的 ID。
--match
指定規則執行時必須符合的條件。 有關匹配值,請參閱 使用欄位、函式和表達式

--action :要執行的規則動作。 有效值:"block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。

--enabled

指出規則是否在作用中。 預設為 "false"。

--description

規則的簡短說明。

--json

用來說明自訂規則的 JSON 檔案或 JSON 字串。

  • JSON 資料中的必填欄位是 expression, action

    expression:指定規則執行時必須符合的條件。 action: 要執行的規則動作。 有效值:"block"、"challenge"、"js_challenge"、"managed_challenge"、"log"、"skip"。

  • 可選欄位是 description, enabled, logging, action_parameters

    action_parameters:規則動作參數。 ruleset: 跳過所有剩餘規則,或一或多個 WAF 受管理規則集。 有效值:currentphases: 跳過相符要求的 WAF 元件。 有效值:"http_ratelimit"、"http_request_firewall_managed"、"http_request_sbfm"。 products: 跳過特定安全產品的匹配請求。 有效值:"waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown"。 response: 定義「封鎖」動作的自訂回應。 status_code: 選擇一個 HTTP 狀態碼作為回應,範圍為 400-499。 content_type: 自訂回應的內容類型。 有效的回應類型為:text/html,text/plain, application/json, text/xmlcontent:回應正文。 description: 簡述該規則。 enabled: 指出規則是否在作用中。 logging: 符合跳過規則的日誌要求。 此欄位只適用於「跳過」動作。

    • enabled:停用時,匹配的請求不會出現在防火牆事件中。

範例 JSON 資料:

         {
           "description": "test-custom-rule",
           "expression": "(http.cookie contains \"test\")",
           "action": "block",
           "action_parameters": {
             "response": {
             "status_code": 429,
             "content_type": "text/xml",
             "content": "reject"
             }
           },
           "enabled": true
         }
-i, --instance
實例名稱或 ID。 如果未設定,則使用 ibmcloud cis instance-set INSTANCE 指定的上下文實例。
--output
指定輸出格式,僅支援 JSON

從 CLI 刪除自訂規則

在 CLI 中執行下列指令刪除自訂規則:

ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]

其中:

DNS_DOMAIN_ID
DNS 網域的 ID。
RULE_ID
自訂規則的 ID。
-i, --instance
實例名稱或 ID。 如果未設定,則使用 ibmcloud cis instance-set INSTANCE 指定的上下文實例。
-f, --force
嘗試刪除自訂規則,而不提示確認。
--output
指定輸出格式,僅支援 JSON

指令範例

  • 若要建立自訂規則:

    ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"

  • 若要更新自訂規則:

    ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true

  • 若要刪除自訂規則:

    ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27

使用 API 處理 WAF 自訂規則

取得 API 的自訂規則入口點

所有自訂規則 API 作業都需要 RULESET_ID 自訂規則階段的入口點規則集。 此入口點規則集可能已經存在,若不存在則需要建立。

按照以下步驟取得自訂規則入口點規則集:

  1. 使用正確的變數設定 API 環境。

  2. 將下列值儲存在變數中,以便在 API 指令中使用:

    CRN:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。

    ZONE_ID:網域 ID。

  3. 當所有變數都啟動時,取得入口點規則集:

curl -X GET "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json"

規則集 ID 將會出現在成功請求的回應中。 如果上述呼叫回傳 404 Not Found 回應,請使用下列 API 建立自訂規則階段的入口點規則集:

curl -x POST https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
   "name": "Zone-level phase entry point",
   "kind": "zone",
   "description": "Custom rule entry point ruleset.",
   "phase": "http_request_firewall_custom"
}'

使用 API 建立自訂規則

按照以下步驟使用 API 建立自訂規則:

  1. 使用正確的變數設定 API 環境。

  2. 將下列值儲存在變數中,以便在 API 指令中使用:

    CRN:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。

    ZONE_ID:網域 ID。

    RULESET_ID:自訂規則入口點規則集的 ID。

  3. 啟動所有變數後,建立自訂規則:

    curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
    --header "X-Auth-User-Token: Bearer <API_TOKEN>" \
    --header "Content-Type: application/json" \
    --data '{
      "description": "My custom rule with plain text response",
      "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") and cf.waf.score lt 20",
      "action": "block",
      "action_parameters": {
        "response": {
          "status_code": 403,
          "content": "Your request was blocked.",
          "content_type": "text/plain"
        }
      }
      }'
    

使用 API 更新自訂規則

按照以下步驟使用 API 更新現有的自訂規則:

  1. 使用正確的變數設定 API 環境。

  2. 將下列值儲存在變數中,以便在 API 指令中使用:

    CRN:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。

    ZONE_ID:網域 ID。

    RULESET_ID:自訂規則入口點規則集的 ID。

    RULE_ID:要修改的自訂規則 ID。

  3. 啟動所有變數後,更新自訂規則:

curl -X PATCH "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
   "enabled": false,
   "description": "block GB and FR or based on IP Reputation (temporarily disabled)"
}'

使用 API 刪除自訂規則

按照以下步驟,使用 API 刪除現有的自訂規則:

  1. 使用正確的變數設定 API 環境。

  2. 將下列值儲存在變數中,以便在 API 指令中使用:

    CRN:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。

    ZONE_ID:網域 ID。

    RULESET_ID:自訂規則入口點規則集的 ID。

    RULE_ID:要修改的自訂規則 ID。

  3. 啟動所有變數後,刪除自訂規則:

curl -X DELETE "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json"

使用 Terraform 處理 WAF 自訂規則

使用 Terraform 建立自訂規則

以下範例使用 Terraform 建立自訂規則:

首先,取得階段的入口點規則集 ID http_request_firewall_custom

 data "ibm_cis_ruleset_entrypoint_versions" "test"{
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    phase = "http_request_firewall_custom"
   }

然後,建立自訂規則:

   resource ibm_cis_ruleset_rule "config" {
      cis_id    = ibm_cis.instance.id
      domain_id = data.ibm_cis_domain.cis_domain.domain_id
      ruleset_id = "data.ibm_cis_ruleset_entrypoint_versions.ruleset_id"
      rule {
        action =  "block"
        description = "var.description"
        expression = "true"
        enabled = "false"
        action_parameters {
          response {
            status_code = var.status_code
            content =  var.content
            content_type = "text/plain"
          }
        }
        position {
          index = var.index
          after = <id of any existing rule>
          before = <id of any existing rule>
        }
      }
    }

有關參數和屬性的詳細資訊,請參閱 ibm_cis_ruleset_rule 中的 Terraform 註冊表。

您可以使用 Terraform 更新自訂規則,方法是修改前面用於建立自訂規則的範例,並執行 terraform apply 指令。 若要刪除規則,只需移除設定,然後執行 terraform apply