Common Expression Language verwenden

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

Überblick

Common Expression Language (CEL) ist eine Open-Source-Nicht-Turing-Komplettsprache, die eine gemeinsame Semantik für die Auswertung von Ausdrücken implementiert. Certificate Authority Service unterstützt CEL, um verschiedene Richtlinienkontrollen für die Zertifikatsausstellung durchzusetzen.

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

  • Ein flexibler Dialekt, der in den Zertifikatsausstellungsrichtlinien und Zertifikatsvorlagen eines Zertifizierungsstellenpools verwendet werden kann.
  • Ein begrenzter Dialekt, der in IAM-Bedingungen verwendet werden kann.

CEL-Dialekt für Zertifikatsausstellungsrichtlinien und Zertifikatsvorlagen

Beim Erstellen eines Zertifizierungsstellenpools oder einer Zertifikatsvorlage 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 Alternative“ (Betreff) und „Subject Alternative Name“ (SAN) validieren.

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

Weitere Informationen zu Zertifikatsvorlagen finden Sie unter Zertifikatvorlagen und Ausstellungsrichtlinien.

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

  • Betreff: subject
  • SAN: subject_alt_names

Betreff

Sie können alle Felder im Domainnamen eines Zertifikats, einschließlich des allgemeinen Namens, wie in der Zertifikatsanfrage angegeben, mit einer Variablen vom Typ Subject und dem Namen subject validieren.

Subject ist eine Struktur, die die folgenden Felder enthält:

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

Alternative Antragstellernamen (SANs)

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

SubjectAltName ist eine Struktur, die die folgenden Felder enthält:

Typ Name
String Wert
[]Int32 Oid
Enum Typ

Sie können die folgenden Werte für den Typ SubjectAltName 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

Ein spezifischen Klarnamen und eine Gruppe von Ländern sicherstellen

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

Dafür sorgen, dass alle DNS-Namen mit einem benutzerdefinierten String enden

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

Dafür sorgen, dass alle SANs vom Typ DNS oder EMAIL sind

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

Nur ein benutzerdefiniertes SAN mit einer bestimmten OID sicherstellen

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

Sicherstellen, dass benutzerdefinierte SANs nur aus einer Reihe von OIDs bestehen

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

Verwenden Sie IAM-Bedingungen, um IAM-Rollenbindungen an einen bedingten Ausdruck zu 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 von Kontextattributen für die Anfrage verweist und einen booleschen Wert ergibt. Nutzer legen Bedingungen für die Rollenbindungen in einer IAM-Richtlinie fest, die von IAM gespeichert und ausgewertet wird, um festzustellen, ob der demnächst auszuführende Vorgang zulässig ist.

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

Die folgenden Attribute werden während der CEL-Auswertung von IAM-Bedingungen verfügbar gemacht:

  • privateca.googleapis.com/subject

    Auf privateca.googleapis.com/subject kann als api.getAttribute('privateca.googleapis.com/subject', {}) zugegriffen werden.

Typ Beschreibung
map{string, string} Dieses Feld enthält den Subjekt-Distinguished Name (einschließlich des gemeinsamen Namens), wie in der eingehenden Zertifikatsanfrage angegeben.

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

    Auf privateca.googleapis.com/subject_alt_names kann als api.getAttribute('privateca.googleapis.com/subject_alt_names', []) zugegriffen werden.

Typ Beschreibung
list{string} Dieses Feld enthält alle angeforderten SANs, wie in der eingehenden Zertifikatsanfrage angegeben. Jedem der angeforderten SANs ist sein Typ vorangestellt. SANs mit unbekannten Typen wird die serialisierte 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

    Auf privateca.googleapis.com/template kann als api.getAttribute('privateca.googleapis.com/template', '') zugegriffen werden.

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 Attribut privateca.googleapis.com/template des CEL-Ausdrucks eine Projekt-ID angeben, müssen Sie beim Anfordern des Zertifikats auch eine Projekt-ID angeben. Wenn Sie im CEL-Ausdruck eine Projektnummer angeben, müssen Sie auch in der Zertifikatsanfrage eine Projektnummer angeben.

Beispielausdrücke

Es wird sichergestellt, dass für alle Fächer die Organisation als 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']

Sicherstellen, dass 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'])

Sicherstellen, dass alle Zertifikate eine bestimmte Vorlage verwenden

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

Nächste Schritte