Usar a Common Expression Language
Nesta página, descrevemos como usar a Common Expression Language (CEL) com políticas de emissão de certificados, modelos de certificado e condições do Identity and Access Management (IAM) no pool de ACs.
Visão geral
A Common Expression Language (CEL) é uma linguagem de código aberto não Turing que implementa semântica comum para avaliação de expressões. O Certificate Authority Service oferece suporte à 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 de 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).
Para saber mais 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 de 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
É possível validar todos os campos do nome de domínio do assunto de um certificado (incluindo o nome comum), conforme especificado na solicitação do 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, 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 SAN, em que cada SAN é do tipo SubjectAltName
.
SubjectAltName
é um struct com 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 idioma: 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")
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 )
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]
Garantir que SANs personalizadas 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 papel do IAM será eficaz. Caso contrário, ela será ignorada. O CA Service permite adicionar vinculações condicionais do IAM a um pool de ACs.
A condição do IAM é uma expressão CEL que referencia um conjunto de atributos contextuais sobre a solicitação e é avaliada como um booleano. Os usuários definem condições nas vinculações de papéis de uma política do IAM, que é armazenada pelo IAM e avaliada para ver se a operação que está prestes a ser executada é 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 da 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 todos os SANs solicitados, conforme especificado na solicitação de certificado recebida. Cada uma das SANs solicitadas é prefixada com um tipo. Os SANs com tipos desconhecidos são prefixados com o 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 que foi 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 do certificado. Portanto, se você estiver fornecendo um ID do projeto no
atributo privateca.googleapis.com/template
da expressão CEL, também precisará
fornecer esse ID ao solicitar o certificado. Se você fornecer um
número de projeto na expressão CEL, também precisará fornecer um número de projeto
na solicitação do certificado.
Exemplos de expressões
Garantir que a organização de todos os assuntos esteja definida como "Exemplo" e o código do país 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 do certificado inclua apenas as SANs DNS específicas
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
Como 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 certificados 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.