通用表达式语言 (CEL) 是
开源非图灵完整语言,它实现了
表达式评估。安全 Web 代理使用一部分 CEL 条件
基于属性数据的布尔值授权决策。一般来说,一个条件
表达式由一个或多个语句组成,这些语句通过逻辑运算符连接
运算符(&&
、||
或 !
)。每个语句都表示
应用于角色绑定的控制规则,并最终决定
访问。
属性
会话属性和应用属性在定义 用于描述会话属性或 政策适用的应用属性
由 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) |
布尔值 | 如果来源与以下内容相关联,则为 True
SERVICE_ACCOUNT ,例如
source.matchServiceAccount('x@my-project.iam.gserviceaccount.com') 。
|
inUrlList(HOST_OR_URL, NAMED_LIST) |
布尔值 |
将 |
inIpRange(IP_ADDRESS, |
布尔值 | 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.path |
字符串 | 所请求的 HTTP 网址路径。 |
request.query |
字符串 | HTTP 网址查询,格式为
未执行解码。 |
request.scheme |
字符串 | HTTP 网址架构,例如 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 等于以下值,则返回 True
y 。 |
x != y |
如果 x 不等于 ,则返回 True
y 。 |
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 包含True
子字符串 y 。 |
x.startsWith(y) |
如果字符串 x 以True
子字符串 y 。 |
x.endsWith(y) |
如果字符串 x 以True
子字符串 y 。 |
x.matches(y) |
如果字符串 RE2 模式在编译时使用了已停用 Unicode 功能的 RE2::Latin1 选项。 |
x.lower() |
返回字符串 x 的小写值。 |
x.upper() |
返回字符串 x 的大写值。 |
x + y |
返回串联的字符串 xy 。 |
int(x) |
将 x 的字符串结果转换为 int
类型。转换后的字符串可用于使用标准算术运算符(例如 > 和 <= )进行整数比较。这仅适用于可以是整数的值。 |