Trabajar con reglas personalizadas WAF
Las reglas personalizadas de WAF ofrecen potencia y flexibilidad, ya que permiten seleccionar el tráfico HTTP y aplicar criterios personalizados para bloquear, solicitar verificación, registrar o permitir determinadas solicitudes.
Puedes crear muchos tipos de reglas personalizadas para el WAF. Sin embargo, el número de reglas activas en el sitio viene limitado por el plan de cliente. Para más información sobre los derechos, consulte Comparación de planes CIS.
El número de reglas activas por plan es fijo. Actualmente, no se pueden comprar más reglas activas.
Antes de empezar, es una buena idea revisar Uso de campos, funciones y expresiones.
Puede crear, actualizar y eliminar una regla personalizada mediante la consola, la CLI, la API o Terraform.
Crear una regla personalizada en la consola
Siga estos pasos para crear una regla personalizada en la consola:
Las reglas personalizadas WAF se configuran utilizando la página de reglas Firewall existentes. Cualquier regla de firewall heredada que se haya creado previamente en su dominio se convierte automáticamente en reglas personalizadas de WAF.
-
En la consola CIS, vaya a Seguridad.
-
Selecciona la pestaña « Reglas personalizadas » y, a continuación, haz clic en « Crear ».
-
Introduzca una descripción opcional.
-
Opcionalmente, especifique una prioridad, si es necesario. Una prioridad cero equivale a una prioridad nula y se evalúa en último lugar.
-
Utilice el constructor de IU en la sección Solicitudes entrantes para añadir una condición. Para crear una expresión con varias condiciones, pulse cualquiera en una de las dos opciones siguientes:
- Y- para evaluar las condiciones que utilizan y la lógica
- O bien, para evaluar condiciones o grupos de condiciones precedidas de «y» que utilicen la lógica «o »
Puede ver que a medida que se crea una condición, la vista previa muestra la expresión en texto sin formato.
En la vista previa de la expresión, puede pulsar para editar la expresión manualmente en lugar de utilizar el Constructor de expresiones visuales, o ir cambiando del uno al otro. Sin embargo, según la complejidad de una expresión construida manualmente, puede que Visual Expression Builder no sea capaz de representarla.
-
Seleccione una acción en el menú de la lista Respuesta.
-
Para guardar la regla, elija la opción más adecuada pulsando:
- Guarda como borrador para guardar tu regla, pero manténla desactivada.
- Guardar y desplegar para guardar la regla y activarla.
Actualización de una regla personalizada en la consola
Siga estos pasos para actualizar una regla personalizada existente en la consola:
- En la consola CIS, vaya a Seguridad.
- Selecciona la pestaña « Reglas personalizadas ».
- En la tabla «Reglas personalizadas», busca la regla que quieras modificar y, a continuación, haz clic en el menú «Acciones» situado a la derecha de la fila.
- Seleccione Editar.
- Realice los cambios que desee en la regla.
- Para guardar la regla, elija la opción más adecuada pulsando:
- Guarda como borrador para guardar tu regla, pero manténla desactivada.
- Guardar y desplegar para guardar la regla y activarla.
Para poner en pausa o activar cualquier regla de la lista de reglas existentes, pulse en el conmutador Habilitado.
Eliminar una regla personalizada en la consola
Siga estos pasos para eliminar una regla personalizada existente en la consola:
- En la consola CIS, vaya a Seguridad.
- En la tabla «Reglas personalizadas», busca la regla que deseas eliminar y haz clic en el menú «Acciones» situado a la derecha de la fila.
- Selecciona « Eliminar » en el menú de acciones.
- Haga clic en Eliminar regla personalizada WAF para eliminar la regla.
Creación de una regla personalizada desde la CLI
Para crear una regla personalizada desde la CLI, siga estos pasos:
-
Configure el entorno de la CLI.
-
Inicia sesión en tu cuenta desde la CLI. Una vez introducida la contraseña, el sistema te pedirá que selecciones la cuenta y la región que deseas utilizar:
ibmcloud login --sso -
Ejecuta el siguiente comando para crear una regla personalizada:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]También puede crear una regla personalizada proporcionando un archivo JSON o una cadena JSON directamente:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opciones de comando
DNS_DOMAIN_ID-
El ID del dominio DNS.
--match-
Especifica las condiciones que deben cumplirse para que se ejecute la regla. Para conocer el valor de coincidencia, consulte Utilización de campos, funciones y expresiones.
--action-
Acción de regla que se debe realizar. Valores válidos: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". Para las acciones «bloquear» y «saltar», utiliza en su lugar un archivo JSON o una cadena JSON.
--enabled-
Indica si la regla está activa. Por defecto es "false".
--description-
Una breve descripción de la norma.
--json-
El archivo JSON o la cadena JSON que se utiliza para describir una regla personalizada.
-
Los campos obligatorios en los datos JSON son «
expression» y «action».expression: Especifica las condiciones que deben cumplirse para que se aplique la regla.action: La acción que debe realizarse según la regla. Los valores válidos sonblock,challenge,js_challenge,managed_challenge,logyskip.
-
Los campos opcionales son
description,enabled,logging, yaction_parameters.action_parameters: Los parámetros de la acción de la regla.ruleset: Omite todas las reglas restantes o uno o más conjuntos de reglas gestionados por WAF. El valor válido es «current».phases: Omite los componentes del WAF para las solicitudes que coincidan. Los valores válidos sonhttp_ratelimit,http_request_firewall_managed, yhttp_request_sbfm.productsomite productos de seguridad específicos para las solicitudes de coincidencia. Los valores válidos sonwaf,rateLimit,securityLevel,hot,bic,uaBlockyzoneLockdown.response: Definir una respuesta personalizada para una acción de «block».status_code: Elige un código de estado « HTTP » para la respuesta dentro del rango «400-499».content_type: El tipo de contenido de una respuesta personalizada. Los tipos de respuesta válidos son :text/html,text/plain,application/json,text/xml.content: El cuerpo de la respuesta.
description: Describe brevemente la norma.enabled: Indica si la regla está activa o no. Cuando este campo está desactivado, las solicitudes coincidentes no aparecen en las solicitudes del cortafuegos.logging: Registrar las solicitudes que cumplan la regla de omisión. Este campo solo está disponible para la acción 'skip'.
-
Datos JSON de ejemplo:
{
"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- Nombre o ID de instancia. Si no se especifica, se utiliza la instancia de contexto indicada en «
ibmcloud cis instance-set INSTANCE». --output- Especifica el formato de salida; solo se admite «
JSON».
Actualización de una regla personalizada desde la CLI
Ejecute el siguiente comando para actualizar una regla personalizada desde la CLI:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
También puede actualizar una regla personalizada proporcionando un archivo JSON o una cadena JSON directamente:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opciones de comando
DNS_DOMAIN_ID-
El ID del dominio DNS.
RULE_ID-
El identificador de la regla.
--match-
Especifica las condiciones que deben cumplirse para que se ejecute la regla. Para conocer el valor de coincidencia, consulte Utilización de campos, funciones y expresiones.
--action-
Acción de regla que se debe realizar. Valores válidos: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".Para las acciones "block" y "skip", utilice en su lugar archivo JSON o cadena JSON.
--enabled-
Indica si la regla está activa. El valor predeterminado es "False".
--description-
Una breve descripción de la norma.
--json-
El archivo JSON o la cadena JSON que se utiliza para describir una regla personalizada.
-
Los campos obligatorios en los datos JSON son «
expression» y «action».expression: Especifica las condiciones que deben cumplirse para que se aplique la regla.action: La acción que debe realizarse según la regla. Los valores válidos sonblock,challenge,js_challenge,managed_challenge,logyskip.
-
Los campos opcionales son
description,enabled,logging, yaction_parameters.action_parameters: Los parámetros de la acción de la regla.ruleset: Omite todas las reglas restantes o uno o más conjuntos de reglas gestionados por WAF. El valor válido escurrentphases: Omite los componentes del WAF para las solicitudes que coincidan. Los valores válidos sonhttp_ratelimit,http_request_firewall_managed, yhttp_request_sbfm.productsomite productos de seguridad específicos para las solicitudes de coincidencia. Los valores válidos sonwaf,rateLimit,securityLevel,hot,bic,uaBlockyzoneLockdown.response: Define una respuesta personalizada para la acción «block».status_code: Elige un código de estado « HTTP » para la respuesta dentro del rango «400-499».content_type: El tipo de contenido de una respuesta personalizada. Los tipos de respuesta válidos sontext/html,text/plain,application/jsonytext/xml.content: El cuerpo de la respuesta.
description: Describe brevemente la norma.enabled: Indica si la regla está activa o no. Cuando este campo está desactivado, las solicitudes coincidentes no aparecen en las solicitudes del cortafuegos.logging: Registrar las solicitudes que cumplan la regla de omisión. Este campo solo está disponible para la acción 'skip'.
-
Datos JSON de ejemplo:
{
"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- Nombre o ID de instancia. Si no se especifica, se utiliza la instancia de contexto indicada en «
ibmcloud cis instance-set INSTANCE». --output- Especifica el formato de salida; solo se admite «
JSON».
Eliminación de una regla personalizada desde la CLI
Ejecute el siguiente comando para eliminar una regla personalizada desde la CLI:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Opciones de comando
DNS_DOMAIN_ID- El ID del dominio DNS.
RULE_ID- El identificador de la regla personalizada.
-i, --instance- Nombre o ID de instancia. Si no se especifica, se utiliza la instancia de contexto indicada en «
ibmcloud cis instance-set INSTANCE». -f, --force- Intentar eliminar una regla personalizada sin solicitar confirmación.
--output- Especifica el formato de salida; solo se admite «
JSON».
Ejemplos de mandato
- Para crear una regla personalizada:
ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"
- Para actualizar una regla personalizada:
ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true
- Para eliminar una regla personalizada:
ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27
Obtener el punto de entrada de la regla personalizada para la API
Todas las operaciones de la API de reglas personalizadas requieren un RULESET_ID del conjunto de reglas de punto de entrada para la fase de reglas personalizadas.
Siga estos pasos para obtener el conjunto de reglas del punto de entrada de reglas personalizadas:
- Configure el entorno de la API con las variables correctas.
- Almacene los valores siguientes en variables que se utilizarán en el mandato de la API:
CRN: El nombre completo del recurso en la nube (CRN) codificado en URL de la instancia de servicio.
ZONE_ID: el ID de dominio.
-
Cuando se inician todas las variables, obtener el conjunto de reglas de punto de entrada:
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"El ID del conjunto de reglas se encuentra en la respuesta de la solicitud correcta. Si la llamada anterior devuelve una respuesta 404 No encontrado, utilice la siguiente API para crear el conjunto de reglas de punto de entrada para la fase de reglas personalizadas:
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" }'
Creación de una regla personalizada mediante la API
Siga estos pasos para crear una regla personalizada con la API:
- Configure el entorno de la API con las variables correctas.
- Almacene los valores siguientes en variables que se utilizarán en el mandato de la API:
CRN: El nombre completo del recurso en la nube (CRN) codificado en URL de la instancia de servicio.
ZONE_ID: el ID de dominio.
RULESET_ID: El ID del conjunto de reglas del punto de entrada de la regla personalizada.
-
Una vez inicializadas todas las variables, crea la regla personalizada:
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" } } }'
Actualizar una regla personalizada con la API
Siga estos pasos para actualizar una regla personalizada existente con la API:
- Configure el entorno de la API con las variables correctas.
- Almacene los valores siguientes en variables que se utilizarán en el mandato de la API:
CRN: El nombre completo del recurso en la nube (CRN) codificado en URL de la instancia de servicio.
ZONE_ID: el ID de dominio.
RULESET_ID: El ID del conjunto de reglas del punto de entrada de la regla personalizada.
RULE_ID: El ID de la regla personalizada que se va a modificar.
-
Una vez inicializadas todas las variables, actualiza la regla personalizada:
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)" }'
Eliminar una regla personalizada con la API
Siga estos pasos para eliminar una regla personalizada existente con la API:
- Configure el entorno de la API con las variables correctas.
- Almacene los valores siguientes en variables que se utilizarán en el mandato de la API:
CRN: El nombre completo del recurso en la nube (CRN) codificado en URL de la instancia de servicio.
ZONE_ID: el ID de dominio.
RULESET_ID: El ID del conjunto de reglas del punto de entrada de la regla personalizada.
RULE_ID: El ID de la regla personalizada que se va a modificar.
-
Cuando se hayan inicializado todas las variables, elimina la regla personalizada:
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"
Creación de una regla personalizada con Terraform
Para crear una regla personalizada, primero debe crear un punto de entrada y, a continuación, crear la regla personalizada. Para hacerlo, siga estos pasos:
-
Para crear un conjunto de reglas de punto de entrada, ejecute el siguiente comando :
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 ] } } -
Para crear una regla personalizada, ejecuta el siguiente comando :
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> } } }
El siguiente ejemplo muestra cómo crear un punto de entrada y una regla personalizada 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"
}
}
Para obtener más información, consulte ibm_cis_ruleset_rule en el registro de Terraform.
Puede actualizar una regla personalizada con Terraform modificando el ejemplo anterior y ejecutando el comando terraform apply. Para eliminar la regla, basta con eliminar la configuración y ejecutar terraform apply.