Utiliser Common Expression Language
Cette page explique comment utiliser le langage CEL (Common Expression Language) avec des stratégies d'émission de certificats, des modèles de certificats et des conditions IAM (Identity and Access Management) sur votre pool d'autorités de certification.
Présentation
Le langage CEL (Common Expression Language) est un langage complet Open Source non Turing qui implémente une sémantique commune pour l'évaluation des expressions. Certificate Authority Service est compatible avec le CEL pour appliquer différents contrôles de stratégie à l'émission de certificats.
Deux dialectes CEL peuvent être utilisés avec le service d'autorité de certification :
- Un dialecte flexible qui peut être utilisé dans les règles d'émission de certificats et les modèles de certificats d'un pool d'autorités de certification.
- Dialecte plus limité pouvant être utilisé dans les conditions IAM.
Dialecte CEL pour les stratégies d'émission de certificats et les modèles de certificat
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é de 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 la section Ajouter une stratégie d'émission de certificats à un pool d'autorités de certification.
Pour en savoir plus sur les modèles de certificat, consultez Présentation des modèles de certificat et des règles d'émission
Le dialecte CEL pour les contraintes d'identité des pools d'autorités de certification et des modèles de certificat 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 de l'objet 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’objet 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
:
DNS
URI
EMAIL
IP_ADDRESS
CUSTOM
La variable subject_alt_names
contient une liste avec tous les SAN demandés.
Vous pouvez utiliser les macros suivantes sur 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 la section Définition du langage : macros.
Exemples d'expressions
Veiller à utiliser 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 )
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. Le service CA 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 concernant la requête et renvoie une valeur booléenne. Les utilisateurs définissent des conditions sur les liaisons de rôles dans une stratégie IAM, qui est stockée par IAM et évaluée pour voir si l'opération sur le point d'être effectuée est autorisée.
Pour en savoir plus sur les conditions IAM, consultez la page Présentation des conditions IAM.
Les attributs suivants sont exposés lors de l'évaluation CEL des conditions IAM:
privateca.googleapis.com/subject
privateca.googleapis.com/subject
est accessible en tant queapi.getAttribute('privateca.googleapis.com/subject', {})
.
Type | Description |
---|---|
map{string, string} |
Ce champ contient le nom distinctif du sujet (y compris le nom commun) tel qu'il est spécifié dans la demande de certificat entrante. Exemple { |
privateca.googleapis.com/subject_alt_names
privateca.googleapis.com/subject_alt_names
est accessible en tant queapi.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.
Type | Description |
---|---|
list{string} |
Ce champ contient tous les SAN demandés tels que spécifiés dans la demande de certificat entrante. Chaque SAN demandé est précédé de son type. Les SAN de types inconnus sont précédés de l'OID sérialisé du type. Exemple { |
privateca.googleapis.com/template
privateca.googleapis.com/template
est accessible en tant queapi.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 |
Le nom du modèle fourni dans la condition IAM doit correspondre au nom du modèle
dans 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 requête de certificat.
Exemples d'expressions
Vérifier que l'organisation est définie sur "Exemple" et le code pays sur US
ou UK
pour tous les sujets
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
S'assurer que la requête de certificat n'inclut que les SAN DNS donné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'
Étape suivante
- Consultez la présentation de CEL.
- En savoir plus sur la définition de langage pour le 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 stratégie d'émission de certificats à un pool d'autorités de certification.