Usar a linguagem de expressão comum

Esta página descreve como usar a linguagem de expressão comum (CEL) com políticas de emissão de certificados, modelos de certificados e condições de gerenciamento de identidade e acesso (IAM) no seu pool de ACs.

Visão geral

A Common Expression Language (CEL) é uma linguagem completa de código aberto e não Turing que implementa semântica comum para avaliação de expressões. O Certificate Authority Service oferece suporte ao CEL para aplicar vários controles de políticas na emissão de certificados.

Há dois dialetos CEL que podem ser usados com o serviço do CA:

  • Um dialeto flexível que pode ser usado em políticas de emissão de certificados e modelos de certificado de um pool de CAs.
  • Um dialeto mais limitado que pode ser usado nas condições do IAM.

Dialeto CEL para políticas de emissão de certificados e modelos de certificados

Ao criar um pool de ACs ou um modelo de certificado, é possível especificar uma expressão CEL como parte das restrições de identidade do certificado. A expressão CEL permite validar os campos "Assunto" e "Nome alternativo do assunto" (SAN, na sigla em inglês).

Para mais informações sobre as políticas de emissão, consulte Adicionar uma política de emissão de certificados a um pool de ACs.

Para mais informações sobre modelos de certificado, consulte Visão geral dos modelos de certificado e políticas de emissão.

O dialeto CEL para as restrições de identidade de pools de CAs e modelos de certificado expõe as seguintes variáveis para acessar e validar os campos de assunto e SAN:

  • Assunto: subject
  • SAN: subject_alt_names

Assunto

Você pode validar todos os campos no nome de domínio do assunto de um certificado (incluindo o nome comum), conforme especificado na solicitação de certificado, usando uma variável do tipo Subject e nome subject.

Subject é uma estrutura que contém os seguintes campos:

Tipo Nome
String common_name
String country_code
String organização
String organizational_unit
String região administrativa
String província
String street_address
String postal_code

Nomes alternativos do assunto (SANs, na sigla em inglês)

É possível validar todos os SANs conforme especificado na solicitação de certificado usando a variável subject_alt_names. A variável subject_alt_names contém uma lista de estruturas da SAN, em que cada SAN é do tipo SubjectAltName.

SubjectAltName é uma estrutura que contém os seguintes campos:

Tipo Nome
String valor
[]Int32 oid
Enum tipo

É possível usar os seguintes valores para o tipo SubjectAltName:

  • DNS
  • URI
  • EMAIL
  • IP_ADDRESS
  • CUSTOM

A variável subject_alt_names contém uma lista com todas as SANs solicitadas.

É possível usar as seguintes macros em SANs:

  • 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)

Para mais informações sobre macros, consulte Definição de linguagem: macros.

Exemplos de expressões

Garantir um nome comum específico e um conjunto de países

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

Garantir que todos os nomes DNS terminem com uma string personalizada

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

Garantir que todos os SANs sejam do tipo DNS ou EMAIL

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

Como garantir que apenas um SAN personalizado tenha um OID específico

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

Como garantir que SANs personalizados sejam apenas um conjunto de OIDs

subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])

Dialeto CEL para políticas do IAM

Use condições do IAM para sujeitar vinculações de papéis do IAM a uma expressão condicional. Se a condição for avaliada como true, a vinculação de função do IAM será efetiva. Caso contrário, ela será ignorada. O serviço de CA permite adicionar vinculações condicionais do IAM a um pool de ACs.

A condição do IAM é uma expressão CEL que faz referência a um conjunto de atributos contextuais sobre a solicitação e avalia como um booleano. Os usuários definem condições nas vinculações de função em uma política do IAM, que é armazenada pelo IAM e avaliada para saber se a operação que está prestes a ser realizada é permitida.

Para mais informações sobre as condições do IAM, consulte Visão geral das condições do IAM.

Os seguintes atributos são expostos durante a avaliação CEL das condições do IAM:

  • privateca.googleapis.com/subject

    O privateca.googleapis.com/subject pode ser acessado como api.getAttribute('privateca.googleapis.com/subject', {}).

Tipo Descrição
map{string, string} Esse campo contém o nome distinto do assunto (incluindo o nome comum), conforme especificado na solicitação de certificado recebida.

Exemplo

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

    O privateca.googleapis.com/subject_alt_names pode ser acessado como api.getAttribute('privateca.googleapis.com/subject_alt_names', []).

Tipo Descrição
list{string} Este campo contém todas as SANs solicitadas, conforme especificado na solicitação de certificado recebida. Cada um dos SANs solicitados tem um prefixo com o tipo dele. SANs com tipos desconhecidos são prefixados com o OID serializado do tipo.

Exemplo

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

    O privateca.googleapis.com/template pode ser acessado como api.getAttribute('privateca.googleapis.com/template', '').

Tipo Descrição
String O modelo de certificado usado, se houver. O formato é {project_id}/-/{template_id}.

Exemplo: my-project-pki/-/workload_tls

O nome do modelo fornecido na condição do IAM precisa corresponder ao nome do modelo na solicitação de certificado. Portanto, se você estiver fornecendo um ID de projeto no atributo privateca.googleapis.com/template da expressão CEL, também precisará fornecer um ID de projeto ao solicitar o certificado. Se você fornecer um número de projeto na expressão CEL, você deve fornecer um número de projeto em a solicitação de certificado.

Exemplos de expressões

Garantir que todos os assuntos tenham a organização definida como "Exemplo" e o código do país definido como US ou UK

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

Garantir que a solicitação de certificado inclua apenas as SANs DNS especificadas

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

Garantir que todos os certificados usem um modelo específico

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

A seguir