Utilizzare Common Expression Language
Questa pagina descrive come utilizzare Common Expression Language (CEL) con le norme di emissione dei certificati, i modelli di certificati e le condizioni Identity and Access Management (IAM) nel pool di CA.
Panoramica
Common Expression Language (CEL) è un linguaggio open source non Turing completo che implementa una semantica comune per la valutazione delle espressioni. Certificate Authority Service supporta CEL per applicare vari controlli delle policy per l'emissione dei certificati.
Con il servizio CA possono essere utilizzati due dialetti CEL:
- Un dialetto flessibile che può essere utilizzato nei criteri di emissione dei certificati e nei modelli di certificati di un pool di CA.
- Un dialetto più limitato che può essere utilizzato nelle condizioni IAM.
Dialetto CEL per le norme di emissione dei certificati e i modelli di certificato
Quando crei un pool di CA o un modello di certificato, puoi specificare un'espressione CEL come parte dei vincoli dell'identità del certificato. L'espressione CEL consente di convalidare i campi Oggetto e Nome alternativo del soggetto (SAN).
Per saperne di più sulle norme di emissione, consulta Aggiungere norme di emissione dei certificati.
Per saperne di più sui modelli di certificato, consulta Panoramica dei controlli delle policy.
Il dialetto CEL per i vincoli di identità dei pool di CA e dei modelli di certificato espone le seguenti variabili per accedere ai campi Oggetto e SAN e convalidarli:
- Oggetto:
subject - SAN:
subject_alt_names
Oggetto
Puoi convalidare tutti i campi nel nome di dominio del soggetto di un certificato (incluso il nome comune), come specificato nella richiesta di certificato utilizzando una variabile di tipo Subject e nome subject.
Subject è una struttura che contiene i seguenti campi:
| Tipo | Nome |
|---|---|
String |
common_name |
String |
country_code |
String |
organizzazione |
String |
organizational_unit |
String |
località |
String |
province |
String |
street_address |
String |
postal_code |
Nomi alternativi del soggetto (SAN)
Puoi convalidare tutti i SAN specificati nella richiesta di certificato utilizzando la variabile subject_alt_names. La variabile subject_alt_names contiene un elenco di struct SAN, dove ogni SAN è di tipo SubjectAltName.
SubjectAltName è una struttura che contiene i seguenti campi:
| Tipo | Nome |
|---|---|
String |
valore |
[]Int32 |
oid |
Enum |
tipo |
Puoi utilizzare i seguenti valori per il tipo SubjectAltName:
DNSURIEMAILIP_ADDRESSCUSTOM
La variabile subject_alt_names contiene un elenco con tutti i SAN richiesti.
Puoi utilizzare le seguenti macro sulle SAN:
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)
Per saperne di più sulle macro, consulta Definizione del linguaggio: macro.
Espressioni di esempio
Garantire un nome comune specifico e un insieme di paesi
subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")
Assicurarsi che tutti i nomi DNS terminino con una stringa personalizzata
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
Assicurarsi che tutti i SAN siano di tipo DNS o EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
Garantire un solo SAN personalizzato con un OID specifico
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
Garantire che i SAN personalizzati siano solo un insieme di OID
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
Dialetto CEL per i criteri IAM
Utilizza le condizioni IAM per sottoporre le associazioni di ruoli IAM a un'espressione condizionale. Se la condizione restituisce true, l'associazione del ruolo IAM è effettiva, altrimenti viene ignorata. CA Service consente di aggiungere associazioni condizionali IAM a un pool di CA.
La condizione IAM è un'espressione CEL che fa riferimento a un insieme di attributi contestuali della richiesta e restituisce un valore booleano. Gli utenti impostano le condizioni per le associazioni di ruolo in un criterio IAM, che viene archiviato da IAM e valutato per verificare se l'operazione che sta per essere eseguita è consentita.
Per saperne di più sulle condizioni IAM, consulta Panoramica delle condizioni IAM.
I seguenti attributi vengono esposti durante la valutazione CEL delle condizioni IAM:
privateca.googleapis.com/subjectprivateca.googleapis.com/subjectè accessibile comeapi.getAttribute('privateca.googleapis.com/subject', {}).
| Tipo | Descrizione |
|---|---|
map{string, string} |
Questo campo contiene il nome distinto del soggetto (incluso il nome comune) come specificato nella richiesta di certificato in entrata. Esempio { |
privateca.googleapis.com/subject_alt_namesprivateca.googleapis.com/subject_alt_namesè accessibile comeapi.getAttribute('privateca.googleapis.com/subject_alt_names', []).
| Tipo | Descrizione |
|---|---|
list{string} |
Questo campo contiene tutti i SAN richiesti come specificato nella richiesta di certificato in entrata. A ciascuno dei SAN richiesti viene aggiunto come prefisso il relativo tipo. I SAN con tipi sconosciuti hanno come prefisso l'OID serializzato del tipo. Esempio { |
privateca.googleapis.com/templateprivateca.googleapis.com/templateè accessibile comeapi.getAttribute('privateca.googleapis.com/template', '').
| Tipo | Descrizione |
|---|---|
String |
Il modello di certificato utilizzato, se presente. Il formato è {project_id}/-/{template_id}.Esempio: my-project-pki/-/workload_tls |
La sintassi del modello utilizza {project_id}/-/{template_id} anziché il nome
completo della risorsa standard projects/{project_id}/locations/{location}/certificateTemplates/{template_id}
perché i modelli di certificato devono risiedere nella stessa posizione del pool di CA.
In questo formato, il trattino (-) funge da carattere jolly per la località, il che rende le condizioni CEL concise, leggibili e indipendenti dalla località.
Il nome del modello fornito nella condizione IAM deve corrispondere al nome del modello
nella richiesta di certificato. Pertanto, se fornisci un ID progetto nell'attributo
privateca.googleapis.com/template dell'espressione CEL, devi
fornire anche un ID progetto quando richiedi il certificato. Se fornisci un numero di progetto nell'espressione CEL, devi fornire un numero di progetto anche nella richiesta di certificato.
Espressioni di esempio
Assicurarsi che per tutti i soggetti l'organizzazione sia impostata su "Esempio" e il codice paese su US o UK
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
Assicurarsi che la richiesta di certificato includa solo i SAN DNS specificati
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
Garantire che tutti i certificati utilizzino un modello specifico
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
Passaggi successivi
- Leggi l'introduzione a CEL.
- Scopri di più sulla definizione del linguaggio per CEL.
- Scopri di più sui modelli di certificato e sulle norme di emissione.
- Leggi la panoramica delle condizioni IAM.
- Scopri come aggiungere una norma di emissione dei certificati a un pool di CA.