Escribe reglas para los controles de nube personalizados

Cuando creas un control personalizado de Cloud, usas expresiones de Common Expression Language (CEL) para crear las reglas que evalúan las propiedades del recurso analizado.

Tus expresiones pueden ser verificaciones de un solo valor o expresiones compuestas más complejas que verifican varios valores o condiciones. De cualquier manera, la expresión debe resolverse como un valor booleano false para activar un hallazgo.

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

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

  • Todos los enums en 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. Un hallazgo se activa solo si el resultado es false.

Para obtener más información sobre CEL, consulta lo siguiente:

Expresiones de CEL de ejemplo

En la siguiente tabla, se enumeran algunas expresiones de CEL que puedes usar para evaluar las propiedades de los recursos.

Tipo de recurso Descripción Expresión CEL
cloudkms.googleapis.com/CryptoKey Verifica el período de rotación de claves de Cloud KMS has(resource.data.rotationPeriod) && resource.data.rotationPeriod < duration('60h')
compute.googleapis.com/Network Haz coincidir la regla de intercambio de tráfico de la nube privada virtual con las redes de intercambio de tráfico 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 Solo permitir el tráfico de entrada interno para 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 Solo permite las direcciones IP públicas que se encuentran en la lista de entidades 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 Verifica si los IDs de proyecto en 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')