CEL 匹配器语言参考文档

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

属性

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

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

SessionMatcherApplicationMatcher 中的可用属性

下表介绍了同时适用于 SessionMatcherApplicationMatcher 的属性。

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

如果来源与 SECURE_TAG 相关联,则为 True

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

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

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

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

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

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

仅适用于 ApplicationMatcher 的属性

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

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

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

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

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

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

未执行解码。

request.scheme 字符串 HTTP 网址 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') 连接了两个语句,而且必须同时满足这两个语句,才能生成总体计算结果 TrueTrue

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

逻辑运算符

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

示例表达式 说明
x == "foo" 如果 x 等于常量字符串字面量参数,则返回 True
x == R"fo'o" 如果 x 等于不解释转义序列的指定原始字符串字面量,则返回 True。原始字符串字面量便于表示代码必须使用转义序列字符的字符串。
x == y 如果 x 等于 y,则返回 True
x != y 如果 x 不等于 y,则返回 True
x && y 如果 xy 均为 True,则返回 True
x || y 如果 xy 或两者均为 True,则返回 True
!x 如果布尔值 xFalse,则返回 True;如果布尔值 xTrue,则返回 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 类型。转换后的字符串可用于使用标准算术运算符(例如 ><=)进行整数比较。这仅适用于可以是整数的值。