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 esfalse
.
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') |