CEL 比對器語言參考資料

一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的一般語意。Secure Web Proxy 會使用 CEL 條件子集,根據屬性資料做出布林值授權決定。一般來說,條件運算式由一或多個陳述式組成,並透過邏輯運算子 (&&||!) 連結。每個陳述式都會表達以屬性為基礎的控制規則,這些規則會套用至角色繫結,並最終決定是否允許存取。

屬性

定義安全網頁 Proxy 政策時,請使用工作階段屬性和應用程式屬性,說明政策適用的工作階段屬性或應用程式屬性。

SessionMatcher 所描述的工作階段屬性,適用於工作階段專屬屬性,例如來源 IP 位址、主機和 IP 範圍。ApplicationMatcher 所描述的應用程式屬性,適用於應用程式屬性,例如要求標頭、要求方法和要求路徑。

SessionMatcherApplicationMatcher 可用的屬性

下表說明適用於 SessionMatcherApplicationMatcher 的屬性。

屬性 屬性類型 說明
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 如果 xy 都是 True,則會傳回 True
x || y 如果 xy 或兩者皆為 True,則會傳回 True
!x 如果布林值 xFalse,則傳回 True。否則,如果布林值 xTrue,則會傳回 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 類型。您可以使用轉換後的字串,比較整數與標準算術運算子 (例如 ><=)。這項功能僅適用於整數值。