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) boolean

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

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

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

如果提供的命名列表 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)
boolean 如果 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 网址架构,例如 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 如果 xy 均为 True,则返回 True
x || y 如果 x 和/或 yTrue,则返回 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 类型。转换后的字符串可用于与标准算术运算符(如 ><=)进行整数比较。这仅适用于可为整数的值。