为自定义云控制措施编写规则

创建自定义云控制措施时,您可以使用通用表达式语言 (CEL) 表达式来创建用于评估所扫描资源属性的规则。

表达式可以是单个值的检查,也可以是检查多个值或条件的更复杂的复合表达式。无论采用哪种方式,表达式都必须解析为布尔值 false 才能触发发现结果。

用于评估资源属性的 CEL 表达式必须遵循以下规则:

  • 您在 CEL 表达式中指定的属性必须是扫描的资源的属性,如资源类型的 API 定义中所定义。

  • CEL 表达式中的所有枚举都必须以字符串表示。例如,以下是适用于 cloudkms.googleapis.com/CryptoKeyVersion 资源类型的有效表达式:

    resource.state = "PENDING_GENERATION"
  • 您在 condition 属性中定义的 CEL 表达式的结果必须是布尔值。只有当结果为 false 时,才会触发相应发现结果。

如需详细了解 CEL,请参阅以下内容:

CEL 表达式示例

下表列出了一些可用于评估资源属性的 CEL 表达式。

资源类型 说明 CEL 表达式
cloudkms.googleapis.com/CryptoKey 检查 Cloud KMS 密钥轮替周期 has(resource.rotationPeriod) && resource.rotationPeriod < duration('60h')
compute.googleapis.com/Network 将 Virtual Private Cloud 对等互连规则与网络对等方相匹配 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 仅允许 Cloud Run functions 函数的内部入站流量 has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY')
compute.googleapis.com/Instance 资源名称与模式匹配 resource.name.matches('^gcp-vm-(linux|windows)-v\\\\d+$')
serviceusage.googleapis.com/Service 仅允许启用与存储相关的 API 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 仅允许已列入许可名单的公共 IP 地址 (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 检查 Dataproc 集群中的项目 ID 是否包含子字符串 testingdevelopment has(resource.projectId) && !resource.projectId.contains('testing') || !resource.projectId.contains('development')