CEL 比對器語言參考資料

一般運算語言 (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()** 的值取決於下列因素:
  • 原始 HTTP 要求:主機標頭
  • Proxy 隧道 HTTP CONNECT 要求:CONNECT 目標
source.matchTag(SECURE_TAG) 布林值

True (如果來源與 SECURE_TAG 相關聯)。

引數是安全標記的永久 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 如何解讀項目」。

inIpRange(IP_ADDRESS,
IP_RANGE)
布林值 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.headers['host'] 的便利性。

在大多數情況下,建議您使用 host()。

request.path 字串 要求的網址路徑。
request.query 字串

網址查詢格式為 name1=value&name2=value2,會顯示在要求的第一行。

不會執行任何解碼作業。

request.scheme 字串 網址通訊協定,例如 HTTP 或 HTTPS。這個屬性的所有值皆為小寫。
request.url() 字串

host() + request.path 的便利性。

不含通訊埠,且使用的主機值可能與主機標頭不同。

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)

如果字串 x 符合指定的 RE2 模式 y,則傳回 True。

RE2 模式是以 RE2::Latin1 選項編譯,該選項會停用萬國碼 (Unicode) 功能。

x.lower() 傳回字串 x 的小寫值。
x.upper() 傳回字串 x 的大寫值。
x + y 傳回連接字串 xy。
int(x) 將 x 的字串結果轉換為 int 類型。您可以使用轉換後的字串,比較整數與標準算術運算子 (例如 > 和 <=)。這項功能僅適用於整數值。