IBM Cloud Docs
Utilización de campos, funciones y expresiones

Utilización de campos, funciones y expresiones

Junto con las acciones, los campos y las expresiones son los componentes básicos de las reglas personalizadas de WAF. Estos dos elementos funcionan conjuntamente a la hora de definir los criterios que se utilizarán cuando se haga coincidir una regla personalizada.

Campos

Cuando CIS recibe una solicitud HTTP, se examina y se genera una tabla de campos con los que comparar. Esta tabla de campos existe mientras se está procesando la solicitud actual. Considérela una tabla que contiene las propiedades de solicitud que deben coincidir con las expresiones.

Cada valor de campo se puede obtener de distintos lugares, como por ejemplo:

  • Propiedades primitivas, obtenidas directamente del tráfico – por ejemplo, http.request.uri.path.
  • Valores derivados, resultantes de una transformación, composición u operación básica, por ejemplo hacer que el valor de http.request.uri.path esté todo en minúsculas y disponible como un campo de otro campo.
  • Valores de sistema, resultantes de una búsqueda, cálculo u otro proceso inteligente – por ejemplo, un cf.threat_score calculado dinámicamente por un proceso de aprendizaje automático que inspecciona los valores primitivos y derivados relacionados.

Campos disponibles

Campos disponibles
Nombre de campo Tipo Valor de ejemplo Notas
http.cookie Serie session=A12345;-background=light Toda una cookie como una serie
http.host Serie www.example.com El nombre de host utilizado en el URI de solicitud completo
http.referer Serie Cabecera del referenciador HTTP
http.request.full_uri Serie https://www.example.com/articles/index?section=539061&expand=comments El URI completo recibido por el servidor web (no incluye #fragment, que no se envía a los servidores web)
http.request.method Serie POST El método HTTP, en mayúsculas
http.request.uri Serie /articles/index?section=539061&expand=comments El URI absoluto de la solicitud
http.request.uri.path Serie /articles/index La vía de acceso de la solicitud
http.request.uri.query Serie section=539061&expand=comments La cadena de consulta completa, menos el prefijo de delimitación "?"
http.user_agent Serie Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/65.0.3325.181 Safari/537.36 El agente de usuario HTTP completo
http.x_forwarded_for Serie La cabecera completa X-Forwarded-For HTTP
ip.src Dirección IP 93.155.208.22 La dirección IP de TCP del cliente, que se puede ajustar para reflejar la IP de cliente real del cliente original, según corresponda (por ejemplo, utilizando cabeceras HTTP como X-Forwarded-For o X-Real-IP)
ip.geoip.asnum Número 222 El número de Sistema autónomo (AS)
ip.geoip.country Serie GB El código de país de 2 letras
ssl Boolean true Indica si la conexión HTTP con el cliente es cifrada

Estos campos estándar siguen el convenio de denominación de la referencia de campo de pantalla de Wireshark. Sin embargo, pueden existir algunas variaciones sutiles en los valores de ejemplo anteriores.

Además de los campos estándar, también están disponibles los siguientes campos definidos por Cloudflare:

Campos disponibles de Cloudflare
Nombre de campo Tipo Valor de ejemplo Notas
cf.client.bot Boolean true Este campo indica si la solicitud viene de un bot o un rastreador conocido, independientemente de si la intención es buena o mala.
cf.threat_score Número Un valor de 0 a 100 Este campo representa una puntuación de riesgo, 0 indica bajo riesgo según determina Cloudflare. Los valores superiores a 10 pueden representar emisores de spam o bots, y los valores superiores a 40 apuntan a malhechores en internet. Es raro ver valores por encima de 60, así que ajuste sus reglas personalizadas WAF para desafiar a los que están por encima de 10, y para bloquear a los que están por encima de 50.

Funciones

El lenguaje de reglas personalizadas dispone de varias funciones para convertir campos.

Actualmente no están soportados en el Expression Builder.

Funciones de reglas personalizadas
Nombre de función Tipos de argumentos Tipo de retorno Ejemplo de uso Notas
lower Serie Serie lower(http.host) == "www.example.com" Convierte un campo de serie a minúsculas. Sólo se convierten los bytes ASCII que están en mayúscula, los demás se dejan tal como están.
upper Serie Serie upper(http.host) == "www.example.com" Convierte un campo de serie a mayúsculas. Sólo se convierten los bytes ASCII que están en minúscula, los demás se dejan tal como están.

Expresiones

Una expresión devuelve true o false según si hay o no una coincidencia con el tráfico de entrada. Por ejemplo:

http.host eq "www.example.com" and ip.src in 92.182.212.0/24

En este ejemplo, dos expresiones individuales conforman una expresión compuesta. Se debe considerar cada una de las expresiones simples como una condición. Cada condición se evalúa individualmente antes de aplicarle la lógica para determinar el resultado final de la expresión compuesta.

Si observamos la primera expresión individual, podemos ver que contiene:

  • un campo - http.host
  • un operador de comparación - eq
  • un valor - "www.example.com"

No todas las condiciones tienen la misma estructura. En la sección siguiente se describen ejemplos adicionales que utilizan estructuras diferentes.

Operadores de comparación

Hay los operadores de comparación siguientes disponibles para utilizar en expresiones:

Operadores de comparación para expresiones
Inglés Tipo C Descripción
eq == Igual
ne != No igual a
lt < Menor que
le <= Igual o menor que
gt
Mayor que
ge

=

Igual o mayor que
contiene Contiene exactamente
matches ~ expresión regular inspirada en Re2
in El valor aparece en un conjunto de valores. Admite rangos utilizando la notación "..".
not ! Ver comparación booleana
bitwise_and & Comparar valor de campo de bit

Actualmente, el Constructor de expresiones sólo admite operadores ingleses.

Una expresión puede contener una mezcla de operadores ingleses y de tipo C. Por ejemplo, ip.src eq 93.184.216.34 es equivalente a ip.src == 93.184.216.34.

Ciertos operadores de comparación se aplican a campos específicos según su tipo. La matriz siguiente proporciona ejemplos de los operadores que están disponibles para los distintos tipos de campos:

Operadores de comparación para campos
Inglés Tipo C Serie Dirección IP Número
eq == http.request.uri.path eq "/articles/2008/" ip.src eq 93.184.216.0 cf.threat_score eq 10
ne != http.request.uri.path ne "/articles/2010/" ip.src ne 93.184.216.0 cf.threat_score ne 60
lt < http.request.uri.path lt "/articles/2009/" cf.threat_score lt 10
le <= http.request.uri.path le "/articles/2008/" cf.threat_score le 20
gt
http.request.uri.path gt "/articles/2006/" cf.threat_score gt 25
ge

=

Igual o mayor que cf.threat_score ge 60
contiene http.request.uri.path contains "/articles/"
matches ~ http.request.uri.path ~ " [^/artículos/2007-8/$] "
in http.request.method in { "HEAD" "GET" } ip.src in { 93.184.216.0 93.184.216.1 } cf.threat_score in {0 2 10}

La evaluación de expresiones que utilizan valores de serie distingue entre mayúsculas y minúsculas. Por ello, una regla personalizada puede requerir que defina más de una condición de prueba. Los clientes de empresa pueden utilizar una expresión regular con el operador 'matches' para capturar varias variaciones con una sola expresión.

Comparación booleana

Para los campos de tipo booleano (por ejemplo, ssl), el campo aparece por sí solo en la expresión al evaluar una condición de tipo true. Para una condición de tipo false, se aplica el operador not.

Comparación booleana
No
ssl not ssl

Expresiones compuestas

Puede crear expresiones compuestas agrupando dos o más expresiones individuales que utilicen operadores lógicos.

Expresiones compuestas
Inglés Tipo C Descripción Ejemplo Prioridad
not ! NOT lógico not ( http.host eq "www.example.com" and ip.src in 93.184.216.0/24 ) 1
y && AND lógico http.host eq "www.example.com" and ip.src in 93.184.216.0/24 2
xor ^^ XOR lógico http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 3
o || OR lógico http.host eq "www.example.com" or ip.src in 93.184.216.0/24 4

Para cambiar el orden de prioridad, puede agrupar expresiones mediante paréntesis. Si no se utilizan paréntesis, las expresiones se agrupan implícitamente según la prioridad estándar:

ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth

Aplicando una agrupación explícita:

(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth

Dando prioridad a or con paréntesis:

ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)

Tenga en cuenta que aunque not se utiliza para agrupar, se puede utilizar para negar una única comparación. Por ejemplo, not ip.src eq 93.184.216.0 es equivalente a not (ip.src eq 93.184.216.0).

Por último, también puede negar las expresiones agrupadas:

not (http.request.method eq "POST" and http.request.uri.path eq "/login")

Desviaciones de los filtros de visualización de Wireshark

Las expresiones de reglas personalizadas se inspiran en los filtros de visualización de Wireshark. Sin embargo, la implementación es distinta en lo siguiente:

  • En las pruebas de igualdad de IP de CIDR, Wireshark permite rangos con el formato ip.src == 1.2.3.0/24, mientras que CIS sólo admite pruebas de igualdad utilizando una única dirección IP. Para comparar un CIDR, utilice el operador in; por ejemplo, ip.src in {1.2.3.0/24}.
  • En Wireshark, ssl es un campo de protocolo que contiene cientos de otros campos de diversos tipos que están disponibles para comparar de distintas formas. Sin embargo, en las reglas personalizadas, ssl es un único campo booleano que se utiliza para determinar si la conexión del cliente a CIS está cifrada.
  • El operador slice no está admitido.
  • No se admiten todas las funciones. Actualmente, len() y count() no reciben soporte.