Usar a linguagem de expressão comum
Nesta página, descrevemos como usar a Common Expression Language (CEL) com políticas de emissão de certificados, modelos de certificados e condições do Identity and Access Management (IAM) no seu pool de ACs.
Visão geral
A Common Expression Language (CEL) é uma linguagem de código aberto sem completude de Turing que implementa semânticas comuns para a avaliação de expressões. Certificate Authority Service oferece suporte ao CEL para aplicar vários controles de política para emissão de certificados.
Há dois dialetos CEL que podem ser usados com o serviço de CA:
- Um dialeto flexível que pode ser usado nas políticas de emissão de certificados e nos modelos de certificado de um pool de ACs.
- Um dialeto mais limitado que pode ser usado em 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 das políticas de emissão.
O dialeto CEL para as restrições de identidade de pools de AC 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
É possível 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 o 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)
É 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 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")
Como 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 as condições do IAM para sujeitar as 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 das condições do IAM pela CEL:
privateca.googleapis.com/subject
O
privateca.googleapis.com/subject
pode ser acessado comoapi.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 { |
privateca.googleapis.com/subject_alt_names
O
privateca.googleapis.com/subject_alt_names
pode ser acessado comoapi.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.
Tipo | Descrição |
---|---|
list{string} |
Esse campo contém todos os SANs solicitados 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 { |
privateca.googleapis.com/template
O
privateca.googleapis.com/template
pode ser acessado comoapi.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 do projeto no atributo privateca.googleapis.com/template
da expressão CEL, também precisará fornecer um ID do projeto ao solicitar o certificado. Se você informar um
número de projeto na expressão CEL, também precisará informar um número de projeto na
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 os SANs DNS fornecidos
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
- Leia a introdução à CEL.
- Saiba mais sobre a definição de linguagem para CEL.
- Saiba mais sobre modelos de certificado e políticas de emissão.
- Leia a visão geral das condições do IAM.
- Saiba como adicionar uma política de emissão de certificados a um pool de ACs.