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 プールと証明書テンプレートの 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 プールに証明書発行ポリシーを追加する方法を学習する。