CEL マッチャーの言語リファレンス

Common Expression Language(CEL)は、式の評価に共通のセマンティクスを実装するオープンソースの非チューリング完全言語です。Secure Web Proxy は、CEL 条件のサブセットを使用して、属性データに基づいてブール値の承認の決定を行います。一般に、条件式は論理演算子(&&、||、または!)で結合された 1 つ以上のステートメントから構成されます。論理演算子は最大で 12 個まで使用できます。各ステートメントは、ロール バインディングに適用される属性ベースの制御ルールを表します。これにより、最終的にアクセスが許可されるかどうかが決まります。

属性

セッション属性とアプリケーション属性は、ポリシーが適用されるセッション属性またはアプリケーション属性を記述する  Secure Web Proxy ポリシーを定義するときに使用します。

SessionMatcher で記述されるセッション属性は、送信元 IP アドレス、ホスト、IP 範囲などのセッション固有の属性に適用されます。ApplicationMatcher で記述されるアプリケーション属性は、リクエスト ヘッダー、リクエスト メソッド、リクエストパスなどのアプリケーション属性に適用されます。

SessionMatcher と ApplicationMatcher で使用できる属性

次の表に、SessionMatcher と ApplicationMatcher の両方に適用される属性を示します。

属性 属性タイプ 説明
source.ip 文字列 リクエストを送信したクライアントの IP アドレス。
source.port integer リクエストを送信したクライアント ポート。
destination.port integer Secure Web Proxy インスタンスがトラフィックを送信するアップストリーム ポート。
host() 文字列 DNS の解決とアップストリーム接続に使用されるホスト値。 ポートは含まれません。 **host()** の値は、次のように決まります。
  • 未加工の HTTP リクエスト: Host ヘッダー
  • プロキシ トンネル HTTP CONNECT リクエスト: CONNECT ターゲット
source.matchTag(SECURE_TAG) ブール値

ソースが SECURE_TAG に関連付けられている場合は、True。

引数は、セキュアタグの永続 ID です(source.matchTag('tagValues/123456') など)。

source.matchServiceAccount(SERVICE_ACCOUNT) ブール値 ソースが SERVICE_ACCOUNT に関連付けられている場合(source.matchServiceAccount('x@my-project.iam.gserviceaccount.com') など)は True。
inUrlList(HOST_OR_URL, NAMED_LIST) ブール値

True: 指定された名前付きリスト NAMED_LIST に HOST_OR_URL が存在する場合。次に例を示します。

  • inUrlList(host(), 'projects/1234/locations/us-east1/urlLists/allowed-repos')
  • inUrlList(request.url(), 'projects/1234/locations/us-east1/urlLists/allowed-repos')

host() など、UrlList パターンがスラッシュ(/)を含まない値と照合される場合は、パターンのドメイン部分のみが照合されます。詳細については、UrlList がエントリを解釈する方法をご覧ください。

inIpRange(IP_ADDRESS,
IP_RANGE)
ブール値 IP_ADDRESS が IP_RANGE に含まれている場合(inIpRange(source.ip, '1.2.3.0/24') など)は True。IPv6 アドレスのサブネット マスクは /64 以下にしてください。

ApplicationMatcher でのみ使用できる属性

次の表に、ApplicationMatcher にのみ適用される属性を示します。

属性 属性タイプ 説明
request.headers 地図 リクエスト ヘッダーの文字列間マップ。ヘッダーに複数の値が含まれている場合、このマップの値はヘッダーのすべての値のカンマ区切り文字列になります。このマップのキーはすべて小文字です。
request.method 文字列 リクエスト メソッド(GET や POST など)。
request.host 文字列

request.headers['host'] と同等の利便性。

ほとんどの場合、host() を使用することをおすすめします。

request.path 文字列 リクエストされた URL パス。
request.query 文字列

リクエストの第 1 行に現れるような、name1=value&name2=value2 形式の URL クエリ。

デコードは行われません。

request.scheme 文字列 URL スキーム(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') は 2 つのステートメントを結合し、全体的な結果として True を生成するには両方のステートメントが True である必要があります。

文字列操作演算子は、定義した文字列または部分文字列と照合します。これにより、考えられるすべての組み合わせを一覧参照することなく、リソースへのアクセスを制御するルールを開発できます。

論理演算子

次の表に、Secure 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)

文字列 x が指定された RE2 パターン y と一致する場合、True を返します。

RE2 パターンは、Unicode 機能を無効にする RE2::Latin1 オプションを使用してコンパイルされます。

x.lower() 文字列xの小文字の値を返します。
x.upper() 文字列xの大文字の値を返します。
x + y 連結された文字列 xy を返します。
int(x) x の文字列の結果を int 型に変換します。変換された文字列を使用して、> や <= などの標準の算術演算子で整数を比較できます。これは整数値でのみ機能します。