一般運算語言 (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 類型。您可以使用轉換後的字串,比較整數與標準算術運算子 (例如 > 和 <= )。這項功能僅適用於整數值。 |