Gebräuchliche Ausdruckssprache verwenden

Auf dieser Seite wird beschrieben, wie Sie die Common Expression Language (CEL) mit Richtlinien für die Zertifikatsausstellung, Zertifikatsvorlagen und Bedingungen für die Identitäts- und Zugriffsverwaltung (Identity and Access Management, IAM) für Ihren CA-Pool verwenden können.

Übersicht

Common Expression Language (CEL) ist eine Open-Source-Sprache, die nicht Turing-vollständig ist und gängige Semantiken für die Ausdrucksbewertung implementiert. Certificate Authority Service unterstützt CEL, um verschiedene Richtlinienkontrollen für die Zertifikatsausstellung zu erzwingen.

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

  • Ein flexibler Dialekt, der in den Richtlinien für die Zertifikatsausstellung und in den Zertifikatsvorlagen eines CA-Pools verwendet werden kann.
  • Ein eingeschränkter 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“ (Betreff) 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 Zertifikatvorlagen und Ausstellungsrichtlinien

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

  • Betreff: subject
  • SAN: subject_alt_names

Betreff

Sie können, wie in der Zertifikatsanfrage angegeben, alle Felder im Antragsteller-Domainnamen (einschließlich des allgemeinen Namens) eines Zertifikats validieren. Dazu verwenden Sie eine Variable vom Typ Subject und den Namen subject.

Subject ist eine Struktur mit den folgenden Feldern:

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

Subject Alternative Names (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-Structs, wobei jedes SAN vom Typ SubjectAltName ist.

SubjectAltName ist ein Typ, der die folgenden Felder enthält:

Typ Name
String Wert
[]Int32 oid
Enum Typ

Für den Typ SubjectAltName können die folgenden Werte verwendet werden:

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

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

Dafür sorgen, dass benutzerdefinierte SANs nur ein Satz 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

Verwenden Sie IAM-Bedingungen, um IAM-Rollenbindungen einem bedingten Ausdruck zu unterziehen. 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, die von IAM gespeichert und ausgewertet wird, um festzustellen, ob der gerade auszuführende 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 Subjekts (einschließlich des allgemeinen 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

    privateca.googleapis.com/subject_alt_names ist als 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. Jedem der angeforderten SANs ist sein Typ vorangestellt. 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 übereinstimmen in der Zertifikatsanfrage. 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

Sicherstellen, dass alle Subjekte als „Beispiel“ organisiert sind und der Ländercode auf US oder UK festgelegt

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'])

Sicherstellen, dass alle Zertifikate eine bestimmte Vorlage verwenden

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

Nächste Schritte