使用 WAF 自訂規則

WAF 自訂規則透過鎖定 HTTP 流量,並套用自訂條件來封鎖、驗證、記錄或允許特定請求,從而提供強大的功能與靈活性。

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

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

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

您可以透過控制台、命令列介面、API 或 Terraform 來建立、更新及刪除自訂規則。

在主控台中建立自訂規則

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

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

  1. 在 CIS 主控台中,導覽到安全性

  2. 選取「自訂規則」索引標籤,然後按一下「建立」。

  3. 輸入選用的描述。

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

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

    • 以及- 評估使用_和_邏輯的條件
    • 或者 ——用於評估條件,或是由先前_以「and」連接的_條件所組成的群組,且這些條件使用 「or」 邏輯運算

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

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

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

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

    • 儲存為草稿 以儲存您的規則,但保持其停用狀態。
    • 儲存並部署 以儲存您的規則並啟用它。

在主控台中更新自訂規則

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

  1. 在 CIS 主控台中,導覽到安全性
  2. 選取「自訂規則」索引標籤。
  3. 在「自訂規則」表格中,找到您要修改的規則,然後點擊該列右側的「動作」選單。
  4. 選取編輯
  5. 對規則進行變更。
  6. 若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
    • 儲存為草稿 以儲存您的規則,但保持其停用狀態。
    • 儲存並部署 以儲存您的規則並啟用它。

若要暫停或啟用現有規則清單中的任何規則,請點擊「已啟用」切換鈕。

在主控台中刪除自訂規則

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

  1. 在 CIS 主控台中,導覽到安全性
  2. 在「自訂規則」表格中,找到要刪除的規則,然後點擊該列右側的「動作」選單。
  3. 從動作選單中選擇「刪除」。
  4. 按一下刪除 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]
    

    您也可以直接提供 JSON 檔案或 JSON 字串來建立自訂規則:

    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"。 對於「封鎖」和「跳過」動作,請改用 JSON 檔案或 JSON 字串。

--enabled

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

--description

該規則的簡要說明。

--json

用於描述自訂規則的 JSON 檔案或 JSON 字串。

  • JSON 資料中的必填欄位是 expressionaction

    • expression: 指定規則必須符合的條件,才能觸發該規則。
    • action: 待執行的規則動作。 有效值為 block, challenge, js_challenge, managed_challenge, log,及 skip
  • 可選欄位是 description, enabled, logging,和 action_parameters

    • action_parameters: 規則動作的參數。
    • ruleset 跳過所有剩餘的規則或一個或多個 WAF 管理的規則集。 有效值為 current
    • phases: 跳過 WAF 元件對應的請求。 有效值為 http_ratelimit, http_request_firewall_managed,和 http_request_sbfm
    • products:跳過特定安全產品的匹配請求。 有效值為 waf, rateLimit, securityLevel, hot, bic, uaBlock,和 zoneLockdown
    • response: 為 block 動作定義自訂回應。
      • status_code: 請為回應選擇一個位於 400-499 區間內的 HTTP 狀態碼。
      • content_type:自訂回應的內容類型。 有效的回應類型為:text/html, text/plain, application/json, text/xml
      • content: 回應正文。
    • description:簡述規則。
    • enabled: 表示該規則是否處於啟用狀態。 停用此欄位後,匹配的請求不會出現在防火牆請求中。
    • logging: 記錄符合跳過規則的請求。 此欄位只適用於「跳過」動作。

範例 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 更新自訂規則

執行以下命令以從命令列介面更新自訂規則:

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

您也可以直接提供 JSON 檔案或 JSON 字串來更新自訂規則:

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 資料中的必填欄位是 expressionaction

    • expression: 指定規則必須符合的條件,才能觸發該規則。
    • action: 待執行的規則動作。 有效值為 block, challenge, js_challenge, managed_challenge, log,及 skip
  • 可選欄位是 description, enabled, logging,和 action_parameters

    • action_parameters: 規則動作的參數。
      • ruleset 跳過所有剩餘的規則或一個或多個 WAF 管理的規則集。 有效值是 current
      • phases: 跳過 WAF 元件對應的請求。 有效值為 http_ratelimit, http_request_firewall_managed,和 http_request_sbfm
      • products:跳過特定安全產品的匹配請求。 有效值為 waf, rateLimit, securityLevel, hot, bic, uaBlock,和 zoneLockdown
      • response: 為「block」動作定義自訂回應。
        • status_code: 請為回應選擇一個位於 400-499 區間內的 HTTP 狀態碼。
        • content_type:自訂回應的內容類型。 有效的回應類型為 text/html, text/plain, application/json,及 text/xml
        • content: 回應正文。
    • description:簡述規則。
    • enabled: 表示該規則是否處於啟用狀態。 停用此欄位後,匹配的請求不會出現在防火牆請求中。
    • logging: 記錄符合跳過規則的請求。 此欄位只適用於「跳過」動作。

範例 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 刪除自訂規則

執行以下命令,從命令列介面刪除自訂規則:

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 的自訂規則入口點

所有自訂規則 API 作業都需要 RULESET_ID 自訂規則階段的入口點規則集。

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

  1. 使用正確的變數設定 API 環境。
  2. 將下列值儲存在變數中,以便在 API 指令中使用:

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

ZONE_ID: 網域 ID。

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

    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。

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

    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。

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

    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。

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

    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 建立自訂規則

若要建立自訂規則,您必須先建立入口點,然後再建立自訂規則。 若要這樣做,請遵循下列步驟:

  1. 若要建立入口點規則集,請執行下列指令:

    resource "ibm_cis_ruleset_entrypoint_version" "test" {
        cis_id    = "<cis-id>"
        domain_id = "<domain-id>"
        phase = "http_request_firewall_custom"
        rulesets {
          description = "Entry point ruleset for custom ruleset"
        }
        lifecycle {
          ignore_changes = [
            rulesets
          ]
      }
    }
    
  2. 若要建立自訂規則,請執行以下指令:

       resource ibm_cis_ruleset_rule "config" {
          cis_id    = ibm_cis.instance.id
          domain_id = data.ibm_cis_domain.cis_domain.domain_id
          ruleset_id = resource.ibm_cis_ruleset_entrypoint_version.rulesets[0].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>
            }
          }
        }
    

以下範例說明如何建立入口點和 WAF 自訂規則:

resource ibm_cis_ruleset_entrypoint_version test {
cis_id    = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
rulesets {
   description = "Entrypoint ruleset for custom ruleset"
   }
   lifecycle {
   ignore_changes = [
      rulesets
   ]
  }
}
data ibm_cis_ruleset_entrypoint_versions custom_rule_ep {
  cis_id    = ibm_cis.instance.id
  domain_id = data.ibm_cis_domain.cis_domain.domain_id
  phase = "http_request_firewall_custom"
  depends_on = [
  ibm_cis_ruleset_entrypoint_version.test
  ]
}
resource ibm_cis_ruleset_rule "custom_rule1" {
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
      rule {
        action =  "skip"
        description = "adding custom rule via terraform"
        expression = "true"
        enabled = "true"
        action_parameters{
          ruleset = "current"
          phases = ["http_ratelimit", "http_request_sbfm","http_request_firewall_managed"]
          products = ["zoneLockdown","uaBlock", "bic", "hot", "securityLevel", "rateLimit","waf"]
        }
      }
}
resource ibm_cis_ruleset_rule "custom_rule2" {
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
      rule {
        action =  "block"
        description = "adding custom rule via terraform2"
        expression = "(http.request.uri.path eq \"/path1\")"
        enabled = "false"
      }
}

如需詳細資訊,請參閱 ibm_cis_ruleset_rule 中的 Terraform 註冊表。

您可以透過修改前述範例並執行 terraform apply 指令,使用 Terraform 更新自訂規則。 若要刪除規則,只需移除設定,然後執行 terraform apply