Escrever regras para controles de nuvem personalizados

Ao criar um controle de nuvem personalizado, você usa expressões da Common Expression Language (CEL) para criar as regras que avaliam as propriedades do recurso verificado.

Suas expressões podem ser verificações de um único valor ou expressões compostas mais complexas que verificam vários valores ou condições. De qualquer forma, a expressão precisa ser resolvida com um false booleano para acionar uma descoberta.

As expressões CEL que avaliam propriedades de recursos precisam estar em conformidade com as seguintes regras:

  • As propriedades especificadas em uma expressão CEL precisam ser propriedades do recurso verificado, conforme definido na definição da API do tipo de recurso.

  • Todas as enumerações em uma expressão CEL precisam ser representadas como strings. Por exemplo, uma expressão válida para o tipo de recurso cloudkms.googleapis.com/CryptoKeyVersion:

    resource.state = "PENDING_GENERATION"
  • O resultado das expressões CEL definidas na propriedade condition precisa ser um booleano. Uma descoberta será acionada somente se o resultado for false.

Para mais informações sobre CEL, consulte estes documentos:

Exemplo de expressões CEL

A tabela a seguir lista algumas expressões CEL que podem ser usadas para avaliar as propriedades dos recursos.

Tipo de recurso Descrição Expressão CEL
cloudkms.googleapis.com/CryptoKey Verificar o período de rotação de chaves do Cloud KMS has(resource.rotationPeriod) && resource.rotationPeriod < duration('60h')
compute.googleapis.com/Network Corresponder a regra de peering da nuvem privada virtual a pares de redes resource.selfLink.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default') || resource.peerings.exists(p, p.network.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/shared$'))
cloudfunctions.googleapis.com/CloudFunction Permitir apenas tráfego de entrada interno para uma função do Cloud Run has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY')
compute.googleapis.com/Instance O nome do recurso corresponde ao padrão resource.name.matches('^gcp-vm-(linux|windows)-v\\\\d+$')
serviceusage.googleapis.com/Service Permitir que apenas APIs relacionadas ao armazenamento sejam ativadas resource.state == 'ENABLED' && !( resource.name.matches('storage-api.googleapis.com') || resource.name.matches('bigquery-json.googleapis.com') || resource.name.matches('bigquery.googleapis.com') || resource.name.matches('sql-component.googleapis.com') || resource.name.matches('spanner.googleapis.com'))
sqladmin.googleapis.com/Instance Permitir apenas endereços IP públicos na lista de permissões (resource.instanceType == 'CLOUD_SQL_INSTANCE' && resource.backendType == 'SECOND_GEN' && resource.settings.ipConfiguration.ipv4Enabled ) && (resource.ipAddresses.all(ip, ip.type != 'PRIMARY' || ip.ipAddress.matches('IP_ADDRESS')))
dataproc.googleapis.com/Cluster Verifique se os IDs de projeto em um cluster do Dataproc contêm as substrings testing ou development has(resource.projectId) && !resource.projectId.contains('testing') || !resource.projectId.contains('development')