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:
DNSURIEMAILIP_ADDRESSCUSTOM
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/subjectAuf
privateca.googleapis.com/subjectkann alsapi.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 { |
privateca.googleapis.com/subject_alt_namesAuf
privateca.googleapis.com/subject_alt_nameskann alsapi.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 { |
privateca.googleapis.com/templateAuf
privateca.googleapis.com/templatekann alsapi.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
- Lesen Sie die Einführung in CEL.
- Weitere Informationen zur Sprachdefinition für CEL
- Weitere Informationen zu Zertifikatsvorlagen und Ausstellungsrichtlinien
- Lesen Sie die Übersicht über IAM-Bedingungen.
- Informationen zum Hinz0}inzufügen einer Richtlinie für die Zertifikatsausstellung zu einem CA-Pool{/1