Usa il linguaggio di espressione comune

In questa pagina viene descritto come utilizzare Common Expression Language (CEL) con criteri di emissione di certificati, modelli di certificati e condizioni Identity and Access Management (IAM) nel pool di CA.

Panoramica

Il Common Expression Language (CEL) è un linguaggio completo open source non Turing che implementa una 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 CA Service:

  • Un dialetto flessibile che può essere utilizzato nei criteri di emissione dei certificati e nei modelli di certificato 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à dei certificati. L'espressione CEL consente di convalidare i campi SAN (Subject Alternative Name) e Subject Alternative Name.

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

Per ulteriori informazioni sui modelli di certificati, consulta la Panoramica dei modelli di certificati e dei criteri di emissione.

Il dialetto CEL per i vincoli di identità dei pool di CA e dei modelli di certificato espone le seguenti variabili per l'accesso e la convalida dei campi Oggetto e SAN:

  • Oggetto: subject
  • SAN: subject_alt_names

Oggetto

Puoi convalidare tutti i campi nel nome di dominio dell'oggetto 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 contenente 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 tutte le SAN come specificato nella richiesta di certificato utilizzando la variabile subject_alt_names. La variabile subject_alt_names contiene uno struct SAN elenco, dove ogni SAN è di tipo SubjectAltName.

SubjectAltName è uno struct contenente 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 di tutte le SAN richieste.

È possibile 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 ulteriori informazioni sulle macro, consulta la sezione Definizione di lingua: macro.

Espressioni di esempio

Assicurarsi che 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"))

Assicurati che tutte le SAN siano di tipo DNS o EMAIL

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

Assicurarsi di una sola SAN personalizzata con un OID specifico

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

Assicurarsi che le SAN personalizzate 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 ha valore true, l'associazione del ruolo IAM è effettiva, altrimenti viene ignorata. Il servizio CA consente di aggiungere associazioni condizionali IAM a un pool di CA.

La condizione IAM è un'espressione CEL che fa riferimento a un set di attributi contestuali relativi alla richiesta e restituisce un valore booleano. Gli utenti impostano le 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 saperne di più sulle condizioni IAM, consulta la Panoramica delle condizioni IAM.

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

  • privateca.googleapis.com/subject

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

Tipo Descrizione
map{string, string} Questo campo contiene il nome distinto del soggetto (incluso il nome comune) specificato nella richiesta di certificato in entrata.

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

    Il privateca.googleapis.com/subject_alt_names è accessibile come api.getAttribute('privateca.googleapis.com/subject_alt_names', []).

Tipo Descrizione
list{string} Questo campo contiene tutte le SAN richieste come specificato nella richiesta di certificato in entrata. A ognuna delle SAN richieste è indicato il relativo tipo come prefisso. Le SAN con tipi sconosciuti sono precedute dal prefisso 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

    Il privateca.googleapis.com/template è accessibile come api.getAttribute('privateca.googleapis.com/template', '').

Tipo Descrizione
String L'eventuale modello di certificato utilizzato. 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 di certificato. Quindi, se fornisci un ID progetto nell'attributo privateca.googleapis.com/template dell'espressione CEL, devi fornire un ID progetto anche quando richiedi il certificato. Se fornisci un numero di progetto nell'espressione CEL, devi fornire anche un numero di progetto nella richiesta di certificato.

Espressioni di esempio

Assicurarsi che l'organizzazione sia impostata su "Esempio" per tutti i soggetti e che il codice paese sia impostato 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 le SAN DNS specificate

api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
        .hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])

Assicurarsi che tutti i certificati utilizzino un modello specifico

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

Passaggi successivi