Usar a linguagem de expressão comum

Nesta página, descrevemos como usar a Common Expression Language (CEL) com políticas de emissão e modelo de certificado, além de condições do Identity and Access Management (IAM) no seu pool de CAs.

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 certificado

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 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 todos os SANs solicitados.

É 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

Como 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 apenas uma SAN personalizada com 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 CA Service permite adicionar vinculações condicionais do IAM a um pool de AC.

A condição do IAM é uma expressão CEL que faz referência a um conjunto de atributos contextuais sobre a solicitação e é avaliada 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. Os SANs com tipos desconhecidos têm o prefixo do 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 ser idêntico 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 todas as pessoas 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