通用表达式语言 (CEL) 是一种开源的非图灵完备语言,用于实现表达式求值的常见语义。安全 Web 代理使用 CEL 条件的子集根据属性数据做出布尔值授权决策。通常,条件表达式由一个或多个使用逻辑运算符(&&
、||
或 !
)联接的语句组成。每个语句表示一条适用于角色绑定且基于属性的控制规则,并最终确定是否允许访问。
属性
在定义安全 Web 代理政策时,会使用会话属性和应用属性来描述政策适用的会话属性或应用属性。
由 SessionMatcher
描述的会话属性适用于会话专用属性,例如来源或目的地 IP 地址、主机或 IP 地址范围。由 ApplicationMatcher
描述的应用属性适用于应用属性,例如请求标头、HTTP 请求方法或请求路径。
SessionMatcher
和 ApplicationMatcher
中的可用属性
下表介绍了同时适用于 SessionMatcher
和 ApplicationMatcher
的属性。
属性 | 特性类型 | 说明 |
---|---|---|
source.ip |
字符串 | 发送请求的客户端的 IP 地址。 |
source.port |
整数 | 发送请求的客户端端口。 |
destination.port |
整数 | 安全 Web 代理实例将流量发送到的上游端口。 |
host() |
字符串 | 用于 DNS 解析和上游连接的主机值。不包括端口。
此值取决于以下因素:
|
source.matchTag(SECURE_TAG) |
布尔值 | 如果来源与 该参数是安全标记的永久 ID,例如 |
source.matchServiceAccount(SERVICE_ACCOUNT) |
布尔值 | 如果该来源与 SERVICE_ACCOUNT (例如 source.matchServiceAccount('x@my-project.iam.gserviceaccount.com') )相关联,则为 True 。
|
inUrlList(HOST_OR_URL, NAMED_LIST) |
布尔值 |
如果所提供的命名列表
将 |
inIpRange(IP_ADDRESS, |
布尔值 | 如果 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.path |
字符串 | 所请求的 HTTP 网址路径。 |
request.query |
字符串 | HTTP 网址查询,格式为 未执行解码。 |
request.scheme |
字符串 | HTTP 网址 scheme,例如 HTTP 或 HTTPS。此属性的值均为小写。 |
request.url() |
字符串 | 为 不包括端口,并且使用的主机值可能与主机标头不同。 |
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) |
如果字符串 RE2 模式在编译时使用了已停用 Unicode 功能的 RE2::Latin1 选项。 |
x.lower() |
返回字符串 x 的小写值。 |
x.upper() |
返回字符串 x 的大写值。 |
x + y |
返回串联的字符串 xy 。 |
int(x) |
将字符串结果 x 转换为 int 类型。转换后的字符串可用于使用标准算术运算符(例如 > 和 <= )进行整数比较。这仅适用于可以是整数的值。 |