Usar el lenguaje de expresión común
En esta página se describe cómo puedes usar el lenguaje de expresión común (CEL) con las políticas de emisión de certificados, las plantillas de certificados y las condiciones de gestión de identidades y accesos (IAM) en tu grupo de autoridades de certificación.
Información general
Lenguaje de expresión común (CEL) es un lenguaje de software libre no completo de Turing que implementa semánticas comunes para la evaluación de expresiones. Certificate Authority Service admite CEL para aplicar varios controles de políticas en la emisión de certificados.
Hay dos dialectos de CEL que se pueden usar con el Servicio de Autoridades de Certificación:
- Un dialecto flexible que se puede usar en las políticas de emisión de certificados y en las plantillas de certificados de un grupo de autoridades de certificación.
- Un dialecto más limitado que se puede usar en las condiciones de gestión de identidades y accesos.
Dialecto de CEL para políticas de emisión de certificados y plantillas de certificados
Al crear 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 de asunto y de nombre alternativo del asunto (SAN).
Para obtener más información sobre las políticas de emisión, consulta Añadir políticas de emisión de certificados.
Para obtener más información sobre las plantillas de certificados, consulta Descripción general de los controles de políticas.
El dialecto de CEL para las restricciones de identidad de los grupos de ACs y las plantillas de certificados expone las siguientes variables para acceder a los campos de asunto y SAN, así como para validarlos:
- Asunto:
subject
- SAN:
subject_alt_names
Asunto
Puedes validar todos los campos del nombre de dominio del asunto de un certificado (incluido el nombre común), tal como se especifica en la solicitud de certificado, mediante 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 |
municipio |
String |
province |
String |
street_address |
String |
postal_code |
Nombres alternativos de la entidad receptora (SANs)
Puede validar todos los SANs tal como se especifican en la solicitud de certificado mediante la variable subject_alt_names
. La variable subject_alt_names
contiene una lista de estructuras SAN, donde cada SAN es del tipo SubjectAltName
.
SubjectAltName
es una estructura que contiene los siguientes campos:
Tipo | Nombre |
---|---|
String |
valor |
[]Int32 |
oid |
Enum |
tipo |
Puede usar los siguientes valores para el tipo SubjectAltName
:
DNS
URI
EMAIL
IP_ADDRESS
CUSTOM
La variable subject_alt_names
contiene una lista con todos los SANs solicitados.
Puede usar las siguientes macros en 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 obtener más información sobre las macros, consulta Definición de lenguaje: macros.
Ejemplos de expresiones
Asegurarse de que se usa 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")
Asegurarse de que todos los nombres de DNS terminen con una cadena personalizada
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
Asegurarse de que todos los SANs sean de tipo DNS o EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
Asegurarse de que solo haya un SAN personalizado con un OID específico
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
Asegurarse de que los SANs personalizados solo sean un conjunto de OIDs
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
Dialecto de CEL para políticas de gestión de identidades y accesos
Usa las condiciones de gestión de identidades y accesos para someter las vinculaciones de roles de gestión de identidades y accesos a una expresión condicional. Si la condición se evalúa como true
, el enlace de rol de IAM será efectivo. De lo contrario, se ignorará. El servicio de AC te permite añadir enlaces condicionales de IAM a un grupo de ACs.
La condición de IAM es una expresión de CEL que hace referencia a un conjunto de atributos contextuales sobre la solicitud y se evalúa como un valor booleano. Los usuarios definen condiciones en las vinculaciones de roles de una política de gestión de identidades y accesos, que se almacena en Gestión de identidades y accesos y se evalúa para comprobar si se permite la operación que se va a realizar.
Para obtener más información sobre las condiciones de gestión de identidades y accesos, consulta el resumen de las condiciones de gestión de identidades y accesos.
Los siguientes atributos se exponen durante la evaluación de las condiciones de gestión de identidades y accesos en CEL:
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 distintivo del sujeto (incluido el nombre común) tal 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 todos los SANs solicitados, tal como se especifican en la solicitud de certificado entrante. Cada uno de los SANs solicitados tiene como prefijo su tipo. Los SANs con tipos desconocidos tienen como prefijo el OID serializado del tipo. 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 ha usado, si es el caso. 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 de la solicitud de certificado. Por lo tanto, si proporciona un ID de proyecto en el atributo privateca.googleapis.com/template
de la expresión CEL, también debe proporcionar un ID de proyecto al solicitar el certificado. Si proporciona un número de proyecto en la expresión CEL, también debe proporcionar un número de proyecto en la solicitud de certificado.
Ejemplos de expresiones
Asegurarse de que todos los asuntos tengan la organización "Example" y el código de país US
o UK
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
Asegurarse de que la solicitud de certificado solo incluya los SANs de DNS proporcionados
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
Asegurarse de que todos los certificados usen una plantilla específica
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
Siguientes pasos
- Consulta la introducción a CEL.
- Consulta más información sobre la definición de lenguaje de CEL.
- Consulta información sobre las plantillas de certificados y las políticas de emisión.
- Consulta la descripción general de las condiciones de gestión de identidades y accesos.
- Consulta cómo añadir una política de emisión de certificados a un pool de CAs.