Common Expression Language verwenden

Auf dieser Seite wird beschrieben, wie Sie Common Expression Language (CEL) mit Richtlinien für die Zertifikatsausstellung, Zertifikatsvorlagen und IAM-Bedingungen (Identity and Access Management) in Ihrem Zertifizierungsstellenpool verwenden können.

Übersicht

Common Expression Language (CEL) ist eine Open-Source-Sprache ohne Turing-Vollständigkeit, die gängige Semantik für die Ausdrucksbewertung implementiert. Der Certificate Authority Service unterstützt CEL, um verschiedene Richtliniensteuerungen für die Zertifikatsausstellung durchzusetzen.

Es gibt zwei CEL-Dialekte, die mit dem CA-Dienst verwendet werden können:

  • Ein flexibler Dialekt, der in den Zertifikatsausstellungsrichtlinien und Zertifikatsvorlagen eines CA-Pools verwendet werden kann.
  • Ein eingeschränkterer Dialekt, der in IAM-Bedingungen verwendet werden kann.

CEL-Dialekt für Richtlinien zur Zertifikatsausstellung und Zertifikatsvorlagen

Wenn Sie einen CA-Pool oder eine Zertifikatvorlage erstellen, können Sie einen CEL-Ausdruck als Teil der Einschränkungen für die Zertifikatsidentität angeben. Mit dem CEL-Ausdruck können Sie die Felder „Subject“ und „Subject Alternative Name“ (SAN) validieren.

Weitere Informationen zu Ausstellungsrichtlinien finden Sie unter CA-Pool eine Zertifikatsausstellungsrichtlinie hinzufügen.

Weitere Informationen zu Zertifikatsvorlagen finden Sie unter Übersicht über Zertifikatsvorlagen und Richtlinien zur Ausstellung.

Der CEL-Dialekt für die Identitätsbeschränkungen von CA-Pools und Zertifikatvorlagen stellt die folgenden Variablen für den Zugriff auf und die Validierung der Felder „Subject“ und „SAN“ bereit:

  • Betreff: subject
  • SAN: subject_alt_names

Betreff

Sie können alle Felder im Domainnamen des Zertifikatsinhabers (einschließlich des allgemeinen Namens) wie im Zertifikatsantrag angegeben mit einer Variablen vom Typ Subject und dem Namen subject validieren.

Subject ist eine Struktur mit den folgenden Feldern:

Typ Name
String common_name
String country_code
String Organisation
String organizational_unit
String Ort
String Provinz
String street_address
String postal_code

Subject Alternative Names (SANs)

Sie können alle SANs, die in der Zertifikatsanfrage angegeben sind, mit der Variablen subject_alt_names validieren. Die Variable subject_alt_names enthält eine Liste von SAN-Structs, wobei jedes SAN vom Typ SubjectAltName ist.

SubjectAltName ist ein Typ mit den folgenden Feldern:

Typ Name
String Wert
[]Int32 oid
Enum Typ

Sie können die folgenden Werte für den SubjectAltName-Typ verwenden:

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

Die Variable subject_alt_names enthält eine Liste mit allen angeforderten SANs.

Sie können die folgenden Makros für SANs verwenden:

  • 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)

Weitere Informationen zu Makros finden Sie unter Sprachdefinition: Makros.

Beispielausdrücke

Für einen bestimmten gängigen Namen und eine Reihe von Ländern sorgen

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

Prüfen, ob alle DNS-Namen mit einem benutzerdefinierten String enden

subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))

Prüfen, ob alle SANs vom Typ DNS oder EMAIL sind

subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )

Prüfen, ob nur eine benutzerdefinierte SAN mit einer bestimmten OID vorhanden ist

subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]

Prüfen, ob benutzerdefinierte SANs nur eine Reihe von OIDs sind

subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])

CEL-Dialekt für IAM-Richtlinien

Mit IAM-Bedingungen können Sie IAM-Rollenbindungen einem Bedingungsausdruck unterwerfen. Wenn die Bedingung true ergibt, ist die IAM-Rollenbindung wirksam. Andernfalls wird sie ignoriert. Mit CA Service können Sie einem CA-Pool bedingte IAM-Bindungen hinzufügen.

Die IAM-Bedingung ist ein CEL-Ausdruck, der auf eine Reihe kontextbezogener Attribute zur Anfrage verweist und als boolescher Wert ausgewertet wird. Nutzer legen Bedingungen für die Rollenbindungen in einer IAM-Richtlinie fest. Diese wird von IAM gespeichert und ausgewertet, um zu prüfen, ob der Vorgang zulässig ist.

Weitere Informationen zu IAM-Bedingungen finden Sie in der Übersicht über IAM-Bedingungen.

Die folgenden Attribute werden bei der CEL-Bewertung von IAM-Bedingungen freigegeben:

  • privateca.googleapis.com/subject

    Der privateca.googleapis.com/subject ist unter api.getAttribute('privateca.googleapis.com/subject', {}) zugänglich.

Typ Beschreibung
map{string, string} Dieses Feld enthält den Distinguished Name des Eigentümers (einschließlich des Common Name), wie er in der eingehenden Zertifikatsanfrage angegeben ist.

Beispiel

{
 '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

    Der privateca.googleapis.com/subject_alt_names ist unter api.getAttribute('privateca.googleapis.com/subject_alt_names', []) zugänglich.

Typ Beschreibung
list{string} Dieses Feld enthält alle angeforderten SANs, wie in der eingehenden Zertifikatsanfrage angegeben. Jede der angeforderten SANs hat ein Präfix mit ihrem Typ. SANs mit unbekannten Typen werden mit der serialisierten OID des Typs vorangestellt.

Beispiel

{
 '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

    Der privateca.googleapis.com/template ist unter api.getAttribute('privateca.googleapis.com/template', '') zugänglich.

Typ Beschreibung
String Die verwendete Zertifikatsvorlage, falls vorhanden. Das Format ist {project_id}/-/{template_id}.

Beispiel: my-project-pki/-/workload_tls

Der in der IAM-Bedingung angegebene Vorlagenname muss mit dem Vorlagennamen in der Zertifikatsanfrage übereinstimmen. Wenn Sie also im privateca.googleapis.com/template-Attribut des CEL-Ausdrucks eine Projekt-ID angeben, müssen Sie auch beim Anfordern des Zertifikats eine Projekt-ID angeben. Wenn Sie im CEL-Ausdruck eine Projektnummer angeben, müssen Sie auch in der Zertifikatsanfrage eine Projektnummer angeben.

Beispielausdrücke

Achten Sie darauf, dass für alle Personen die Organisation „Beispiel“ und der Ländercode US oder UK festgelegt ist.

api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']

Prüfen, ob die Zertifikatsanfrage nur die angegebenen DNS-SANs enthält

api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
        .hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])

Dafür sorgen, dass alle Zertifikate eine bestimmte Vorlage verwenden

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

Nächste Schritte