Escribir reglas para controles de nube personalizados

Cuando creas un control en la nube personalizado, utilizas expresiones del lenguaje de expresión común (CEL) para crear las reglas que evalúan las propiedades del recurso analizado.

Las expresiones pueden ser comprobaciones de un solo valor o expresiones compuestas más complejas que comprueben varios valores o condiciones. De cualquier forma, la expresión debe resolverse como un valor booleano false para activar una detección.

Las expresiones CEL que evalúan propiedades de recursos deben cumplir las siguientes reglas:

  • Las propiedades que especifiques en una expresión CEL deben ser propiedades del recurso analizado, tal como se definen en la definición de la API del tipo de recurso.

  • Todos los enums de una expresión CEL deben representarse como cadenas. Por ejemplo, la siguiente es una expresión válida para el tipo de recurso cloudkms.googleapis.com/CryptoKeyVersion:

    resource.data.state = "PENDING_GENERATION"
  • El resultado de las expresiones CEL que definas en la propiedad condition debe ser un valor booleano. Una detección solo se activa si el resultado es false.

Para obtener más información sobre CEL, consulta los siguientes recursos:

Ejemplos de expresiones CEL

En la siguiente tabla se incluyen algunas expresiones CEL que puedes usar para evaluar propiedades de recursos.

Tipo de recurso Descripción Expresión CEL
cloudkms.googleapis.com/CryptoKey Comprobar el periodo de rotación de la clave de Cloud KMS has(resource.data.rotationPeriod) && resource.data.rotationPeriod < duration('60h')
compute.googleapis.com/Network Asociar una regla de peering de nube privada virtual con redes de peers resource.data.selfLink.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default') || resource.data.peerings.exists(p, p.network.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/shared$'))
cloudfunctions.googleapis.com/CloudFunction Permitir solo el tráfico de entrada interno de una función de Cloud Run has(resource.data.ingressSettings) && resource.data.ingressSettings.matches('ALLOW_INTERNAL_ONLY')
compute.googleapis.com/Instance El nombre del recurso coincide con el patrón resource.data.name.matches('^gcp-vm-(linux|windows)-v\\\\d+$')
serviceusage.googleapis.com/Service Permitir que solo se habiliten las APIs relacionadas con el almacenamiento resource.data.state == 'ENABLED' && !( resource.data.name.matches('storage-api.googleapis.com') || resource.data.name.matches('bigquery-json.googleapis.com') || resource.data.name.matches('bigquery.googleapis.com') || resource.data.name.matches('sql-component.googleapis.com') || resource.data.name.matches('spanner.googleapis.com'))
sqladmin.googleapis.com/Instance Permitir solo las direcciones IP públicas que estén en la lista de permitidas (resource.data.instanceType == 'CLOUD_SQL_INSTANCE' && resource.data.backendType == 'SECOND_GEN' && resource.data.settings.ipConfiguration.ipv4Enabled ) && (resource.data.ipAddresses.all(ip, ip.type != 'PRIMARY' || ip.ipAddress.matches('IP_ADDRESS')))
dataproc.googleapis.com/Cluster Comprueba si los IDs de proyecto de un clúster de Dataproc contienen las subcadenas testing o development. has(resource.data.projectId) && !resource.data.projectId.contains('testing') || !resource.data.projectId.contains('development')