使用 WAF 自訂規則
WAF 自訂規則可針對 HTTP 流量提供強大的靈活性,並應用自訂條件來攔截、挑戰、記錄或允許特定要求。
您可以建立多種類型的 WAF 自訂規則。 不過,網站上的作用中規則數目受限於客戶方案。 請參閱 比較 CIS 計劃,以瞭解更多有關權利的資訊。
每個方案的作用中規則數目固定。 目前,您無法購買更多的活動規則。
在開始之前,最好先檢閱 Using 欄位、函式和表達式。
您可以使用 UI、CLI、API 或 Terraform 建立、更新和刪除自訂規則。
在主控台中使用 WAF 自訂規則
在主控台中建立自訂規則
按照以下步驟在主控台中建立自訂規則:
WAF 自訂規則可使用現有的防火牆規則頁來設定。 之前在您的網域上建立的任何傳統防火牆規則,都會自動轉換為 WAF 自訂規則。
-
導覽至安全 > 防火牆規則。
-
按一下建立。
-
輸入選用的描述。
-
必要的話,選擇性地輸入優先順序。 優先順序為 0 時為空優先順序,最後評估。
-
使用送入要求區段中的使用者介面建置器來新增條件。 若要建置具有多個條件的表示式,請按一下下列任一項:
- 以及- 評估使用_和_邏輯的條件
- 或- 評估使用_或_邏輯的條件_或_先前的條件組
建置條件時,可以看到「表示式預覽」以純文字顯示表示式。
在「表示式預覽」中,您可以按一下以手動編輯表示式,而不使用「視覺化表示式建置器」,或是切換使用這兩者。 然而,視手動建構的表達式的複雜性而定,Visual Expression Builder 可能無法呈現它。
-
從回應清單功能表中選取一個動作。
-
若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
- 儲存為草稿以儲存您的規則,但將其停用。
- Save and deploy(儲存並部署 )可儲存您的規則並將其啟用。
在主控台中更新自訂規則
按照以下步驟更新主控台中的現有自訂規則:
- 導覽至安全 > 防火牆規則。
- 在防火牆規則表中,找到要修改的規則,然後按一下該行右側的動作功能表。
- 選取編輯。
- 對規則進行變更。
- 若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
- 儲存為草稿以儲存您的規則,但將其停用。
- Save and deploy(儲存並部署 )可儲存您的規則並將其啟用。
若要暫停或啟動現有規則清單中的任何規則,請按一下啟用切換鍵。
在主控台中刪除自訂規則
按照以下步驟刪除主控台中的現有自訂規則:
- 導覽至安全 > 防火牆規則。
- 在防火牆規則表中,找到要修改的規則,然後按一下該行右側的動作功能表。
- 選取刪除。
- 確認要執行規則刪除作業。
從 CLI 使用 WAF 自訂規則
從 CLI 建立自訂規則
若要從 CLI 建立自訂規則,請遵循下列步驟:
-
使用 CLI 登入您的帳戶。 輸入密碼後,系統會提示您要使用的帳號和區域:
ibmcloud login --sso
-
執行下列指令以建立自訂規則:
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 受管理規則集。 有效值:current
。phases
: 跳過相符要求的 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/xml
。content
:回應正文。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 受管理規則集。 有效值:current
。phases
: 跳過相符要求的 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/xml
。content
:回應正文。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
自訂規則階段的入口點規則集。 此入口點規則集可能已經存在,若不存在則需要建立。
按照以下步驟取得自訂規則入口點規則集:
-
使用正確的變數設定 API 環境。
-
將下列值儲存在變數中,以便在 API 指令中使用:
CRN
:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。ZONE_ID
:網域 ID。 -
當所有變數都啟動時,取得入口點規則集:
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 建立自訂規則:
-
使用正確的變數設定 API 環境。
-
將下列值儲存在變數中,以便在 API 指令中使用:
CRN
:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。ZONE_ID
:網域 ID。RULESET_ID
:自訂規則入口點規則集的 ID。 -
啟動所有變數後,建立自訂規則:
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 更新現有的自訂規則:
-
使用正確的變數設定 API 環境。
-
將下列值儲存在變數中,以便在 API 指令中使用:
CRN
:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。ZONE_ID
:網域 ID。RULESET_ID
:自訂規則入口點規則集的 ID。RULE_ID
:要修改的自訂規則 ID。 -
啟動所有變數後,更新自訂規則:
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 刪除現有的自訂規則:
-
使用正確的變數設定 API 環境。
-
將下列值儲存在變數中,以便在 API 指令中使用:
CRN
:服務實例的完整 URL 編碼雲端資源名稱 (CRN)。ZONE_ID
:網域 ID。RULESET_ID
:自訂規則入口點規則集的 ID。RULE_ID
:要修改的自訂規則 ID。 -
啟動所有變數後,刪除自訂規則:
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
。