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

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

属性

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

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

SessionMatcherApplicationMatcher で使用できる属性

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

属性 属性タイプ 説明
source.ip 文字列 リクエストを送信したクライアントの IP アドレス。
source.port integer リクエストを送信したクライアント ポート。
destination.port integer Secure Web Proxy インスタンスがトラフィックを送信するアップストリーム ポート。
host() 文字列 DNS の解決とアップストリーム接続に使用されるホスト値。 ポートは含まれません。 値は以下よって決まります。
  • 未加工の 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) ブール値

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

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

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

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

ApplicationMatcher でのみ使用できる属性

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

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

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

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

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

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

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

request.scheme 文字列 HTTP 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 xy と等しい場合、True を返します。
x != y xy と等しくない場合、True を返します。
x && y xy の両方が True の場合、True を返します。
x || y xy、またはその両方が True の場合、True を返します。
!x ブール値 xFalse の場合は True を返し、ブール値 xTrue の場合は 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 型に変換します。変換された文字列は、><= などの標準の算術演算子による整数の比較に使用できます。これは、整数にできる値にのみ適用されます。