每條 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.ip 和 198.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 配額與限制」。
作業
以下參考資料說明可搭配屬性 (以 x、y 和 k 表示) 使用的運算子,用於定義規則運算式。
| 作業 | 運算式 | 說明 |
|---|---|---|
| 平等 | x == y |
如果 x 等於 y,則傳回 true。 |
| 相等、字串常值 | x == "foo" |
如果 x 等於指定的常數字串常值,則傳回 true。 |
| 相等、原始字串常值 | x == R"fo'o" |
如果 x 等於指定的原始字串文字 (不解譯逸出序列),則傳回 true。原始字串常值很適合用來表示本身必須使用逸出序列字元的字串。 |
| 邏輯 NOT | !x |
如果布林值 x 為 false,則傳回 true;如果布林值 x 為 true,則傳回 false。 |
| 不平等 | x != y |
如果 x 不等於 y,則傳回 true。 |
| 串連 | x + y |
傳回串連字串 xy。 |
| 邏輯 AND | x && y |
如果 x 和 y 均為 true,則傳回 true。 |
| 邏輯 OR | x || y |
如果 x 和/或 y 為 true,則傳回 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 位址或要求的網址路徑。
| 欄位 | 類型 | 欄位說明 |
|---|