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

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

属性

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

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

SessionMatcherApplicationMatcher で使用可能な属性

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

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

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

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

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

HOST_OR_URL が指定された名前付きリスト NAMED_LIST にある場合、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)
ブール値 TrueIP_ADDRESSinIpRange(source.ip, '1.2.3.0/24') などの IP_RANGE 内に含まれている場合)。IPv6 アドレスのサブネット マスクは /64 以下にしてください。

ApplicationMatcher でのみ使用できる属性

次の表は、ApplicationMatcher にのみ適用される属性を示したものです。

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

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

通常は host() を使用することをおすすめします。

request.path string リクエストした HTTP URL パス。
request.query string

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

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

request.scheme string HTTP URL スキーム(HTTP、HTTPS など)。この属性の値はすべて小文字です。
request.url() string

host() + request.path に便利です。

ポートは含まれず、ホストヘッダーとは異なるホスト値が使用されます。

request.useragent() string request.headers['user-agent'] と同等の利便性。

オペレーター

Secure Web Proxy では、単純な式のステートメントから複雑な論理式を作成するために使用できる演算子がいくつかサポートされています。Secure Web Proxy では、&&||,! などの論理演算子と、x.contains('y') などの文字列操作演算子がサポートされています。

論理演算子を使用すると、1 つの条件式で複数の変数を検証できます。たとえば、request.method == 'GET' && host().matches('.*\.example.com') は 2 つのステートメントを結合し、True の全体的な結果を生成するには、両方のステートメントが True である必要があります。

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

論理演算子

次の表に、Secure Web Proxy がサポートする論理演算子を示します。

式の例 説明
x == "foo" x が定数文字列リテラル引数と等しい場合、True を返します。
x == R"fo'o" x がエスケープ シーケンスを解釈しない所定の raw 文字列リテラルと等しい場合、True を返します。raw 文字列リテラルは、コードがシーケンス文字をエスケープするために使用する必要がある文字列を表現するのに便利です。
x == y xy と等しい場合、True を返します。
x != y xy と等しくない場合、True を返します。
x && y xy の両方が True の場合、True を返します。
x || y xy、またはその両方が True の場合、True を返します。
!x 戻り値Trueブール値の場合x=False 、またはFalseブール値の場合 x =True
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 型に変換します。変換された文字列は、><= などの標準の算術演算子との整数比較に使用できます。この方法は、整数にできる値に対してのみ機能します。