Utilización de campos, funciones y expresiones
Junto con las acciones, los campos y las expresiones son los elementos básicos de las reglas personalizadas de WAF. Estos elementos trabajan juntos para definir los criterios de coincidencia de una regla personalizada.
Campos
Cuando CIS recibe una solicitud HTTP, la analiza y crea una tabla de campos para su cotejo. Esta tabla de campos sólo existe mientras se procesa la solicitud y contiene las propiedades de la solicitud utilizadas para la correspondencia de 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.pathesté 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_scorecalculado dinámicamente por un proceso de aprendizaje automático que inspecciona los valores primitivos y derivados relacionados.
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 la URI completa de la solicitud |
| http.referer | Serie | Cabecera del referenciador HTTP | El HTTP encabezado request Referer, que contiene la dirección de la página web que enlaza con la página solicitada actualmente. |
| http.request.body.raw | Serie | El cuerpo de la solicitud HTTP sin modificaciones. | |
| 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 del cliente TCP, que puede ajustarse para reflejar la dirección IP real del cliente original según corresponda (por ejemplo, utilizando encabezados de HTTP como X-Forwarded-For o X-Real-IP) |
| ip.src.region | Serie | Texas | La región de geolocalización asociada a la dirección IP de la solicitud entrante. |
| 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 |
| ip.src.subdivision_1_iso_code | Serie | GB-ENG | El código ISO 3166-2 código de la región de primer nivel asociada a la dirección IP. Cuando el valor real no está disponible, este campo
contiene una cadena vacía. Para utilizar este campo, se requiere un plan CIS Enterprise. |
| ip.src.subdivision_2_iso_code | Serie | GB-SWK | El código ISO 3166-2 código de la región de segundo nivel asociada a la dirección IP. Cuando el valor real no está disponible, este
campo contiene una cadena vacía. Para utilizar este campo, se requiere un plan CIS Enterprise. |
| ip.src.is_in_european_union | Boolean | Para más información, consulte ip.src.is_in_european_union. |
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:
| Nombre de campo | Tipo | Valor de ejemplo | Notas |
|---|---|---|---|
| cf.client.bot | Boolean | true | tanto si la solicitud procede de un bot o un rastreador conocido, independientemente de que la intención sea buena o mala. |
| cf.threat_score | Número | 0 | Este campo indica una puntuación de amenaza de Cloudflare. Anteriormente, una puntuación de amenaza representaba una puntuación de amenaza de Cloudflare de 0-100, donde 0 indicaba un riesgo bajo. Ahora, la puntuación de la amenaza es siempre 0 (cero). |
| cf.waf.score | Número | 1-99 | Puntuación basada en aprendizaje automático que estima la probabilidad de que una solicitud sea maliciosa. Las puntuaciones van de 1 (muy probablemente malicioso) a 99 (muy probablemente seguro). Las puntuaciones bajas indican un mayor riesgo. Útil para crear reglas de cortafuegos basadas en umbrales. |
| cf.ray_id | Serie | Es un identificador que se da a cada solicitud que pasa por Cloudflare. | |
| cf.edge.server_ip | Dirección IP | Este campo indica la dirección IP de la red global a la que se ha resuelto la solicitud HTTP. Este campo sólo es significativo para los clientes BYOIP. | |
| cf.edge.server_port | Dirección IP | 1-65535 | Este campo indica el número de puerto en el que la red global de Cloudflare recibió la solicitud. Utilice este campo para filtrar el tráfico en un puerto específico. |
| cf.tls_cipher | Serie | AES128-SHA256 | El cifrado para la conexión a Cloudflare. |
| cf.tls_version | Serie | TLSv1.2 | La versión TLS de la conexión a Cloudflare. |
ip.src.is_in_european_union
La solicitud procede de un país de la Unión Europea (UE) y requiere un plan CIS Enterprise.
En el siguiente cuadro se enumeran los países de la UE a partir de los datos de geolocalización:
| Código de país | Nombre de país |
|---|---|
AT |
Austria |
AX |
Islas Åland |
BE |
Bélgica |
BG |
Bulgaria |
CY |
Chipre |
CZ |
República Checa |
GE |
Alemania |
DK |
Dinamarca |
EE |
Estonia |
ES |
España |
FI |
Finlandia |
FR |
Francia |
GF |
GuineaFrancesa |
GP |
Guadalupe |
GR |
Grecia |
HR |
Croacia |
HU |
Hungría |
IE |
Irlanda |
IT |
Italia |
LT |
Lituania |
LU |
Luxemburgo |
LV |
Letonia |
MF |
San Martín |
MQ |
Martinica |
MT |
Malta |
NL |
Países Bajos |
PL |
Polonia |
PT |
Portugal |
RE |
Reunión |
RO |
Rumanía |
SE |
Suecia |
SI |
Eslovenia |
SK |
Eslovaquia |
YT |
Mayotte |
Campos de gestión de bots
Bot Management for Enterprise es un complemento de pago que proporciona una sofisticada protección contra bots para tu dominio. Los clientes pueden identificar el tráfico automatizado, tomar las medidas oportunas y consultar análisis detallados en la consola.
La siguiente tabla proporciona información sobre los campos bot disponibles:
| Nombre de campo | Tipo | Notas |
|---|---|---|
cf.client.bot |
Boolean | 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.bot_management.verified_bot |
Boolean | Indica si la solicitud procede de un bot o crawler conocido y proporciona la misma información que cf.client.bot. Este campo está disponible con el plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.corporate_proxy |
Boolean | Este campo indica si la solicitud entrante procede de un proxy corporativo basado en la nube o de una puerta de enlace web segura identificados como Enterprise-only. Este campo está disponible con el plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.detection_ids |
Número | Este campo enumera los ID de las detecciones heurísticas de Bot Management en una solicitud. Utilice este campo para hacer coincidir o excluir heurísticas específicas en una regla. Una solicitud puede tener varias detecciones. |
cf.bot_management.ja3_hash |
Serie | Este campo proporciona una huella digital de SSL / TLS para ayudarle a identificar posibles solicitudes de bots. Para más información, consulte JA3/JA4 Fingerprint. Para utilizar este campo, se requiere un plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.ja4 |
Serie | Este campo proporciona una huella digital de SSL / TLS para ayudarle a identificar posibles solicitudes de bots. Para más información, consulte JA3/JA4 Fingerprint. Para utilizar este campo, se requiere un plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.js_detection.passed |
Boolean | Indica si el visitante ha pasado previamente una Detección JS. Para más información, consulte JavaScript detections. Para utilizar este campo, se requiere un plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.score |
Número | Este campo representa la probabilidad de que una solicitud proceda de un bot mediante una puntuación de 1-99. Una puntuación baja indica que la solicitud procede de un bot o de un agente automatizado. Una puntuación alta indica que un humano emitió la solicitud. Para utilizar este campo, se requiere un plan CIS Enterprise con la gestión de Bot activada. |
cf.bot_management.static_resource |
Número | Indica si se deben incluir recursos estáticos al crear una regla mediante cf.bot_management.score. Para utilizar este campo, se requiere un plan CIS Enterprise con la gestión de Bot activada. |
cf.verified_bot_category |
Serie | Este campo proporciona el tipo y el propósito de un bot verificado. Para más información, consulte Categorías de robots verificados. |
Funciones
El lenguaje de reglas personalizadas cuenta con varias funciones para convertir campos.
Actualmente, el Expression Builder no admite estos elementos.
| 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:
| 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:
| 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 ~ "^/articles/200 [7-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, es posible que una regla personalizada te obligue a definir 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.
| Sí | No |
|---|---|
| ssl | not ssl |
Expresiones compuestas
Puede crear expresiones compuestas agrupando dos o más expresiones individuales que utilicen operadores lógicos.
| 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 operadorin; por ejemplo,ip.src in {1.2.3.0/24}. - En Wireshark,
ssles 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,ssles un único campo booleano que se utiliza para determinar si la conexión del cliente a CIS está cifrada. - El operador
sliceno está admitido. - No se admiten todas las funciones. Actualmente,
len()ycount()no reciben soporte.
Limitaciones de expresión
Las siguientes restricciones se aplican a las expresiones de reglas:
-
Una expresión de regla puede contener hasta 4.096 caracteres.
Si utilizas el generador de expresiones de la interfaz de usuario, se aplica el mismo límite a la vista previa de la expresión generada.
-
Una expresión de regla puede contener un máximo de 64 expresiones regulares (regex).