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} |
このフィールドには、受信した証明書リクエストで指定されたサブジェクトの識別名(共通名を含む)が含まれます。 例 { |
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 が付加されます。 例 { |
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'
次のステップ
- CEL の概要を確認する。
- 詳しくは、CEL の言語定義をご覧ください。
- 証明書テンプレートと発行ポリシーについて学習する。
- IAM 条件の概要を確認する。
- CA プールに証明書発行ポリシーを追加する方法を確認する。