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) für Ihren CA-Pool verwenden können.

Übersicht

Common Expression Language (CEL) ist eine Open-Source-Sprache ohne Turing-Vollständigkeit, die eine gemeinsame Semantik für die Auswertung von Ausdrücken implementiert. Der Certificate Authority Service unterstützt CEL, um verschiedene Richtlinienkontrollen für die Zertifikatsausstellung zu erzwingen.

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

  • Ein flexibler Dialekt, der in den Richtlinien für die Zertifikatsausstellung und Zertifikatsvorlagen eines CA-Pools verwendet werden kann.
  • Ein eingeschränkterer Dialekt, der in IAM-Bedingungen verwendet werden kann.

CEL-Dialekt für Richtlinien für die Zertifikatsausstellung und Zertifikatsvorlagen

Wenn Sie einen CA-Pool oder eine Zertifikatsvorlage 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 für den Inhaber und den alternativen Inhabernamen (Subject Alternative Name, SAN) validieren.

Weitere Informationen zu Ausstellungsrichtlinien finden Sie unter Richtlinien für die Zertifikatsausstellung hinzufügen.

Weitere Informationen zu Zertifikatsvorlagen finden Sie unter Übersicht über Richtlinienkontrollen.

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

  • Inhaber: subject
  • SAN: subject_alt_names

Inhaber

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

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

Typ Name
String common_name
String country_code
String organization
String organizational_unit
String locality
String province
String street_address
String postal_code

Alternative Inhabernamen (SANs)

Sie können alle SANs validieren, wie in der Zertifikatsanfrage angegeben. Verwenden Sie dazu die Variable subject_alt_names. Die Variable subject_alt_names enthält eine Liste von SAN-Strukturen, wobei jeder 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

Einen bestimmten allgemeinen Namen und eine Reihe von Ländern erzwingen

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

Erzwingen, dass alle DNS-Namen mit einem benutzerdefinierten String enden

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

Erzwingen, dass alle SANs vom Typ DNS oder EMAIL sind

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

Erzwingen, dass es nur einen benutzerdefinierten SAN mit einer bestimmten OID gibt

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

Erzwingen, dass 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 bedingten Ausdruck unterwerfen. Wenn die Bedingung true ergibt, ist die IAM-Rollenbindung wirksam. Andernfalls wird sie ignoriert. Mit dem 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 zu prüfen, ob der auszuführende Vorgang zulässig ist.

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

Die folgenden Attribute werden bei 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 Distinguished Name des Inhabers (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

    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. Jeder der angeforderten SANs hat ein Präfix mit seinem Typ. SANs mit unbekannten Typen haben ein Präfix mit der serialisierten OID des Typs.

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

Die Vorlagensyntax verwendet {project_id}/-/{template_id} anstelle des standardmäßigen vollständigen Ressourcennamens projects/{project_id}/locations/{location}/certificateTemplates/{template_id}, da sich Zertifikatsvorlagen am selben Standort wie der CA-Pool befinden müssen. In diesem Format fungiert der Bindestrich (-) als Platzhalter für den Standort, wodurch CEL-Bedingungen kurz, lesbar und standortunabhängig bleiben.

Der in der IAM-Bedingung angegebene Vorlagenname muss mit dem Vorlagennamen in der Zertifikatsanfrage übereinstimmen. Wenn Sie also eine Projekt-ID im Attribut privateca.googleapis.com/template des CEL-Ausdrucks 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

Erzwingen, dass für alle Inhaber die Organisation auf „Example“ und der Ländercode auf US oder UK festgelegt ist

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

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

Erzwingen, dass alle Zertifikate eine bestimmte Vorlage verwenden

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

Nächste Schritte