Utiliser Common Expression Language
Cette page explique comment utiliser le Common Expression Language (CEL) avec les règles d'émission de certificats, les modèles de certificats et les conditions Identity and Access Management (IAM) dans votre pool d'autorités de certification.
Présentation
Le CEL (Common Expression Language) est un langage Open Source non Turing-complet qui implémente une sémantique commune pour l'évaluation des expressions. Certificate Authority Service est compatible avec CEL pour appliquer différents contrôles de règles pour l'émission de certificats.
Deux dialectes CEL peuvent être utilisés avec CA Service :
- Dialecte flexible pouvant être utilisé dans les modèles de certificat et les règles d'émission de certificats d'un pool d'autorités de certification.
- Dialecte plus limité pouvant être utilisé dans les conditions IAM.
Dialecte CEL pour les règles d'émission de certificats et les modèles de certificats
Lorsque vous créez un pool d'autorités de certification ou un modèle de certificat, vous pouvez spécifier une expression CEL dans les contraintes d'identité du certificat. L'expression CEL vous permet de valider les champs "Objet" et "Autre nom de l'objet (SAN)".
Pour en savoir plus sur les règles d'émission, consultez Ajouter des règles d'émission de certificats.
Pour en savoir plus sur les modèles de certificat, consultez Présentation des contrôles des règles.
Le dialecte CEL pour les contraintes d'identité des pools d'autorités de certification et des modèles de certificats expose les variables suivantes pour accéder aux champs "Objet" et "SAN" et les valider :
- Objet :
subject - SAN :
subject_alt_names
Objet
Vous pouvez valider tous les champs du nom de domaine du sujet d'un certificat (y compris le nom commun), comme spécifié dans la demande de certificat à l'aide d'une variable de type Subject et de nom subject.
Subject est une structure qui contient les champs suivants :
| Type | Nom |
|---|---|
String |
common_name |
String |
country_code |
String |
organisation |
String |
organizational_unit |
String |
localité |
String |
province |
String |
street_address |
String |
postal_code |
Noms d'objets alternatifs (SAN)
Vous pouvez valider tous les SAN spécifiés dans la demande de certificat à l'aide de la variable subject_alt_names. La variable subject_alt_names contient une liste de structures SAN, où chaque SAN est de type SubjectAltName.
SubjectAltName est une structure qui contient les champs suivants :
| Type | Nom |
|---|---|
String |
valeur |
[]Int32 |
oid |
Enum |
type |
Vous pouvez utiliser les valeurs suivantes pour le type SubjectAltName :
DNSURIEMAILIP_ADDRESSCUSTOM
La variable subject_alt_names contient une liste de tous les SAN demandés.
Vous pouvez utiliser les macros suivantes dans les 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)
Pour en savoir plus sur les macros, consultez Définition du langage : macros.
Exemples d'expressions
S'assurer d'avoir un nom commun spécifique et un ensemble de pays
subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")
S'assurer que tous les noms DNS se terminent par une chaîne personnalisée
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
S'assurer que tous les SAN sont de type DNS ou EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
S'assurer qu'il n'y a qu'un seul SAN personnalisé avec un OID spécifique
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
S'assurer que les SAN personnalisés ne sont qu'un ensemble d'OID
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
Dialecte CEL pour les stratégies IAM
Utilisez des conditions IAM pour soumettre les liaisons de rôles IAM à une expression conditionnelle. Si la condition renvoie true, la liaison de rôle IAM est effective. Sinon, elle est ignorée. CA Service vous permet d'ajouter des liaisons conditionnelles IAM à un pool d'autorités de certification.
La condition IAM est une expression CEL qui fait référence à un ensemble d'attributs contextuels relatifs à la requête et renvoie une valeur booléenne. Les utilisateurs définissent des conditions sur les liaisons de rôle dans une stratégie IAM, qui est stockée par IAM et évaluée pour déterminer si l'opération qui va être effectuée est autorisée.
Pour en savoir plus sur les conditions IAM, consultez la présentation des conditions IAM.
Les attributs suivants sont exposés lors de l'évaluation CEL des conditions IAM :
privateca.googleapis.com/subjectLe
privateca.googleapis.com/subjectest accessible viaapi.getAttribute('privateca.googleapis.com/subject', {}).
| Type | Description |
|---|---|
map{string, string} |
Ce champ contient le nom unique du sujet (y compris le nom commun) spécifié dans la demande de certificat entrante. Exemple { |
privateca.googleapis.com/subject_alt_namesLe
privateca.googleapis.com/subject_alt_namesest accessible viaapi.getAttribute('privateca.googleapis.com/subject_alt_names', []).
| Type | Description |
|---|---|
list{string} |
Ce champ contient tous les SAN demandés, tels qu'ils sont spécifiés dans la demande de certificat entrante. Chacun des SAN demandés est précédé de son type. Les SAN dont le type est inconnu sont précédés de l'OID sérialisé du type. Exemple { |
privateca.googleapis.com/templateLe
privateca.googleapis.com/templateest accessible viaapi.getAttribute('privateca.googleapis.com/template', '').
| Type | Description |
|---|---|
String |
Modèle de certificat utilisé, le cas échéant. Le format est {project_id}/-/{template_id}.Exemple : my-project-pki/-/workload_tls |
La syntaxe du modèle utilise {project_id}/-/{template_id} au lieu du nom complet de la ressource standard projects/{project_id}/locations/{location}/certificateTemplates/{template_id}, car les modèles de certificat doivent résider au même emplacement que le pool d'autorités de certification.
Dans ce format, le tiret (-) sert de caractère générique d'emplacement, ce qui permet de conserver des conditions CEL concises, lisibles et indépendantes de l'emplacement.
Le nom du modèle fourni dans la condition IAM doit correspondre à celui de la demande de certificat. Par conséquent, si vous fournissez un ID de projet dans l'attribut privateca.googleapis.com/template de l'expression CEL, vous devez également fournir un ID de projet lorsque vous demandez le certificat. Si vous fournissez un numéro de projet dans l'expression CEL, vous devez également en fournir un dans la demande de certificat.
Exemples d'expressions
S'assurer que l'organisation de tous les sujets est définie sur "Exemple" et que le code pays est défini sur US ou UK
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
S'assurer que la demande de certificat n'inclut que les SAN DNS indiqués
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
S'assurer que tous les certificats utilisent un modèle spécifique
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
Étapes suivantes
- Consultez la présentation de CEL.
- En savoir plus sur la définition du langage CEL
- En savoir plus sur les modèles de certificats et les règles d'émission
- Consultez la présentation des conditions IAM.
- Découvrez comment ajouter une règle d'émission de certificats à un pool d'autorités de certification.