Configurar atributos de idioma de reglas personalizadas

Cada regla de política de seguridad de Google Cloud Armor tiene una prioridad, una condición de coincidencia y una acción. Cloud Armor lleva a cabo la acción de la regla de mayor prioridad que coincida con una solicitud. Las reglas con una prioridad inferior a la de la regla coincidente de mayor prioridad no se evalúan, aunque tengan las mismas condiciones de coincidencia.

Cada regla de política de seguridad admite dos tipos de condiciones de coincidencia:

  • Una condición de coincidencia básica contiene listas de direcciones IP o listas de intervalos de direcciones IP. Las condiciones de coincidencia básicas se definen mediante la marca --src-ip-ranges al crear una regla con Google Cloud CLI.
  • Una condición de coincidencia avanzada contiene una expresión con hasta cinco subexpresiones que pueden coincidir con varios atributos de una solicitud entrante. Las condiciones de coincidencia avanzadas se definen mediante la marca --expression al crear una regla con Google Cloud CLI.

En esta página se describen las condiciones de coincidencia avanzadas y el lenguaje de reglas personalizadas de Cloud Armor que se usa para escribir expresiones en las condiciones de coincidencia avanzadas de las reglas de política de seguridad. El lenguaje de las reglas personalizadas de Cloud Armor es un subconjunto del lenguaje de expresión común (CEL). Las expresiones escritas en el lenguaje de reglas personalizadas de Cloud Armor requieren dos componentes:

  • El atributo: los datos que se van a inspeccionar
  • La operación: cómo usar los datos

Por ejemplo, la siguiente expresión usa los atributos origin.ip y 9.9.9.0/24 en la operación inIpRange(). En este caso, la expresión devuelve el valor true si origin.ip está dentro del intervalo de direcciones IP 9.9.9.0/24.

inIpRange(origin.ip, '9.9.9.0/24')

Aunque la expresión del ejemplo anterior solo coincide con la dirección IP de origen, si la usas en una regla de una política de seguridad de Cloud Armor, se considera una regla con condiciones de coincidencia avanzadas desde el punto de vista de la cuota. Para obtener más información, consulta las cuotas y los límites de Cloud Armor.

Operaciones

En la siguiente referencia se describen los operadores que puede usar con los atributos (representados por x, y y k) para definir expresiones de reglas.

Operaciones Expresiones Descripción
Equality x == y Devuelve true si x es igual a y.
Igualdad, literal de cadena x == "foo" Devuelve true si x es igual al literal de cadena constante proporcionado.
Igualdad, literal de cadena sin formato x == R"fo'o" Devuelve true si x es igual al literal de cadena sin formato que se ha proporcionado y que no interpreta secuencias de escape. Los literales de cadena sin formato son útiles para expresar cadenas que deben usar caracteres de secuencia de escape.
NOT lógico !x Devuelve true si el valor booleano x es falso o false si el valor booleano x es verdadero.
Desigualdad x != y Devuelve true si x no es igual a y.
Concatenación x + y Devuelve la cadena concatenada xy.
AND lógico x && y Devuelve true si tanto x como y son true.
OR lógico x || y Devuelve el valor true si x, y o ambos son verdaderos.
Contiene la subcadena x.contains(y) Devuelve true si la cadena x contiene la subcadena y.
Empieza por la subcadena x.startsWith(y) Devuelve true si la cadena x empieza por la subcadena y.
Termina con la subcadena x.endsWith(y) Devuelve true si la cadena x termina con la subcadena y.
Coincidencia de expresión regular x.matches(y) Devuelve true si la cadena x coincide parcialmente con el patrón y de RE2 especificado. El patrón RE2 se compila mediante la opción RE2::Latin1 que inhabilita las funciones Unicode.
Dirección IP dentro del intervalo inIpRange(x, y) Devuelve el valor "true" si la dirección IP x está incluida en el intervalo de IPs y.
Minúscula x.lower() Devuelve el valor en minúsculas de la cadena x.
Mayúsculas x.upper() Devuelve el valor en mayúsculas de la cadena x.
Valor decodificado en Base64 x.base64Decode() Devuelve el valor decodificado en base64 de x. Los caracteres _ - se sustituyen primero por / +, respectivamente. Devuelve "" (cadena vacía) si x no es un valor de base64 válido.
Valor de asignación de teclas m['k'] Devuelve el valor de la clave k en el mapa de cadenas m si k está disponible. De lo contrario, devuelve un error. Te recomendamos que primero compruebes la disponibilidad mediante "has(m['k'])==true".
Consultar la disponibilidad de las llaves en un mapa has(m['k']) Devuelve true si la clave k está disponible en el mapa m.
Convertir en entero int(x) Convierte el resultado de cadena de x en un tipo int. Después, se puede usar para hacer una comparación de números enteros mediante operadores aritméticos estándar, como > y <=. Esto solo funciona con valores que se supone que son números enteros.
Duración size(x) Devuelve la longitud de la cadena x.
Decodificar URL x.urlDecode() Devuelve el valor decodificado de la URL de x. Las secuencias de caracteres en formato %## se sustituyen por los equivalentes no ASCII y + se sustituye por un espacio. Las codificaciones no válidas se devuelven tal cual.
Decodificar URL (Unicode) x.urlDecodeUni() Devuelve el valor decodificado de la URL de x. Además de urlDecode(), también gestiona secuencias de caracteres Unicode en formato %u###. Las codificaciones no válidas se devuelven tal cual.
Convertir de UTF-8 a Unicode x.utf8ToUnicode() Devuelve la representación Unicode en minúsculas de un carácter x codificado en UTF-8.

Atributos

Los atributos representan información de una solicitud entrante, como la dirección IP de origen o la ruta de URL solicitada.

Campo Tipo Descripción del campo
origin.ip cadena Dirección IP de origen de la solicitud.
origin.user_ip cadena La dirección IP del cliente de origen, que se incluye en el HTTP-HEADER mediante un proxy upstream. Antes de usar este atributo, debes configurar la opción userIpRequestHeaders[] en el campo advancedOptionsConfig de la política de seguridad para que coincida con una fuente como True-Client-IP, X-Forwarded-For o X-Real-IP.

Si no configura la opción userIpRequestHeaders[], si el encabezado configurado contiene valores de dirección IP no válidos o si el encabezado configurado no está presente, origin.user_ip se establece de forma predeterminada en origin.ip. Para obtener más información, consulta la referencia del recurso securityPolicy.

origin.tls_ja4_fingerprint cadena Huella digital TLS/SSL de JA4 si el cliente se conecta mediante HTTPS, HTTP/2 o HTTP/3. Si no está disponible, se devuelve una cadena vacía.
origin.tls_ja3_fingerprint cadena Huella digital JA3 TLS/SSL si el cliente se conecta mediante HTTPS, HTTP/2 o HTTP/3. Si no está disponible, se devuelve una cadena vacía.
request.headers mapa Un mapa de cadenas a cadenas de los encabezados de solicitud HTTP. Si un encabezado contiene varios valores, el valor de este mapa sería una cadena con todos los valores del encabezado separados por comas. Las claves de este mapa están todas en minúsculas. Todos los encabezados aceptados por los balanceadores de carga de aplicaciones externos se inspeccionan y se aplican las mismas limitaciones.

Te recomendamos que primero compruebes la disponibilidad con has(), como has(request.headers['header-key']) && request.headers['header-key'] != 'header-value'.

request.method cadena El método de solicitud HTTP, como GET o POST.
request.path cadena Ruta de URL de HTTP solicitada.
request.scheme cadena Esquema de URL de HTTP, como http o https. Los valores de este atributo están en minúsculas.
request.query cadena La consulta de URL de HTTP con el formato name1=value&name2=value2, tal como aparece en la primera línea de la solicitud HTTP. No se realiza ninguna descodificación.
origin.region_code cadena El código de país Unicode asociado a la IP de origen, como US. Si creas una regla o una expresión que usa códigos de país o región ISO 3166-1 alfa 2, Cloud Armor trata cada código de forma independiente. Las reglas y expresiones de Cloud Armor usan explícitamente esos códigos de región para permitir o denegar solicitudes.
origin.asn entero El número de sistema autónomo (ASN) asociado a la dirección IP de origen. El ASN único a nivel mundial se determina en función del operador de red que admita los prefijos de dirección IP que contengan la dirección IP de origen.

Atributos de reCAPTCHA

En esta sección se enumeran los atributos que solo se aplican a los tokens de reCAPTCHA o a las cookies de exención. Una subexpresión basada en estos atributos devuelve false si el token de reCAPTCHA o la cookie de exención que se va a evaluar no están disponibles o no son válidos por uno de los siguientes motivos:

  • El token tiene un formato incorrecto y no se puede decodificar.
  • El token contiene atributos no válidos. Por ejemplo, el token se ha generado con una clave de reCAPTCHA que no coincide con las claves de reCAPTCHA asociadas a la regla.
  • El token ha caducado.
Campo Tipo Descripción del campo
token.recaptcha_exemption.valid bool La presencia de una cookie de exención de reCAPTCHA válida.

Atributos de token de acción

Campo Tipo Descripción del campo
token.recaptcha_action.score float La puntuación de un token de acción de reCAPTCHA. Una puntuación válida va de 0.0 a 1.0. 0.0 indica que es muy probable que el usuario sea ilegítimo, mientras que 1.0 indica que es muy probable que el usuario sea legítimo.
token.recaptcha_action.captcha_status string El estado del captcha de un token de acción de reCAPTCHA. Los estados válidos son NONE, PASS o FAIL, donde NONE hace referencia a los casos en los que no hay ningún reto durante la evaluación de reCAPTCHA, de modo que falta el campo captcha en el token de acción.
token.recaptcha_action.action string Nombre de la acción (hasta 100 caracteres) de un token de acción de reCAPTCHA. Consulta Nombres de acciones.
token.recaptcha_action.valid bool La presencia de un token de acción de reCAPTCHA válido.

Atributos de token de sesión

Campo Tipo Descripción del campo
token.recaptcha_session.score float La puntuación de un token de sesión de reCAPTCHA. Una puntuación válida va de 0.0 a 1.0. 0.0 indica que es muy probable que el usuario sea ilegítimo, mientras que 1.0 indica que es muy probable que el usuario sea legítimo.
token.recaptcha_session.valid bool La presencia de un token de sesión de reCAPTCHA válido.

Ejemplos de expresiones

En cada una de estas expresiones, la acción que se lleva a cabo depende de si la expresión se incluye en una regla de denegación o en una regla de permiso.

Permitir o denegar el acceso en función de un intervalo de direcciones IP en IPv4 o IPv6

  • La siguiente expresión coincide con las solicitudes del intervalo de direcciones IP 198.51.100.0/24:

    inIpRange(origin.ip, '198.51.100.0/24')
    
  • La siguiente expresión coincide con las solicitudes del intervalo de direcciones IP 2001:db8::/32:

    inIpRange(origin.ip, '2001:db8::/32')
    

Permitir o denegar el acceso en función de un intervalo de direcciones IP de cliente personalizado detrás de un proxy upstream

Si has configurado el operador origin.user_ip, puedes hacer coincidir los valores de encabezado que hayas especificado en el campo advancedOptionsConfig.userIpRequestHeaders[].

  • La siguiente expresión coincide con las solicitudes que se han originado en el intervalo de direcciones IP 192.0.2.0/24:

    inIpRange(origin.user_ip, '192.0.2.0/24')
    
  • La siguiente expresión coincide con las solicitudes que se han originado en el intervalo de direcciones IP 2001:db8::/32:

    inIpRange(origin.user_ip, '2001:db8::/32')
    
  • La siguiente expresión coincide con las solicitudes que tienen una cookie que contiene 80=BLAH:

    has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
    

Permitir o denegar el tráfico con un encabezado referer no vacío

  • La siguiente expresión coincide con las solicitudes que tienen un encabezado referer no vacío:

    has(request.headers['referer']) && request.headers['referer'] != ""
    

Permitir o denegar el tráfico en función de la URL de host en el encabezado

  • La siguiente expresión coincide con las solicitudes a una URL específica:

    request.headers['host'].lower().contains('test.example.com')
    

Permitir o denegar el tráfico de una región específica

Si tu aplicación web no está disponible en la región AU, debes bloquear todas las solicitudes de esa región.

  • En una regla de denegación, usa la siguiente expresión, que coincide con las solicitudes de la región AU:

    origin.region_code == 'AU'
    

Por otro lado, si tu aplicación web solo está disponible en la región AU, debes bloquear las solicitudes de todas las demás regiones.

  • En una regla de denegación, use la siguiente expresión, que coincide con las solicitudes de todas las regiones excepto la región AU:

    origin.region_code != 'AU'
    

Los códigos de región se basan en los códigos ISO 3166-1 alfa-2. En algunos casos, una región corresponde a un país, pero no siempre es así. Por ejemplo, el código US incluye todos los estados de Estados Unidos, un distrito y seis zonas periféricas.

Permitir o denegar el tráfico de un ASN específico

Si tu aplicación web debe bloquearse para los clientes atendidos por un operador de red específico, puedes usar el número ASN del operador de red para bloquearla.

  • En una regla de denegación, usa la siguiente expresión, que coincide con las solicitudes de un ASN específico:

    origin.asn == 123
    

Por otro lado, si tu aplicación web solo va a estar disponible para los clientes de un operador de red específico, debes bloquear las solicitudes de todos los demás operadores de red.

  • En una regla de denegación, usa la siguiente expresión, que coincide con todos los demás operadores de red, excepto con el que te interesa permitir:

    origin.asn != 123
    

Varias expresiones

Para incluir varias condiciones en una sola regla, combina varias subexpresiones.

  • En el ejemplo siguiente, las solicitudes de 1.2.3.0/24 (como las de tus testers alfa) de la región AU coinciden con la siguiente expresión:

    origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
    
  • La siguiente expresión coincide con las solicitudes de 1.2.3.4 en las que un user-agent contiene la cadena WordPress:

    inIpRange(origin.ip, '1.2.3.4/32') &&
    has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
    

Permitir o denegar el tráfico de un URI de solicitud que coincida con una expresión regular

  • La siguiente expresión coincide con las solicitudes que contienen la cadena /example_path/ en el URI:

    request.path.matches('/example_path/')
    
  • La siguiente expresión coincide con las solicitudes que tienen Chrome en el campo de encabezado User-Agent:

    request.headers['user-agent'].matches('Chrome')
    
  • La siguiente expresión muestra la búsqueda de coincidencias sin distinción entre mayúsculas y minúsculas del encabezado User-Agent que contiene wordpress. Busca coincidencias con User-Agent:WordPress/605.1.15, User-Agent:wordPress y otras variantes de wordpress:

    request.headers['user-agent'].matches('(?i:wordpress)')
    

Permitir o denegar el tráfico que contiene un valor decodificado en base64 específico

  • La siguiente expresión coincide con las solicitudes que tienen un valor decodificado en base64 de myValue para el encabezado user-id:

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    

Permitir o denegar el tráfico que contiene un valor de cadena de una longitud específica

  • La siguiente expresión coincide con las solicitudes que tienen una URL de más de 10 caracteres:

    size(request.path) > 10
    
  • La siguiente expresión coincide con las solicitudes que tienen un encabezado x-data con una longitud igual o superior a 1024 caracteres:

    size(request.headers['x-data']) >= 1024
    

Permitir o denegar el tráfico que tenga cero content-length en el cuerpo HTTP

  • La siguiente expresión coincide con las solicitudes que tienen un content-length cero en el cuerpo HTTP:

    int(request.headers["content-length"]) == 0
    

Permitir o denegar el tráfico que contiene un valor codificado de URL específico

  • La siguiente expresión coincide con las solicitudes que tienen un valor de cookie que contiene %3c:

    has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
    

Permitir o denegar el tráfico que contenga un valor codificado de URL específico de una cadena Unicode

  • La siguiente expresión coincide con las solicitudes que tienen un valor de cookie igual a Match%2BValue o Match%u002BValue:

    has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
    

Permitir o denegar el tráfico que contenga una cadena Unicode específica de un texto UTF-8

  • La siguiente expresión coincide con las solicitudes que tienen un valor de cookie igual a ¬:

    has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
    

Permitir o denegar el tráfico en función de una huella digital de JA4 conocida

  • La siguiente expresión coincide con las solicitudes que tienen una huella digital de GA4 igual a t13d1516h2_8daaf6152771_b186095e22b6:

    origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
    

Permitir o denegar el tráfico en función de una lista de huellas digitales de JA4

  • La siguiente expresión coincide con las solicitudes que tienen una huella digital de JA4 igual a cualquiera de las siguientes huellas digitales de JA4:

    • t00d0000h0_000000000000_000000000000
    • t13d1516h2_8daaf6152771_b186095e22b6
    origin.tls_ja4_fingerprint == 't00d0000h0_000000000000_000000000000' || origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
    

Reglas de WAF preconfiguradas

Las reglas de WAF preconfiguradas usan firmas estáticas, expresiones regulares o ambas para buscar coincidencias en el cuerpo de la solicitud HTTP POST, los encabezados de la solicitud HTTP y los parámetros de consulta. Las reglas de WAF preconfiguradas disponibles se basan en la versión 3.3 del conjunto de reglas principales de OWASP. Cloud Armor proporciona varias reglas de WAF preconfiguradas. Para ver una lista completa de las reglas de WAF preconfiguradas, consulta el artículo Descripción general de las reglas de WAF preconfiguradas de Cloud Armor.

Para ver una lista de todas las reglas de WAF preconfiguradas disponibles, consulta Mostrar reglas de WAF preconfiguradas disponibles.

Para obtener más información sobre las reglas de WAF preconfiguradas, consulta el caso práctico Mitigar ataques a la capa de aplicación mediante reglas de WAF preconfiguradas.

Nombres de reglas de WAF preconfiguradas

Los nombres de las reglas de WAF preconfiguradas tienen el formato <attack category>-<OWASP CRS version>-<version field>. La categoría de ataque especifica el tipo de ataques frente a los que quieres protegerte, como xss (cross-site scripting) o sqli (inyección de SQL).

Los campos de versión admitidos son stable y canary. Las adiciones y modificaciones de las reglas se publican primero en la versión canary. Cuando las adiciones y modificaciones se consideran seguras y estables, se promocionan a la versión stable.

IDs de miembro de regla de WAF preconfigurada

Una regla de WAF preconfigurada contiene varias expresiones, cada una con su firma. Por ejemplo, la regla de WAF preconfigurada xss-v33-stable incluye una expresión llamada owasp-crs-v030301-id941100-xss, que corresponde al ID de regla id941100 de la versión 3.3. Puede usar las firmas para excluir expresiones específicas, lo que resulta útil si una expresión concreta activa constantemente un falso positivo. Para obtener más información, consulta la sección sobre falsos positivos.

Para obtener información sobre el conjunto de reglas principal y la configuración en diferentes niveles de sensibilidad, consulta el artículo Activar las reglas de WAF de Cloud Armor de Google.

Operador de reglas de WAF preconfiguradas

Expresiones Descripción
evaluatePreconfiguredWaf(string, MAP<string, dyn>) Devuelve true si alguna de las firmas de WAF del conjunto de reglas de WAF especificado devuelve true. El primer argumento es el nombre del conjunto de reglas de WAF, como xss-v33-stable. El segundo argumento (opcional) es un mapa en el que la clave es una cadena y el valor es de tipo dinámico en función de la clave. El objetivo de este argumento es ajustar qué firmas de WAF se evalúan. Entre las claves aceptadas se incluyen las siguientes:
  • "sensitivity": corresponde al nivel de paranoia de OWASP Core Rule Set, que tiene 4 niveles, del 1 al 4. Su valor es un número entero con un intervalo válido de 0 a 4. Ten en cuenta que el valor 0 se reserva como valor válido cuando se usa en combinación con "opt_in_rule_ids" (descrito más adelante). Cuando se especifica una sensibilidad de x (x >= 1), se evalúan todas las firmas de WAF asociadas con un valor de sensibilidad de 1 a x. Si se omite, se usa el valor 4 para la sensibilidad.
  • "opt_out_rule_ids": firmas de WAF (representadas por IDs de reglas) de las que se excluirá la evaluación. El conjunto base se determina mediante el valor de sensibilidad. Su valor es una lista de cadenas. El número máximo de IDs de reglas permitido es 128.
  • "opt_in_rule_ids": firmas de WAF (representadas por IDs de reglas) que se van a habilitar para la evaluación, donde el conjunto base está vacío. Su valor es una lista de cadenas. El número máximo de IDs de reglas permitido es 128. Cuando se usa este atributo, se debe especificar una "sensibilidad" de 0.

Las claves "opt_out_rule_ids" y "opt_in_rule_ids" se excluyen mutuamente. Puede usar "opt_in_rule_ids" si quiere revisar y habilitar manualmente las nuevas firmas de WAF que se añadan más adelante a un conjunto de reglas.

evaluatePreconfiguredExpr(string, LIST)

Devuelve "true" si alguna de las expresiones de la regla de WAF preconfigurada especificada devuelve "true".

El primer argumento es el nombre de la regla de WAF preconfigurada, como xss-stable. El segundo argumento (opcional) es una lista de cadenas de IDs separadas por comas que se deben excluir de la evaluación. La lista de exclusión es útil cuando un miembro determinado de la regla de WAF preconfigurada activa un falso positivo.

Ejemplos de reglas de WAF preconfiguradas

  • La siguiente expresión usa la regla de WAF preconfigurada xss-v33-stable para mitigar ataques XSS:

    evaluatePreconfiguredWaf('xss-v33-stable')
    
  • La siguiente expresión usa todas las expresiones de la regla de WAF preconfigurada xss-v33-stable, excepto los IDs de miembro 941100 y 941110:

    evaluatePreconfiguredWaf('xss-v33-stable', {'opt_out_rule_ids': ['owasp-crs-v030301-id941100-xss',
    'owasp-crs-v030301-id941110-xss']})
    
  • La siguiente expresión usa una regla de WAF preconfigurada para mitigar los ataques de inyección SQL del intervalo de direcciones IP 198.51.100.0/24:

    inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredWaf('sqli-v33-stable')
    

Siguientes pasos