使用 WAF 自訂規則
WAF 自訂規則透過鎖定 HTTP 流量,並套用自訂條件來封鎖、驗證、記錄或允許特定請求,從而提供強大的功能與靈活性。
您可以建立多種類型的 WAF 自訂規則。 不過,網站上的作用中規則數目受限於客戶方案。 如需有關應享福利的詳細資訊,請參閱 比較 CIS 計劃。
每個方案的作用中規則數目固定。 目前,您無法購買更多的活動規則。
在開始之前,最好先檢閱 Using 欄位、函式和表達式。
您可以透過控制台、命令列介面、API 或 Terraform 來建立、更新及刪除自訂規則。
在主控台中建立自訂規則
按照以下步驟在主控台中建立自訂規則:
WAF 自訂規則可使用現有的防火牆規則頁來設定。 之前在您的網域上建立的任何傳統防火牆規則,都會自動轉換為 WAF 自訂規則。
-
在 CIS 主控台中,導覽到安全性。
-
選取「自訂規則」索引標籤,然後按一下「建立」。
-
輸入選用的描述。
-
必要的話,選擇性地輸入優先順序。 優先順序為 0 時為空優先順序,最後評估。
-
使用送入要求區段中的使用者介面建置器來新增條件。 若要建置具有多個條件的表示式,請按一下下列任一項:
- 以及- 評估使用_和_邏輯的條件
- 或者 ——用於評估條件,或是由先前_以「and」連接的_條件所組成的群組,且這些條件使用 「or」 邏輯運算
建置條件時,可以看到「表示式預覽」以純文字顯示表示式。
在「表示式預覽」中,您可以按一下以手動編輯表示式,而不使用「視覺化表示式建置器」,或是切換使用這兩者。 然而,視手動建立的表達式複雜程度而定,「視覺化表達式建構器」可能無法將其呈現。
-
從回應清單功能表中選取一個動作。
-
若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
- 儲存為草稿 以儲存您的規則,但保持其停用狀態。
- 儲存並部署 以儲存您的規則並啟用它。
在主控台中更新自訂規則
按照以下步驟更新主控台中的現有自訂規則:
- 在 CIS 主控台中,導覽到安全性。
- 選取「自訂規則」索引標籤。
- 在「自訂規則」表格中,找到您要修改的規則,然後點擊該列右側的「動作」選單。
- 選取編輯。
- 對規則進行變更。
- 若要儲存規則,請選擇最適當的選項,方法是按一下下列任一者:
- 儲存為草稿 以儲存您的規則,但保持其停用狀態。
- 儲存並部署 以儲存您的規則並啟用它。
若要暫停或啟用現有規則清單中的任何規則,請點擊「已啟用」切換鈕。
在主控台中刪除自訂規則
按照以下步驟刪除主控台中的現有自訂規則:
- 在 CIS 主控台中,導覽到安全性。
- 在「自訂規則」表格中,找到要刪除的規則,然後點擊該列右側的「動作」選單。
- 從動作選單中選擇「刪除」。
- 按一下刪除 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]您也可以直接提供 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 資料中的必填欄位是
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: 為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 資料中的必填欄位是
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: 為「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 自訂規則階段的入口點規則集。
按照以下步驟取得自訂規則入口點規則集:
- 使用正確的變數設定 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 建立自訂規則
若要建立自訂規則,您必須先建立入口點,然後再建立自訂規則。 若要這樣做,請遵循下列步驟:
-
若要建立入口點規則集,請執行下列指令:
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 ] } } -
若要建立自訂規則,請執行以下指令:
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。