Common Expression Language を使用する

このページでは、CA プールで、証明書発行ポリシー、証明書テンプレート、Identity and Access Management(IAM)条件を使用して Common Expression Language(CEL)を使用する方法について説明します。

概要

Common Expression Language(CEL)は、式の評価に共通のセマンティクスを実装するオープンソースの非チューリング完全言語です。Certificate Authority Service は、証明書の発行にさまざまなポリシー制御を適用するために CEL をサポートしています。

CA Service で使用できる CEL 言語は 2 つあります。

  • CA プールの証明書発行ポリシーと証明書テンプレートで使用できる柔軟な言語。
  • IAM 条件で使用できるより限定的な言語。

証明書発行ポリシーと証明書テンプレートの CEL 言語

CA プールまたは証明書テンプレートを作成するときに、証明書 ID の制約の一部として CEL 式を指定できます。CEL 式を使用すると、サブジェクトとサブジェクト代替名(SAN)フィールドを検証できます。

発行ポリシーの詳細については、CA プールに証明書発行ポリシーを追加するをご覧ください。

証明書テンプレートの詳細については、証明書テンプレートと発行ポリシーの概要をご覧ください。

CA プールと証明書テンプレートの ID 制約の CEL 言語は、サブジェクトと SAN のフィールドにアクセスして検証するための次の変数を公開します。

  • 件名: subject
  • SAN: subject_alt_names

件名

証明書リクエストで指定された、Subject 型の変数と名前 subject を使用して、証明書のサブジェクト ドメイン名(共通名を含む)のすべてのフィールドを検証できます。

Subject は、次のフィールドを含む構造体です。

タイプ 名前
String common_name
String country_code
String 組織
String organizational_unit
String 地域区分
String
String street_address
String postal_code

サブジェクト代替名(SAN)

subject_alt_names 変数を使用すると、証明書リクエストで指定されているすべての SAN を検証できます。subject_alt_names 変数には SAN 構造体のリストが含まれます。各 SAN は SubjectAltName 型です。

SubjectAltName は、次のフィールドを含む構造体です。

タイプ 名前
String
[]Int32 oid
Enum タイプ

SubjectAltName タイプには次の値を使用できます。

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

subject_alt_names 変数には、リクエストされたすべての SAN を含むリストが含まれます。

SAN では次のマクロを使用できます。

  • subject_alt_names.all(san, predicate)
  • subject_alt_names.exists(san, predicate)
  • subject_alt_names.exists_one(san, predicate)
  • subject_alt_names.filter(san, predicate)

マクロの詳細については、言語定義: マクロをご覧ください。

式の例

特定の一般名と国のセットを確実に指定する

subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")

すべての DNS 名の末尾がカスタム文字列になるようにする

subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))

すべての SAN が DNS または EMAIL のタイプになるようにする

subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )

特定の OID を持つ 1 つのカスタム SAN のみになるようにする

subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]

カスタム SAN が一連の OID のセットのみになるようにする

subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])

IAM ポリシーの CEL 言語

IAM の条件を使用して、IAM ロール バインディングを条件式に適用します。条件が true と評価された場合、IAM ロール バインディングは有効になり、それ以外の場合は無視されます。CA Service を使用すると、IAM 条件付きバインディングを CA プールに追加できます。

IAM 条件は、リクエストに関する一連のコンテキスト属性を参照し、ブール値として評価する CEL 式です。ユーザーは IAM ポリシーのロール バインディングに条件を設定します。この条件は IAM によって保存され、実行されるオペレーションが許可されているかどうかを確認するために評価されます。

IAM Conditions の詳細については、IAM Conditions の概要をご覧ください。

IAM 条件の CEL 評価では、次の属性が公開されます。

  • privateca.googleapis.com/subject

    privateca.googleapis.com/subject には api.getAttribute('privateca.googleapis.com/subject', {}) としてアクセスできます。

タイプ 説明
map{string, string} このフィールドには、受信証明書のリクエストで指定されたサブジェクト識別名(共通名を含む)が含まれます。



{
 'common_name': 'Foobar',
 'organization': 'Example LLC'
 'country_code' :'US'
 'organizational_unit':'Foobar'
 'locality':'Mountain View'
 'Province':'California'
 'street_address':'Foobar 22'
 'postal_code':55555
}
  • privateca.googleapis.com/subject_alt_names

    privateca.googleapis.com/subject_alt_names には api.getAttribute('privateca.googleapis.com/subject_alt_names', []) としてアクセスできます。

タイプ 説明
list{string} このフィールドには、受信証明書リクエストで指定された、リクエストされたすべての SAN が含まれます。リクエストされた各 SAN には接頭辞としてそのタイプが付加されます。タイプが不明な SAN には、そのタイプのシリアル化された OID が接頭辞として付加されます。



{
 'dns:foo.bar.com',
 'uri:spiffe://foo/ns/bar/sa/baz'
 'email:foo@bar.com'
 'ip:169.169.254.254'
 'custom:1.2.3.4.5.6.3:foobar'
}
  • privateca.googleapis.com/template

    privateca.googleapis.com/template には api.getAttribute('privateca.googleapis.com/template', '') としてアクセスできます。

タイプ 説明
String 使用された証明書テンプレート(存在する場合)。形式は {project_id}/-/{template_id} です。

: my-project-pki/-/workload_tls

IAM 条件で指定されるテンプレート名は、証明書リクエスト内のテンプレート名と一致する必要があります。したがって、CEL 式の privateca.googleapis.com/template 属性でプロジェクト ID を指定する場合は、証明書をリクエストするときにプロジェクト ID も指定する必要があります。CEL 式でプロジェクト番号を指定する場合は、証明書リクエストでもプロジェクト番号を指定する必要があります。

式の例

すべてのサブジェクトの組織が「Example」として設定され、国コードが US または UK に設定されるようにする

api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']

証明書リクエストに指定された DNS SAN のみが含まれるようにする

api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
        .hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])

すべての証明書で特定のテンプレートを使用するようにする

api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'

次のステップ