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 |
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 |
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.
Atributos de la cookie de exención
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')
Permitir o denegar el tráfico con una cookie específica
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ónAU
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 cadenaWordPress
: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 encabezadoUser-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 contienewordpress
. Busca coincidencias conUser-Agent:WordPress/605.1.15
,User-Agent:wordPress
y otras variantes dewordpress
: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 encabezadouser-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
oMatch%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:
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
|
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 miembro941100
y941110
: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
- Configurar políticas de seguridad de Cloud Armor
- Ajustar reglas de WAF preconfiguradas de Cloud Armor
- Solucionar problemas de Cloud Armor
- Cuotas y límites