設定自訂規則語言屬性

每條 Google Cloud Armor 安全性政策規則都有優先順序、相符條件和動作。Cloud Armor 會根據符合要求的最高優先順序規則採取行動。如果規則的優先順序低於優先順序最高的相符規則,系統就不會評估該規則,即使兩者具有相同的相符條件也一樣。

每項安全性政策規則都支援兩種比對條件:

  • 基本比對條件包含 IP 位址清單或 IP 位址範圍清單。使用 Google Cloud CLI 建立規則時,請使用 --src-ip-ranges 旗標定義基本比對條件。
  • 進階比對條件包含最多五個子運算式的運算式,可比對連入要求的各種屬性。使用 Google Cloud CLI 建立規則時,請使用 --expression 旗標定義進階比對條件。

本頁面將說明進階比對條件,以及用於在安全性政策規則的進階比對條件中編寫運算式的 Cloud Armor 自訂規則語言。Cloud Armor 自訂規則語言是一般運算語言 (CEL) 的子集。

以 Cloud Armor 自訂規則語言編寫的運算式需要兩個元件:

  • 屬性:要檢查的資料
  • 運算:如何使用資料

舉例來說,下列運算式會在 inIpRange 運算中使用 origin.ip198.51.100.0/24 屬性。在本例中,如果 origin.ip 位於 198.51.100.0/24 IP 位址範圍內,運算式會傳回 true

inIpRange(origin.ip, '198.51.100.0/24')

即使上一個範例運算式只比對用戶端 IP 位址,在 Cloud Armor 安全性政策規則中使用該範例運算式時,從配額角度來看,該規則仍會視為具有進階比對條件的規則。詳情請參閱「Cloud Armor 配額與限制」。

作業

以下參考資料說明可搭配屬性 (以 xyk 表示) 使用的運算子,用於定義規則運算式。

作業 運算式 說明
平等 x == y 如果 x 等於 y,則傳回 true
相等、字串常值 x == "foo" 如果 x 等於指定的常數字串常值,則傳回 true
相等、原始字串常值 x == R"fo'o" 如果 x 等於指定的原始字串文字 (不解譯逸出序列),則傳回 true。原始字串常值很適合用來表示本身必須使用逸出序列字元的字串。
邏輯 NOT !x 如果布林值 xfalse,則傳回 true;如果布林值 xtrue,則傳回 false
不平等 x != y 如果 x 不等於 y,則傳回 true
串連 x + y 傳回串連字串 xy
邏輯 AND x && y 如果 xy 均為 true,則傳回 true
邏輯 OR x || y 如果 x 和/或 ytrue,則傳回 true
包含子字串 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) 功能。
IP 位址在範圍內 inIpRange(x, y) 如果 IP 位址 x 包含在 IP 範圍 y 內,就會傳回 true
小寫 x.lower() 傳回字串 x 的小寫值。
Uppercase x.upper() 傳回字串 x 的大寫值。
Base64 解碼值 x.base64Decode() 傳回 x 的 Base64 解碼值,底線 (_) 和連字號 (-) 會先分別替換為正斜線 (/) 和加號 (+)。如果 x 不是有效的 Base64 值,則傳回 "" (空字串)。
機碼對應值 m['k'] 如果索引鍵 k 可用,則傳回字串對應 m 中索引鍵 k 的值;否則傳回錯誤。建議先使用 "has(m['k'])==true" 檢查是否有可用的位置。
在地圖中查看金鑰可用性 has(m['k']) 如果索引鍵 k 可在對應 m 中使用,則傳回 true
轉換為整數 int(x) x 的字串結果轉換為 int 型別。然後,您可以使用標準算術運算子 (例如 > 和 <=) 進行整數比較。這只適用於應為整數的值。
長度 size(x) 傳回字串 x 的長度。
解碼網址 x.urlDecode() 傳回 x 的網址解碼值。%## 格式的字元序列會替換為對應的非 ASCII 字元,+ 則會替換為空格。無效的編碼會照原樣傳回。
解碼網址 (Unicode) x.urlDecodeUni() 傳回 x 的網址解碼值。除了 urlDecode() 之外,也會處理 %u### 格式的 Unicode 字元序列。無效的編碼會照原樣傳回。
將 utf8 轉換為 Unicode x.utf8ToUnicode() 傳回 UTF-8 編碼 x小寫 Unicode 表示內容。
已存在 m.exists(k, expr) 如果對應 m 中至少有一個對應關係符合 expr,就會傳回 true,其中 k 代表每個對應關係的鍵。
已存在一個 m.exists_one(k, expr) 如果對應 m 中只有一個對應關係符合 expr,則傳回 true,其中 k 代表每個對應關係的鍵。
全部 m.all(k, expr) 如果對應 m 中的所有對應關係都符合 expr,則傳回 true,其中 k 代表每個對應關係的鍵。
篩選器 m.filter(k, expr) 傳回僅包含對應關係的對應項 (來自對應項 m),其中對應關係符合 expr,而 k 代表每個對應關係的鍵。
地圖 m.map(k, expr) 傳回清單,內含評估對應 m 中每個鍵的 expr 結果,其中 k 代表每個對應關係的鍵。

屬性

屬性代表來自傳入要求的資訊,例如用戶端 IP 位址或要求的網址路徑。

欄位 類型 欄位說明