Google Cloud Armor の各セキュリティ ポリシー ルールには、優先度、一致条件、アクションがあります。実行されるのは、リクエストに一致する最も優先度の高いルールのアクションです。その他のルールは、同じ一致条件が設定されていても優先度が低ければ評価されません。
各セキュリティ ポリシー ルールでは 2 種類の一致条件を指定できます。
- 基本一致条件。IP アドレスまたは IP アドレス範囲のリストで構成されます。基本一致条件は、Google Cloud CLI を使用してルールを作成するときに
--src-ip-rangesフラグを使用して定義します。 - 高度な一致条件。受信リクエストのさまざまな属性と照合できる最大 5 つのサブ式を含む式で構成されます。高度な一致条件は、Google Cloud CLI を使用してルールを作成するときに
--expressionフラグを使用して定義します。
このページでは、高度な一致条件と、セキュリティ ポリシー ルールで高度な一致条件の式を記述するために使用する Cloud Armor のカスタムルール言語について説明します。Cloud Armor のカスタムルール言語は Common Expression Language(CEL)のサブセットです。Cloud Armor のカスタムルール言語で記述する式には、次の 2 つのコンポーネントが必要です。
- 属性: 検査するデータ
- 演算: データの使用方法
たとえば、次の式では、演算 inIpRange() で属性 origin.ip と 9.9.9.0/24 が使用されています。この式は、origin.ip が 9.9.9.0/24 の IP アドレス範囲に含まれている場合、true を返します。
inIpRange(origin.ip, '9.9.9.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 パターンは、Unicode 機能を無効にする RE2::Latin1 オプションを使用してコンパイルされます。 |
| 範囲内の IP アドレス | inIpRange(x, y) |
IP アドレス x が IP 範囲 y に含まれている場合に true を返します。 |
| 小文字で表記 | x.lower() |
文字列 x を小文字で表記した値を返します。 |
| 大文字で表記 | x.upper() |
文字列 x を大文字で表記した値を返します。 |
| Base64 でデコードされた値 | x.base64Decode() |
x を Base64 でデコードした値を返します。文字 _ - は、最初に / + にそれぞれ置き換えられます。x が有効な Base64 値でない場合は ""(空の文字列)を返します。 |
| キーマップ値 | m['k'] |
文字列間マップ m でキー k が使用可能な場合に k の値を返します。k が使用可能でない場合はエラーを返します。k が使用可能かどうかを "has(m['k'])==true" によって最初に確認することをおすすめします。 |
| マップでキーの可用性を確認する | has(m['k']) |
マップ m でキー k が使用可能な場合に true を返します。 |
| 整数に変換 | int(x) |
文字列の結果である x を int 型に変換します。変換後は、> や <= などの標準の算術演算子を使用して整数の比較が行えます。これは、整数とみなせる文字列の場合にのみ機能します。 |
| 長さ | size(x) |
文字列 x の長さを返します。 |
| URL デコード | x.urlDecode() |
x を URL デコードした値を返します。%## 形式の文字シーケンスは ASCII でない同等の文字に置き換えられ、+ はスペースに置き換えられます。無効なエンコードはそのまま返されます。 |
| URL デコード(Unicode) | x.urlDecodeUni() |
x を URL デコードした値を返します。urlDecode() に加えて、%u### 形式の Unicode 文字シーケンスも処理します。無効なエンコードはそのまま返されます。 |
| UTF-8 を Unicode に変換 | x.utf8ToUnicode() |
UTF-8 でエンコードされた x を小文字で表記した Unicode 表現を返します。 |