Utilisez le langage courant d'expression

Cette page explique comment utiliser le langage CEL (Common Expression Language) avec des stratégies d'émission de certificats, des modèles de certificat et des conditions IAM (Identity and Access Management) au niveau de votre pool d'autorités de certification.

Présentation

Le Common Expression Language (CEL) est un langage Open Source complet non-Turing qui implémente la sémantique courante pour l'évaluation des expressions. Le service Certificate Authority Service est compatible avec le CEL afin d'appliquer divers contrôles de stratégie pour l'émission de certificats.

Deux dialectes CEL peuvent être utilisés avec CA Service:

  • Dialecte flexible pouvant être utilisé dans les stratégies d'émission de certificats et les modèles de certificat 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 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 la page Présentation des modèles de certificat et des règles d'émission.

Le dialecte CEL des 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 "subject" 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 du nom subject.

Subject est une structure contenant les champs suivants:

Type Nom
String common_name
String country_code
String organisation
String organizational_unit
String localité
String région
String street_address
String postal_code

Noms d'objet alternatifs (SAN)

Vous pouvez valider tous les SAN comme spécifié dans la demande de certificat à l'aide de la variable subject_alt_names. La variable subject_alt_names contient une liste de structs SAN, où chaque SAN est de type SubjectAltName.

SubjectAltName est une structure contenant 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 de 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 Définition du langage: macros.

Exemples d'expressions

Choisir un nom commun spécifique et un ensemble de pays

subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")

Vérifier 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 )

Garantir 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 des liaisons de rôle 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 référence un ensemble d'attributs contextuels concernant la requête et qui 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 que api.getAttribute('privateca.googleapis.com/subject', {}).

Type Description
map{string, string} Ce champ contient le nom distinctif de l'objet (y compris le nom commun) tel que spécifié dans la requête de certificat entrante.

Exemple

{
 'common_name': 'Foobar',
 'organization': 'Example LLC'
 'country_code' :'US'
 'organizational_unit':'Foobar'
 'locality':'Mountain View'
 'Province':'California'
 'street_address':'Foobar 22'
 'postal_code':55555
}
  • privateca.googleapis.com/subject_alt_names

    privateca.googleapis.com/subject_alt_names est accessible en tant que api.getAttribute('privateca.googleapis.com/subject_alt_names', []).

Type Description
list{string} Ce champ contient tous les SAN demandés, comme indiqué dans la requête de certificat entrante. Le nom de chacun des SAN demandés 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

{
 'dns:foo.bar.com',
 'uri:spiffe://foo/ns/bar/sa/baz'
 'email:foo@bar.com'
 'ip:169.169.254.254'
 'custom:1.2.3.4.5.6.3:foobar'
}
  • privateca.googleapis.com/template

    privateca.googleapis.com/template est accessible en tant que api.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 de la demande de certificat. Ainsi, si vous indiquez un ID de projet dans l'attribut privateca.googleapis.com/template de l'expression CEL, vous devez également spécifier un ID de projet lorsque vous demandez le certificat. Si vous fournissez un numéro de projet dans l'expression CEL, vous devez également fournir un numéro de projet dans la requête de certificat.

Exemples d'expressions

S'assurer que l'organisation est définie comme "Exemple" pour toutes les matières 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 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'])

Vérifier que tous les certificats utilisent un modèle spécifique

api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'

Étapes suivantes