Usa Common Expression Language

En esta página, se describe cómo puedes usar 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-complete y que implementa una semántica común 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:

  • Es 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 CA.
  • Es un dialecto más limitado que se puede usar en las condiciones de IAM.

Dialecto de CEL para políticas de emisión de certificados y plantillas de certificados

Cuando creas un grupo de AC o una plantilla de certificado, puedes especificar una expresión de CEL como parte de las restricciones de identidad del certificado. La expresión de CEL te permite validar los campos Sujeto y Nombre alternativo del sujeto (SAN).

Para obtener más información sobre las políticas de emisión, consulta Agrega políticas de emisión de certificados.

Para obtener más información sobre las plantillas de certificados, consulta la Descripción general de los controles de políticas.

El dialecto de CEL para las restricciones de identidad de los grupos de CA y las plantillas de certificados expone las siguientes variables para acceder a los campos de sujeto y SAN, y validarlos:

  • Asunto: subject
  • SAN: subject_alt_names

Asunto

Puedes validar todos los campos en el nombre de dominio del asunto 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 del sujeto (SAN)

Puedes validar todos los SAN como se especifican en la solicitud de certificado con la variable subject_alt_names. La variable subject_alt_names contiene una lista de estructuras de SAN, en la que cada SAN es del 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 todos los SAN solicitados.

Puedes usar las siguientes macros en los 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"))

Cómo garantizar que todos los SAN sean de tipo DNS o EMAIL

subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )

Cómo garantizar 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]

Cómo garantizar que los SAN personalizados 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 de CEL para 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 del rol de IAM es efectiva; de lo contrario, se ignora. El servicio de CA te permite agregar vinculaciones condicionales de IAM a un grupo de CA.

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 está a punto de realizarse.

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 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 SAN solicitados, tal como se especifican en la solicitud de certificado entrante. Cada uno de los SAN solicitados tiene un prefijo que indica su tipo. Los SAN 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 Es la plantilla de certificado que se usó, si corresponde. El formato es {project_id}/-/{template_id}.

Ejemplo: my-project-pki/-/workload_tls

La sintaxis de la plantilla usa {project_id}/-/{template_id} en lugar del nombre completo estándar del recurso projects/{project_id}/locations/{location}/certificateTemplates/{template_id}, ya que las plantillas de certificado deben residir en la misma ubicación que el grupo de CA. En este formato, el guion (-) actúa como comodín de ubicación, lo que mantiene las condiciones de CEL concisas, legibles y sin importar la ubicación.

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 de CEL, también debes proporcionar uno en la solicitud de certificado.

Expresiones de ejemplo

Asegurarse de que todos los temas tengan la organización establecida como "Ejemplo" y el código de país establecido como US o UK

api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']

Cómo garantizar que la solicitud de certificado solo incluya los SAN de DNS proporcionados

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?