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 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} |
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 { |
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 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
- 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.