创建自定义云控制措施时,您可以使用通用表达式语言 (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 是否包含子字符串 testing 或 development |
has(resource.projectId) && !resource.projectId.contains('testing') || !resource.projectId.contains('development') |