Crea y visualiza políticas de seguridad de Cloud Armor

En esta página, se describe cómo puedes crear políticas de seguridad de Google Cloud Armor para filtrar el tráfico entrante a tu aplicación. Para obtener información sobre los conceptos de las políticas de seguridad, consulta la descripción general de las políticas de seguridad de Cloud Armor.

Antes de comenzar

Antes de configurar las políticas de seguridad, haz lo siguiente:

  • Asegúrate de conocer los conceptos del balanceador de cargas de aplicaciones externo.

  • Examina tus servicios de backend existentes para determinar cuáles no tienen una política de seguridad adjunta. Estos servicios de backend y sus backends asociados no están protegidos. Para agregar protección de Cloud Armor, adjunta una política de seguridad nueva o existente al servicio de backend.

Configura los permisos de IAM para las políticas de seguridad de Cloud Armor

Las siguientes operaciones requieren el rol de administrador de seguridad de Compute de Identity and Access Management (IAM) (roles/compute.securityAdmin):

  • Configura, modifica, actualiza y borra una política de seguridad de Cloud Armor
  • Usa los siguientes métodos de API:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

Un usuario con el rol de administrador de red de Compute (roles/compute.networkAdmin) puede realizar las siguientes operaciones:

  • Cómo establecer una política de seguridad de Cloud Armor para un servicio de backend
  • Usa los siguientes métodos de API:
    • BackendServices setSecurityPolicy
    • BackendServices list (solo gcloud)

Los usuarios con el rol de administrador de seguridad (roles/iam.securityAdmin) y el rol de administrador de red de Compute (roles/compute.networkAdmin) pueden ver las políticas de seguridad de Cloud Armor con los métodos de la API de SecurityPolicies get, list y getRule.

Configura permisos de IAM para funciones personalizadas

En la siguiente tabla, se enumeran los permisos básicos de los roles de IAM, sus métodos de API asociados y los roles que otorgan ese permiso.

Permisos de IAM Métodos de la API Funciones
compute.securityPolicies.create SecurityPolicies insert Administrador de seguridad de Compute (roles/compute.securityAdmin)
compute.securityPolicies.delete SecurityPolicies delete Administrador de seguridad de Compute (roles/compute.securityAdmin)
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
Administrador de seguridad (roles/iam.securityAdmin)
compute.securityPolicies.list SecurityPolicies list Administrador de seguridad (roles/iam.securityAdmin)
Ambos de los siguientes:
  • compute.securityPolicies.use
  • compute.backendServices.
    setSecurityPolicy
BackendServices
setSecurityPolicy
Administrador de red de Compute (roles/compute.networkAdmin)
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
Administrador de seguridad de Compute (roles/compute.securityAdmin)

Crear políticas de seguridad

Usa la consola de Cloud de Confiance , Google Cloud CLI o la API de REST para configurar reglas, expresiones y políticas de seguridad de Cloud Armor. Cuando uses la gcloud CLI, usa la marca --type para especificar si la política de seguridad es una política de seguridad de backend o una política de seguridad perimetral.

Si no conoces la configuración de políticas de seguridad, revisa las políticas de seguridad de ejemplo.

Expresiones de muestra

Las siguientes son expresiones de ejemplo. Para obtener más información, consulta la referencia del lenguaje de reglas personalizadas de Cloud Armor.

Si tu regla o expresión usa códigos de país o región ISO 3166-1 alpha-2, Cloud Armor trata cada código de forma independiente. Las reglas y expresiones de Cloud Armor usan esos códigos para permitir o denegar solicitudes.

  • La siguiente expresión coincide con las solicitudes de la dirección IP 1.2.3.4 que contienen la cadena example en el encabezado User-Agent:

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

    Como alternativa, puedes hacer coincidir el rango de direcciones IP de un encabezado de dirección IP de cliente personalizado con el atributo origin.user_ip:

    inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
    
  • La siguiente expresión coincide con las solicitudes que tienen una cookie con un valor específico:

    has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
    
  • La siguiente expresión coincide con las solicitudes de la región AU:

    origin.region_code == 'AU'
    
  • La siguiente expresión coincide con las solicitudes de la región AU que no están en el rango de IP especificado:

    origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
    
  • La siguiente expresión coincide con las solicitudes con una ruta de acceso de variable numerada a un archivo específico si el URI coincide con una expresión regular:

    request.path.matches('/path/[0-9]+/target_file.html')
    
  • La siguiente expresión coincide con las solicitudes si el valor decodificado en Base64 del encabezado user-id contiene un valor específico:

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    
  • En la siguiente expresión, se usa un conjunto de expresiones preconfiguradas para establecer coincidencias con los ataques de SQLi:

    evaluatePreconfiguredWaf('sqli-stable')
    

Salto de directorio y normalización

Normaliza el contenido en tus reglas basadas en rutas para administrar las reglas de codificación y de salto de directorio, y para crear reglas generalizadas que eviten el uso de mayúsculas o la codificación específica del contenido.

Cuando escribas reglas que usen startsWith, endsWith o contains para que coincidan con request.path, usa lower y urlDecode para normalizar la ruta de acceso antes de la coincidencia. Esto ayuda a evitar los bypasses que usan codificación de URL o variaciones de mayúsculas y minúsculas.

Por ejemplo, para bloquear el acceso al directorio /admin, usa la siguiente expresión:

request.path.lower().urlDecode().startsWith('/admin')

Esta regla bloquea las solicitudes de /admin, /Admin, /a%64min y otras variaciones.

Cuando escribas reglas que usen matches para hacer coincidir request.path, ten en cuenta el carácter de barra inversa (\) en tu expresión regular.

Por ejemplo, para bloquear el acceso al directorio /admin, usa la siguiente expresión para bloquear las omisiones que usan el carácter de barra inversa (\):

request.path.matches(r'^/\\*admin')

Combina esto con urlDecode para controlar la codificación de URL y los bypasses del carácter de barra inversa (\):

request.path.urlDecode().matches(r'^/\\*admin')

¿Qué sigue?