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

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

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

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

種類 名前
String value
[]Int32 oid
Enum type

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 を使用すると、CA プールに IAM 条件付きバインディングを追加できます。

IAM 条件は、リクエストに関する一連のコンテキスト属性を参照し、ブール値と評価する CEL 式です。IAM ポリシーでロール バインディングの条件を設定します。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'

次のステップ