CEL 匹配器语言参考文档

通用表达式语言 (CEL) 是 开源非图灵完整语言,它实现了 表达式评估。安全 Web 代理使用一部分 CEL 条件 基于属性数据的布尔值授权决策。一般来说,一个条件 表达式由一个或多个语句组成,这些语句通过逻辑运算符连接 运算符(&&||!)。每个语句都表示 应用于角色绑定的控制规则,并最终决定 访问。

属性

会话属性和应用属性在定义 用于描述会话属性或 政策适用的应用属性

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) 布尔值 如果来源与以下内容相关联,则为 True SERVICE_ACCOUNT,例如 source.matchServiceAccount('x@my-project.iam.gserviceaccount.com')
inUrlList(HOST_OR_URL, NAMED_LIST) 布尔值

True(如果 HOST_OR_URL 存在) 提供的命名列表 NAMED_LIST。例如:

  • 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)
布尔值 True(如果包含 IP_ADDRESS) 在 IP_RANGE 内,例如 inIpRange(source.ip, '1.2.3.0/24')。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 网址架构,例如 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 等于以下值,则返回 True y
x != y 如果 x 不等于 ,则返回 True y
x && y 如果 xy,则返回 TrueTrue
x || y 如果 x 和/或 y,则返回 TrueTrue
!x 如果布尔值 xFalse,则返回 True;如果布尔值 xTrue,则返回 False
m['k'] 如果存在键 k,则返回字符串到字符串映射 m 中的键 k 处的值。如果不存在键 k,则返回导致评估中的规则不匹配的错误。

字符串操作运算符

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

表达式 说明
x.contains(y) 如果字符串 x 包含True 子字符串 y
x.startsWith(y) 如果字符串 xTrue 子字符串 y
x.endsWith(y) 如果字符串 xTrue 子字符串 y
x.matches(y)

如果字符串 xTrue 指定 RE2 模式 y

RE2 模式在编译时使用了已停用 Unicode 功能的 RE2::Latin1 选项。

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