CEL 匹配器语言参考文档

通用表达式语言 (CEL) 是一种开源的非图灵完备语言,用于实现表达式求值的常见语义。安全 Web 代理使用 CEL 条件的子集根据属性数据做出布尔值授权决策。通常,条件表达式由一个或多个使用逻辑运算符(&&、|| 或 !)联接的语句组成。每个语句表示一条适用于角色绑定且基于属性的控制规则,并最终确定是否允许访问。

属性

在定义安全 Web 代理政策时,使用会话属性和应用属性来描述政策适用的会话属性或应用属性。

由 SessionMatcher 描述的会话属性适用于会话专用属性,例如源 IP 地址、主机和 IP 地址范围。由 ApplicationMatcher 描述的应用属性适用于应用属性,例如请求标头、请求方法和请求路径。

适用于 SessionMatcher 和 ApplicationMatcher 的属性

下表介绍了同时适用于 SessionMatcher 和 ApplicationMatcher 的属性。

属性 属性类型 说明
source.ip 字符串 发送请求的客户端的 IP 地址。
source.port 整数 发送请求的客户端端口。
destination.port 整数 安全 Web 代理实例将流量发送到的上游端口。
host() 字符串 用于 DNS 解析和上游连接的主机值。不包括端口。 **host()** 的值由以下因素决定:
  • 原始 HTTP 请求:主机头
  • 代理隧道 HTTP CONNECT 请求:CONNECT 目标
source.matchTag(SECURE_TAG) 布尔值

True(如果来源与 SECURE_TAG 相关联)。

该参数是安全标记的永久 ID,例如 source.matchTag('tagValues/123456')。

source.matchServiceAccount(SERVICE_ACCOUNT) 布尔值 True,如果来源与 SERVICE_ACCOUNT 相关联,例如 source.matchServiceAccount('x@my-project.iam.gserviceaccount.com')。
inUrlList(HOST_OR_URL, NAMED_LIST) 布尔值

True,如果所提供的命名列表 NAMED_LIST 中存在 HOST_OR_URL。例如:

  • inUrlList(host(), 'projects/1234/locations/us-east1/urlLists/allowed-repos')
  • inUrlList(request.url(), 'projects/1234/locations/us-east1/urlLists/allowed-repos')

当 UrlList 格式与不含正斜线 (/) 的值(例如在 host() 中)匹配时,系统只会匹配格式的网域部分。如需了解详情,请参阅 UrlList 如何解读条目。

inIpRange(IP_ADDRESS,
IP_RANGE)
布尔值 True,如果 IP_ADDRESS 包含在 IP_RANGE 中,例如 inIpRange(source.ip, '1.2.3.0/24')。IPv6 地址的子网掩码不能大于 /64。

仅适用于 ApplicationMatcher 的属性

下表介绍了仅适用于 ApplicationMatcher 的属性。

属性 属性类型 说明
request.headers 地图 请求标头的字符串到字符串映射。如果某个标头包含多个值,此映射中的值将是标头的所有值的英文逗号分隔字符串。此映射中的所有键均为小写。
request.method 字符串 请求方法,例如 GET 或 POST。
request.host 字符串

与 request.headers['host'] 等效的便捷方法。

在大多数情况下,我们建议您使用 host()。

request.path 字符串 请求的网址路径。
request.query 字符串

网址查询,格式为 name1=value&name2=value2,显示在请求的第一行中。

未执行解码。

request.scheme 字符串 网址 scheme,例如 HTTP 或 HTTPS。此属性的所有值均为小写。
request.url() 字符串

为 host() + request.path 提供便利。

不包括端口,并且使用的主机值可能与主机标头不同。

request.useragent() 字符串 与 request.headers['user-agent'] 等效的便捷方法。

运算符

安全 Web 代理支持多种运算符,可用于根据简单的表达式语句构建复杂的逻辑表达式。安全 Web 代理支持逻辑运算符(例如 &&、||, 和 !)和字符串操作运算符(例如 x.contains('y'))。

借助逻辑运算符,您可以在条件表达式中验证多个变量。例如,request.method == 'GET' && host().matches('.*\.example.com') 连接了两个语句,而且必须同时满足这两个语句,才能生成总体计算结果 True。True

字符串操作运算符可匹配您定义的字符串或子字符串,让您能够制定规则来控制对资源的访问,而无需列出所有可能的组合。

逻辑运算符

下表介绍了安全 Web 代理支持的逻辑运算符。

示例表达式 说明
x == "foo" 如果 x 等于常量字符串字面量参数,则返回 True。
x == R"fo'o" 如果 x 等于不解释转义序列的指定原始字符串字面量,则返回 True。原始字符串字面量便于表示代码必须使用转义序列字符的字符串。
x == y 如果 x 等于 y,则返回 True。
x != y 如果 x 不等于 y,则返回 True。
x && y 如果 x 和 y 均为 True,则返回 True。
x || y 如果 x 或 y 或两者均为 True,则返回 True。
!x 如果布尔值 x 为 False,则返回 True。否则,如果布尔值 x 为 True,则返回 False。
m['k'] 如果存在键 k,则返回字符串到字符串映射 m 中的键 k 处的值。如果不存在键 k,则会返回一个错误,导致正在评估的规则不匹配。

字符串操作运算符

下表介绍了安全 Web 代理支持的字符串操作运算符。

表达式 说明
x.contains(y) 如果字符串 x 包含子字符串 y,则返回 True。
x.startsWith(y) 如果字符串 x 以子字符串 y 开头,则返回 True。
x.endsWith(y) 如果字符串 x 以子字符串 y 结尾,则返回 True。
x.matches(y)

如果字符串 x 与指定的 RE2 模式 y 匹配,则返回 True。

RE2 模式是使用停用 Unicode 功能的 RE2::Latin1 选项编译的。

x.lower() 返回字符串 x 的小写值。
x.upper() 返回字符串 x 的大写值。
x + y 返回串联的字符串 xy。
int(x) 将字符串结果 x 转换为 int 类型。您可以使用转换后的字符串通过标准算术运算符(例如 > 和 <=)比较整数。此方法仅适用于整数值。