Utilizzare Common Expression Language

Questa pagina descrive come utilizzare il Common Expression Language (CEL) con i criteri 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 la semantica comune per la valutazione delle espressioni. Certificate Authority Service supporta CEL per applicare vari controlli dei criteri per l'emissione dei certificati.

Esistono due dialetti CEL che possono essere utilizzati con il servizio CA:

  • 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 i criteri 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 di identità del certificato. L'espressione CEL consente di convalidare i campi Oggetto e Nome alternativo dell'oggetto (SAN).

Per ulteriori informazioni sui criteri di emissione, consulta Aggiungere un criterio di emissione dei certificati a un pool di CA.

Per ulteriori informazioni sui modelli di certificato, consulta Panoramica dei modelli di certificato e delle norme di emissione.

Il dialetto CEL per i vincoli di identità dei pool di CA e dei modelli di certificato espone le seguenti variabili per accedere e convalidare i campi Oggetto e SAN:

  • Oggetto: subject
  • SAN: subject_alt_names

Oggetto

Puoi convalidare tutti i campi del nome di dominio del soggetto di un certificato (incluso il nome comune), come specificato nella richiesta del 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 provincia
String street_address
String postal_code

Nomi alternativi del soggetto (SAN)

Puoi convalidare tutti i SAN come specificato nella richiesta di certificato utilizzando la variabile subject_alt_names. La variabile subject_alt_names contiene un elenco di strutture SAN, in cui 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:

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

La variabile subject_alt_names contiene un elenco con tutti i SAN richiesti.

Puoi utilizzare le seguenti macro sui 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 ulteriori informazioni sulle macro, consulta la sezione 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")

Verificare che tutti i nomi DNS terminino con una stringa personalizzata

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

Verificare 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 è efficace, altrimenti viene ignorata. Il servizio CA ti 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 relativi alla richiesta e ha un valore booleano. Gli utenti impostano condizioni sulle 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 ulteriori informazioni sulle condizioni IAM, consulta la Panoramica delle condizioni IAM.

I seguenti attributi vengono esposti durante la valutazione CEL delle condizioni IAM:

  • privateca.googleapis.com/subject

    privateca.googleapis.com/subject è accessibile come api.getAttribute('privateca.googleapis.com/subject', {}).

Tipo Descrizione
map{string, string} Questo campo contiene il nome distinto dell'oggetto (incluso il nome comune) come specificato nella richiesta di certificato in arrivo.

Esempio

{
 '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 è accessibile come api.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 arrivo. A ogni SAN richiesta viene anteposto il relativo tipo. I SAN con tipi sconosciuti sono preceduti dall'OID serializzato del tipo.

Esempio

{
 '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

    privateca.googleapis.com/template è accessibile come api.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

Il nome del modello fornito nella condizione IAM deve corrispondere al nome del modello nella richiesta del 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 del certificato.

Espressioni di esempio

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

Assicurati che la richiesta di certificato includa solo i DNS SAN 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