Trabajar con reglas personalizadas WAF
Las reglas personalizadas de WAF ofrecen potencia y flexibilidad al dirigirse al tráfico de HTTP y aplicar criterios personalizados para bloquear, cuestionar, registrar o permitir determinadas solicitudes.
Puede crear muchos tipos de reglas personalizadas WAF. Sin embargo, el número de reglas activas en el sitio viene limitado por el plan de cliente. Consulte Comparación de planes de CIS para obtener más información sobre los derechos.
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 interfaz de usuario, la CLI, la API o Terraform.
Trabajar con reglas personalizadas WAF en la consola
Crear una regla personalizada en la consola
Siga estos pasos para crear una regla personalizada en la consola:
Las reglas personalizadas de WAF se configuran utilizando la página de reglas de Firewall existente. Cualquier regla de firewall heredada que se haya creado previamente en su dominio se convierte automáticamente en reglas personalizadas de WAF.
-
Vaya a Seguridad > Reglas de cortafuegos.
-
Pulse Crear.
-
Introduzca una descripción opcional.
-
Opcionalmente, especifique una prioridad, si es necesario. Una prioridad cero es 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- para evaluar condiciones o grupos de condiciones previamente definidas que utilizan o lógica
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:
- Guardar como borrador para guardar la regla, pero dejándola inhabilitada.
- 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:
- Vaya a Seguridad > Reglas de cortafuegos.
- En la tabla de reglas del cortafuegos, localice la regla que desea modificar y haga 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:
- Guardar como borrador para guardar la regla, pero dejándola inhabilitada.
- 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:
- Vaya a Seguridad > Reglas de cortafuegos.
- En la tabla de reglas del cortafuegos, localice la regla que desea modificar y haga clic en el menú Acciones situado a la derecha de la fila.
- Seleccione Suprimir.
- Confirme la supresión de la regla.
Trabajar con reglas personalizadas WAF desde la CLI
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.
-
Inicie sesión en su cuenta con la CLI. Una vez introducida la contraseña, el sistema le pedirá la cuenta y la región que desea utilizar:
ibmcloud login --sso
-
Ejecute 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]
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID ((--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Where:
`DNS_DOMAIN_ID`
: The ID of DNS domain.
`--match`
: Specifies the conditions that must be matched for the rule to run. For match value, reference documentation `https://cloud.ibm.com/docs/cis?topic=cis-fields-and-expressions`
`--action`
:The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". For "block" and "skip" actions, use JSON file or JSON string instead.
`--enabled`
: Indicates if the rule is active. Default is "false".
`--description`
: A brief description of the rule.
`--json`
: The JSON file or JSON string used to describe a custom rule.
- The required fields in JSON data are `expression`, `action`.
`expression`: Specifies the conditions that must be matched for the rule to run.
`action`: The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".
- The optional fields are `description`, `enabled`, `logging`, `action_parameters`.
`action_parameters`: The rule action parameters.
`ruleset`: Skip all remaining rules or one or more WAF managed rulesets. Valid value: `current`.
`phases`: Skips WAF components for matching requests. Valid values: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm".
`products`: Skips specific security products for matching requests. Valid values: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown".
`response`: Define a custom response for 'block' action.
`status_code`: Choose an HTTP status code for the response, in the range 400-499.
`content_type`: The content type of a custom response. Valid response types are :`text/html`,`text/plain`, `application/json`, `text/xml`.
`content`: The response body.
`description`: Briefly describes the rule.
`enabled`: Indicates if the rule is active.
`logging`: Log requests matching the skip rule. This field is only available for the "skip" action.
- `enabled`: When disabled, matched requests don't appear in firewall events.
Sample JSON data:
{
"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`
: Instance name or ID. If not set, the context instance specified by `ibmcloud cis instance-set INSTANCE` is used.
`--output`
: Specify output format, only `JSON` is supported.
### Updating a custom rule from the CLI {: #update-custom-rule-cli}
Run the following command to update a custom rule in the CLI:
```sh {: pre}
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]
Donde:
DNS_DOMAIN_ID
- El ID del dominio DNS.
RULE_ID
- El ID de la regla.
--match
- Especifica las condiciones que deben cumplirse para que se ejecute la regla. Para conocer el valor de coincidencia, consulte la documentación
https://cloud.ibm.com/docs/cis?topic=cis-fields-and-expressions
.
--action
:La acción de la regla a 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. Por defecto es "false".
--description
-
Breve descripción de la norma.
--json
-
El archivo JSON o la serie JSON utilizada para describir una regla personalizada.
-
Los campos obligatorios en los datos JSON son
expression
,action
.expression
: Especifica las condiciones que deben cumplirse para que se ejecute la regla.action
: Acción de regla que se debe realizar. Valores válidos: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". -
Los campos opcionales son
description
,enabled
,logging
,action_parameters
.action_parameters
: Los parámetros de acción de la regla.ruleset
: Omitir todas las reglas restantes o uno o varios conjuntos de reglas gestionados por WAF. Valores válidos:current
.phases
: Omite los componentes WAF para las solicitudes coincidentes. Valores válidos: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm".products
: Omite productos de seguridad específicos para las solicitudes de concordancia. Valores válidos: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown".response
: Definir una respuesta personalizada para la acción 'block'.status_code
: Elija un código de estado HTTP para la respuesta, en el 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.logging
: Solicitudes de registro que coinciden con la regla de omisión. Este campo sólo está disponible para la acción "saltar".enabled
: Cuando está desactivado, las solicitudes coincidentes no aparecen en los eventos del cortafuegos.
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 define, se utiliza la instancia de contexto especificada por
ibmcloud cis instance-set INSTANCE
. --output
-
Especifique el formato de salida, sólo se admite
JSON
.
Eliminación de una regla personalizada desde la CLI
Ejecute el siguiente comando para eliminar una regla personalizada en la CLI:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Donde:
DNS_DOMAIN_ID
- El ID del dominio DNS.
RULE_ID
- El ID de la regla personalizada.
-i, --instance
- Nombre o ID de instancia. Si no se define, se utiliza la instancia de contexto especificada por
ibmcloud cis instance-set INSTANCE
. -f, --force
- Intentar suprimir una regla personalizada sin pedir confirmación.
--output
- Especifique el formato de salida, sólo 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
Trabajar con reglas personalizadas WAF con la API
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. Este conjunto de reglas de punto de entrada puede existir ya o
debe crearse si no existe.
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 aparecerá 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 con 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 iniciadas todas las variables, cree 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. -
Cuando se hayan iniciado todas las variables, actualice 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 iniciado todas las variables, elimine 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"
Trabajar con reglas personalizadas WAF con Terraform
Creación de una regla personalizada con Terraform
El siguiente ejemplo crea una regla personalizada utilizando Terraform:
# First get the entrypoint ruleset ID for the phase `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"
}
# To create a custom rule:
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>
}
}
}
Para obtener más información sobre los argumentos y atributos, consulte ibm_cis_ruleset_rule
en el registro de Terraform.
Puede actualizar una regla personalizada con Terraform modificando el ejemplo anterior utilizado para crear la regla personalizada y ejecutando el comando terraform apply
. Para eliminar la regla, basta con eliminar la configuración
y ejecutar terraform apply
.