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 como api.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

{
 'common_name': 'Foobar',
 'organization': 'Example LLC'
 'country_code' :'US'
 'organizational_unit':'Foobar'
 'locality':'Mountain View'
 'Province':'California'
 'street_address':'Foobar 22'
 'postal_code':55555
}
  • privateca.googleapis.com/subject_alt_names

    Se puede acceder a privateca.googleapis.com/subject_alt_names como api.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

{
 'dns:foo.bar.com',
 'uri:spiffe://foo/ns/bar/sa/baz'
 'email:foo@bar.com'
 'ip:169.169.254.254'
 'custom:1.2.3.4.5.6.3:foobar'
}
  • privateca.googleapis.com/template

    Se puede acceder a privateca.googleapis.com/template como api.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