Écrire des règles pour les contrôles cloud personnalisés

Lorsque vous créez un contrôle cloud personnalisé, vous utilisez des expressions CEL (Common Expression Language) pour créer les règles qui évaluent les propriétés de la ressource analysée.

Vos expressions peuvent être des vérifications portant sur une seule valeur ou des expressions composées plus complexes qui vérifient plusieurs valeurs ou conditions. Dans tous les cas, l'expression doit renvoyer une valeur booléenne false pour déclencher un résultat.

Les expressions CEL qui évaluent les propriétés des ressources doivent respecter les règles suivantes :

  • Les propriétés que vous spécifiez dans une expression CEL doivent être des propriétés de la ressource analysée, telles qu'elles sont définies dans la définition d'API du type de ressource.

  • Toutes les énumérations d'une expression CEL doivent être représentées sous forme de chaînes. Par exemple, l'expression suivante est valide pour le type de ressource cloudkms.googleapis.com/CryptoKeyVersion :

    resource.data.state = "PENDING_GENERATION"
  • Le résultat des expressions CEL que vous définissez dans la propriété condition doit être une valeur booléenne. Un résultat n'est déclenché que si le résultat renvoyé est false.

Pour trouver le nom d'une ressource, consultez Types d'assets.

Pour en savoir plus sur CEL, consultez les ressources suivantes :

Exemples d'expressions CEL

Le tableau suivant liste quelques expressions CEL que vous pouvez utiliser pour évaluer les propriétés des ressources.

Type de ressource Description Expression CEL
cloudkms.googleapis.com/CryptoKey Vérifier la période de rotation des clés Cloud KMS has(resource.data.rotationPeriod) && resource.data.rotationPeriod < duration('60h')
compute.googleapis.com/Network Assurer la mise en correspondance de la règle d'appairage de cloud privé virtuel et des pairs réseau 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 Autoriser uniquement le trafic entrant interne pour une fonction Cloud Run has(resource.data.ingressSettings) && resource.data.ingressSettings.matches('ALLOW_INTERNAL_ONLY')
compute.googleapis.com/Instance Le nom de la ressource correspond au modèle resource.data.name.matches('^gcp-vm-(linux|windows)-v\\\\d+$')
serviceusage.googleapis.com/Service Autoriser uniquement l'activation des API liées au stockage 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 N'autoriser que les adresses IP publiques figurant sur la liste d'autorisation (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 Vérifier si les ID de projet d'un cluster Dataproc contiennent les sous-chaînes testing ou development has(resource.data.projectId) && !resource.data.projectId.contains('testing') || !resource.data.projectId.contains('development')