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 |
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 を使用すると、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} |
このフィールドには、受信証明書のリクエストで指定されたサブジェクト識別名(共通名を含む)が含まれます。 例 { |
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 プールに証明書発行ポリシーを追加する方法を学習する。