Usa Common Expression Language
En esta página, se describe cómo puedes usar el Common Expression Language (CEL) con políticas de emisión de certificados, plantillas de certificados y condiciones de Identity and Access Management (IAM) en tu grupo de AC.
Descripción general
Common Expression Language (CEL) es un lenguaje de código abierto que no es Turing-completo y que implementa semánticas comunes para la evaluación de expresiones. Certificate Authority Service admite CEL para aplicar varios controles de políticas para la emisión de certificados.
Existen dos dialectos de CEL que se pueden usar con el servicio de CA:
- Un dialecto flexible que se puede usar en las políticas de emisión de certificados y las plantillas de certificados de un grupo de AC.
- Es un dialecto más limitado que se puede usar en las condiciones de IAM.
Dialecto CEL para las políticas de emisión de certificados y las plantillas de certificados
Cuando creas un grupo de AC o una plantilla de certificado, puedes especificar una expresión CEL como parte de las restricciones de identidad del certificado. La expresión CEL te permite validar los campos Asunto y Nombre alternativo del asunto (SAN).
Para obtener más información sobre las políticas de emisión, consulta Cómo agregar una política de emisión de certificados a un grupo de AC.
Para obtener más información sobre las plantillas de certificados, consulta Descripción general de las plantillas de certificados y las políticas de emisión.
El dialecto CEL para las restricciones de identidad de los grupos de AC y las plantillas de certificados expone las siguientes variables para acceder a los campos Asunto y SAN y validarlos:
- Asunto:
subject
- SAN:
subject_alt_names
Asunto
Puedes validar todos los campos del nombre de dominio del sujeto de un certificado (incluido el nombre común), como se especifica en la solicitud de certificado, con una variable de tipo Subject
y nombre subject
.
Subject
es una estructura que contiene los siguientes campos:
Tipo | Nombre |
---|---|
String |
common_name |
String |
country_code |
String |
organización |
String |
organizational_unit |
String |
localidad |
String |
provincia |
String |
street_address |
String |
postal_code |
Nombres alternativos de asunto (SAN)
Puedes validar todos los SAN como se especifica en la solicitud de certificado con la variable subject_alt_names
. La variable subject_alt_names
contiene una lista de estructuras SAN, en la que cada SAN es de tipo SubjectAltName
.
SubjectAltName
es una estructura que contiene los siguientes campos:
Tipo | Nombre |
---|---|
String |
valor |
[]Int32 |
oid |
Enum |
tipo |
Puedes usar los siguientes valores para el tipo SubjectAltName
:
DNS
URI
EMAIL
IP_ADDRESS
CUSTOM
La variable subject_alt_names
contiene una lista con todas las SAN solicitadas.
Puedes usar las siguientes macros en SAN:
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 obtener más información sobre las macros, consulta Definición del lenguaje: Macros.
Expresiones de ejemplo
Cómo garantizar un nombre común específico y un conjunto de países
subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")
Cómo garantizar que todos los nombres de DNS terminen con una cadena personalizada
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
Asegúrate de que todas las SAN sean del tipo DNS o EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
Cómo garantizar que haya una sola SAN personalizada con un OID específico
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
Garantizar que las SAN personalizadas sean solo un conjunto de OID
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
Dialecto CEL para las políticas de IAM
Usa condiciones de IAM para someter las vinculaciones de roles de IAM a una expresión condicional. Si la condición se evalúa como true
, la vinculación de roles de IAM es efectiva; de lo contrario, se ignora. El servicio de AC te permite agregar vinculaciones condicionales de IAM a un grupo de AC.
La condición de IAM es una expresión CEL que hace referencia a un conjunto de atributos contextuales sobre la solicitud y se evalúa como un valor booleano. Los usuarios establecen condiciones en las vinculaciones de roles en una política de IAM, que IAM almacena y evalúa para ver si se permite la operación que se está a punto de realizar.
Para obtener más información sobre las condiciones de IAM, consulta Descripción general de las condiciones de IAM.
Los siguientes atributos se exponen durante la evaluación de CEL de las condiciones de IAM:
privateca.googleapis.com/subject
Se puede acceder a
privateca.googleapis.com/subject
comoapi.getAttribute('privateca.googleapis.com/subject', {})
.
Tipo | Descripción |
---|---|
map{string, string} |
Este campo contiene el nombre distinguido del sujeto (incluido el nombre común) como se especifica en la solicitud de certificado entrante. Ejemplo { |
privateca.googleapis.com/subject_alt_names
Se puede acceder a
privateca.googleapis.com/subject_alt_names
comoapi.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.
Tipo | Descripción |
---|---|
list{string} |
Este campo contiene todas las SAN solicitadas, como se especifica en la solicitud de certificado entrante. Cada una de las SAN solicitadas tiene el prefijo de su tipo. Los SAN con tipos desconocidos tienen el OID serializado del tipo como prefijo. Ejemplo { |
privateca.googleapis.com/template
Se puede acceder a
privateca.googleapis.com/template
comoapi.getAttribute('privateca.googleapis.com/template', '')
.
Tipo | Descripción |
---|---|
String |
La plantilla de certificado que se usó, si corresponde El formato es {project_id}/-/{template_id} .Ejemplo: my-project-pki/-/workload_tls |
El nombre de la plantilla proporcionado en la condición de IAM debe coincidir con el nombre de la plantilla en la solicitud de certificado. Por lo tanto, si proporcionas un ID del proyecto en el atributo privateca.googleapis.com/template
de la expresión CEL, también debes proporcionar un ID del proyecto cuando solicites el certificado. Si proporcionas un número de proyecto en la expresión CEL, también debes proporcionar un número de proyecto en la solicitud de certificado.
Expresiones de ejemplo
Asegúrate de que todos los sujetos tengan la organización configurada como "Example" y el código de país como US
o UK
.
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
Asegúrate de que la solicitud de certificado solo incluya las SAN de DNS proporcionadas
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
Garantizar que todos los certificados usen una plantilla específica
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
¿Qué sigue?
- Lee la introducción a CEL.
- Obtén más información sobre la definición de lenguaje de CEL.
- Obtén información sobre las plantillas de certificados y las políticas de emisión.
- Lee la descripción general de las condiciones de IAM.
- Obtén información para agregar una política de emisión de certificados a un grupo de AC.