一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的一般語意。Secure Web Proxy 會使用 CEL 條件子集,根據屬性資料做出布林值授權決定。一般來說,條件運算式由一或多個陳述式組成,並透過邏輯運算子 (&&、|| 或 !) 連結。每個陳述式都會表達以屬性為基礎的控制規則,這些規則會套用至角色繫結,並最終決定是否允許存取。
屬性
定義安全網頁 Proxy 政策時,請使用工作階段屬性和應用程式屬性,說明政策適用的工作階段屬性或應用程式屬性。
由 SessionMatcher 所描述的工作階段屬性,適用於工作階段專屬屬性,例如來源 IP 位址、主機和 IP 範圍。ApplicationMatcher 所描述的應用程式屬性,適用於應用程式屬性,例如要求標頭、要求方法和要求路徑。
SessionMatcher 和 ApplicationMatcher 可用的屬性
下表說明適用於 SessionMatcher 和 ApplicationMatcher 的屬性。
| 屬性 | 屬性類型 | 說明 | 
|---|---|---|
| source.ip | 字串 | 傳送要求的用戶端 IP 位址。 | 
| source.port | 整數 | 傳送要求的用戶端通訊埠。 | 
| destination.port | 整數 | Secure Web Proxy 執行個體傳送流量的上游通訊埠。 | 
| host() | 字串 | 用於 DNS 解析和上游連線的主機值。
        不含通訊埠。
        **host()** 的值取決於下列因素: 
 | 
| 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 | 地圖 | 要求標頭的字串對字串對應。如果標頭含有多個值,這項對應中的值會是以半形逗號分隔的字串,當中包含標頭的所有值。這項對應中的所有鍵都是小寫。 | 
| request.method | 字串 | 要求方法,例如 GET 或 POST。 | 
| request.host | 字串 | 相當於  在大多數情況下,建議您使用  | 
| request.path | 字串 | 要求的網址路徑。 | 
| request.query | 字串 | 網址查詢格式為  不會執行任何解碼作業。 | 
| request.scheme | 字串 | 網址通訊協定,例如 HTTP 或 HTTPS。這個屬性的所有值皆為小寫。 | 
| request.url() | 字串 | 
 不含通訊埠,且使用的主機值可能與主機標頭不同。 | 
| request.useragent() | 字串 | 相當於 request.headers['user-agent']的便利性。 | 
運算子
Secure Web Proxy 支援多種運算子,可用於從簡單的運算式陳述式建立複雜的邏輯運算式。Secure Web Proxy 支援邏輯運算子 (例如 &&、||, 和 !) 和字串操作運算子 (例如 x.contains('y'))。
邏輯運算子可讓您在條件運算式中驗證多個變數。舉例來說,request.method == 'GET' && host().matches('.*\.example.com') 會彙整兩個陳述式,且要求兩個陳述式都必須是 True,才能產生 True 的整體結果。
字串操作運算子會比對您定義的字串或子字串,讓您建立規則來控管資源存取權,而無須列出所有可能的組合。
邏輯運算子
下表說明安全 Web Proxy 支援的邏輯運算子。
| 運算式範例 | 說明 | 
|---|---|
| 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鍵,系統會傳回錯誤,導致評估中的規則不相符。 | 
字串操控運算子
下表說明 Secure Web Proxy 支援的字串操作運算子。
| 運算式 | 說明 | 
|---|---|
|  x.contains(y)  | 如果字串 x包含子字串y,就會傳回True。 | 
|  x.startsWith(y)  | 如果字串 x開頭為子字串y,則傳回True。 | 
|  x.endsWith(y)  | 如果字串 x結尾為子字串y,則傳回True。 | 
|  x.matches(y)  | 如果字串  RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。 | 
|  x.lower()  | 傳回字串 x的小寫值。 | 
|  x.upper()  | 傳回字串 x的大寫值。 | 
|  x + y  | 傳回連接字串 xy。 | 
|  int(x)  | 將 x的字串結果轉換為int類型。您可以使用轉換後的字串,比較整數與標準算術運算子 (例如>和<=)。這項功能僅適用於整數值。 |