Configura la propagación de atributos de SAML

En esta página, se describe cómo habilitar y usar la propagación de atributos del Lenguaje de marcado para confirmación de seguridad (SAML). Puedes usar esta función para propagar atributos de SAML de un proveedor de identidad a aplicaciones protegidas por Identity-Aware Proxy (IAP). Cuando propagas atributos de SAML, puedes especificar qué atributos propagar y cómo entregarlos.

Antes de comenzar

Para usar la función de propagación de atributos de SAML, debes tener una licencia de BeyondCorp Enterprise.

Debes conocer la especificación de confirmaciones y protocolos de SAML V2.0.

Comprender cómo se manejan los datos

Antes de habilitar la propagación de atributos de SAML, asegúrate de comprender cómo Google Cloud administra los datos y qué tipo de información debes y no debes pasar este canal.

Puedes configurar IAP para que incluya uno o más atributos en la información que proporciona a tus aplicaciones protegidas. Si configuras SSO a través de un proveedor de identidad externo y tu proveedor de identidad incluye un <AttributeStatement> en la aserción de SAML, Google Cloud almacena de forma temporal los atributos asociados con la sesión de la Cuenta de Google de un usuario. Cuando vence la sesión de una Cuenta de Google, un proceso asíncrono quita la información de forma permanente en el plazo de una semana. Puedes configurar la fecha de vencimiento.

No uses la propagación de atributos de SAML para información de identificación personal (PII), como credenciales de cuentas, números de ID gubernamentales, datos de titulares de tarjetas, datos de cuentas financieras, información de atención médica o información sensible de contexto.

Habilita la propagación de atributos de SAML

Crea un perfil de SSO en Google Workspace para habilitar la propagación de atributos de SAML y, luego, actualiza la configuración de IAP con Google Cloud CLI o la API de REST.

Consola

  1. En la consola de Google Cloud, ve a la página IAP.
    Ir a IAP
  2. Abre la configuración de un recurso y, luego, desplázate hasta Propagación de atributos.
  3. Selecciona Habilitar propagación de atributos y, luego, haz clic en Guardar.
  4. En la pestaña SAML Attributes, ingresa los atributos que deseas propagar con el siguiente formato: attribute1, attribute2, attribute3

    También puedes ingresar los atributos usando una expresión personalizada.Los atributos de tu expresión personalizada se muestran en la pestaña Atributos SAML. Debes usar el siguiente formato de expresión para que tus atributos se muestren en la pestaña SAML Attributes:
    attributes.saml_attributes.filter(attribute, attribute.name in ['attribute', 'attribute2', 'attribute1'])

  5. En Tipos de credenciales para pasar, selecciona al menos un formato de atributo que provenga del IdP para pasarlo a las aplicaciones.

gcloud

Ejecuta los siguientes comandos de gcloud CLI IAP para actualizar la configuración de propagación de atributos de SAML:

gcloud iap settings set SETTING_FILE [--folder=FOLDER --organization=ORGANIZATION --project=PROJECT> --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION] [GCLOUD_WIDE_FLAG …]

Reemplaza lo siguiente:

  • FOLDER: Es la carpeta en la que reside tu aplicación.
  • ORGANIZATION: Es la organización en la que reside tu aplicación.
  • PROJECT: Es el proyecto en el que reside tu aplicación.
  • RESOURCE_TYPE: Es el tipo de recurso.
  • SERVICE: Es el servicio.
  • VERSION: Es el número de versión.

YAML:

applicationSettings:
 attributePropagationSettings:
  expression: CEL_EXPRESSION
  outputCredentials: ARRAY[OUTPUT_CREDENTIALS]
  enable: BOOLEAN

JSON:

{
   "application_settings":{
      "attribute_propagation_settings": {
        "expression": CEL_EXPRESSION,
        "output_credentials": ARRAY[OUTPUT_CREDENTIALS]
        "enable": BOOLEAN
      }
   }
}

API de REST

Puedes configurar los atributos de SAML para que se propaguen usando el objeto ApplicationSettings en IapSettings, como se muestra en los siguientes ejemplos:

{
 "csmSettings": {
    object (CsmSettings)
  },
  "accessDeniedPageSettings": {
    object (AccessDeniedPageSettings)
  },
 "attributePropagationSettings": {
    object (AttributePropagationSettings)
  },
  "cookieDomain": string,
}

AttributePropagationSettings

{
 "expression": string,
 "output_credentials": array
 "enable": boolean
}

Configura las credenciales de salida

Cuando usas la propagación de atributos de SAML, puedes enviar atributos a través de varios medios, incluidos el token web JSON (JWT) y los encabezados, estableciendo credenciales de salida. Para configurar las credenciales en la API, puedes especificar una lista de cadenas separadas por comas, como se muestra en el siguiente ejemplo:

"output_credentials": ["HEADER", "JWT", "RCTOKEN"]

Filtra atributos de SAML con Common Expression Language

Puedes usar las funciones de Common Expression Language (CEL) para filtrar los atributos de SAML.

El uso de expresiones en CEL con la propagación de atributos de SAML tiene las siguientes limitaciones:

  • Una expresión debe mostrar una lista de atributos.
  • Una expresión puede seleccionar un máximo de 45 atributos.
  • Una string de expresión no puede superar los 1,000 caracteres.

A continuación, se muestran las funciones de CEL que se admiten cuando se usa la función de propagación de atributos SAML de IAP.

Ten en cuenta que las funciones distinguen mayúsculas de minúsculas y deben usarse exactamente como están escritas. El orden de las funciones strict y emitAs no importa cuando se encadenan llamadas a funciones.

Función Ejemplo Descripción
Selección de campos a.b Selecciona el campo b del archivo a del protocolo. El carácter b puede ser otro archivo proto, una lista o un tipo de valor simple, como una cadena.
Cómo filtrar listas list.Filter(iter_var, condition) Muestra un subconjunto de list en el que los elementos coinciden con condition.
Membresía de la lista a en b Muestra true si el valor a es miembro de la lista b.
selectByName list.selectByName("name") En la lista, selecciona el atributo donde name = "name".
append list.append(attribute) Agrega el atributo dado a la lista determinada.
Estricta attribute.strict() Emite el atributo sin el prefijo x-goog-iap-attr- cuando se usa HEADERS como credencial de salida.
emitAs attribute.emitAs("new_name") Envía el atributo dado con el nombre "new_name" a todas las credenciales de salida seleccionadas.

Expresión en CEL de ejemplo

Supón una aserción de SAML:

<saml2:AttributeStatement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <saml2:Attribute Name="my_saml_attr_1">
    <saml2:AttributeValue xsi:type="xsd:string">value_1</saml2:AttributeValue>
    <saml2:AttributeValue xsi:type="xsd:string">value_2</saml2:AttributeValue>
  </saml2:Attribute>
 <saml2:Attribute Name="my_saml_attr_2">
    <saml2:AttributeValue xsi:type="xsd:string">value_3</saml2:AttributeValue>
    <saml2:AttributeValue xsi:type="xsd:string">value_4</saml2:AttributeValue>
  </saml2:Attribute>
 <saml2:Attribute Name="my_saml_attr_3">
    <saml2:AttributeValue xsi:type="xsd:string">value_5</saml2:AttributeValue>
    <saml2:AttributeValue xsi:type="xsd:string">value_6</saml2:AttributeValue>
  </saml2:Attribute>
</saml2:AttributeStatement>

Para seleccionar my_saml_attr_1, usa la siguiente expresión CEL:

attributes.saml_attributes.filter(attribute, attribute.name in ["my_saml_attr_1"])

Para seleccionar my_saml_attr_1 y my_saml_attr_2, usa la siguiente expresión CEL:

attributes.saml_attributes.filter(attribute, attribute.name in ["my_saml_attr_1", "my_saml_attr_2"])

Formato del atributo

Todos los atributos seleccionados están completamente duplicados en todas las credenciales de salida seleccionadas.

Ejemplo: Supón una aserción de SAML

<saml2:AttributeStatement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <saml2:Attribute Name="my_saml_attr_1">
    <saml2:AttributeValue xsi:type="xsd:string">value_1</saml2:AttributeValue>
    <saml2:AttributeValue xsi:type="xsd:string">value_2</saml2:AttributeValue>
  </saml2:Attribute>
</saml2:AttributeStatement>

JWT y token RC

El token JWT proporciona los atributos a través del campo additional_claims. El campo es un objeto y contiene una asignación de los nombres de atributos a una lista de valores de atributos. Los nombres de los atributos no cambiaron en las aserciones de SAML proporcionadas.

En el ejemplo de aserción de SAML, el JWT de IAP contiene lo siguiente:

{
  "additional_claims": {
    "my_saml_attr_1": ["value_1", "value_2"]
  }
}

Encabezados en una aserción de SAML

En los encabezados, los valores de los atributos, las claves y los nombres son URL con caracteres de escape de acuerdo con RFC 3986 y unidos por comas. Por ejemplo, header&name: header$value se convierte en x-goog-iap-attr-header%26name: header%24value.

Para identificar de forma única los encabezados de IAP, cada encabezado contiene el prefijo de IAP x-goog-iap-attr-. Por motivos de seguridad, el balanceador de cargas quita todos los encabezados de solicitud con el prefijo x-goog-iap-attr. Esto garantiza que IAP genere los encabezados que recibe la aplicación.

En el ejemplo de aserción de SAML, el encabezado tiene el siguiente aspecto:

"x-goog-iap-attr-my_saml_attr_1": "value_1,value_2"

En el siguiente ejemplo, se muestra cómo IAP escapa los caracteres especiales cuando propaga atributos en encabezados, como value&1, value$2 y value,3:

"x-goog-iap-attr-my_saml_attr_1": "value%261,value%242,value%2C3"

A continuación, se muestra un ejemplo de cómo se escapa un nombre de encabezado.

Nombre del encabezado:

"iap,test,3": "iap_test3_value1,iap_test3_value2"

Nombre del encabezado con escape:

"X-Goog-IAP-Attr-iap%2Ctest%2C3": "iap_test3_value1,iap_test3_value2"

Personalizar atributos

Puedes usar las funciones selectByName, append, strict y emitas para modificar los nombres de los atributos propagados, especificar si usar o no el prefijo del encabezado para algunos atributos y seleccionar nuevos atributos proporcionados por IAP.

Si no necesitas la propagación de atributos de SAML, pero necesitas la dirección de correo electrónico, el ID de dispositivo o la marca de tiempo en un campo SM_USER, puedes seleccionar esos atributos en iap_attributes list: attributes.iap_attributes...

IAP proporciona los siguientes atributos: user_email, device_id y timestamp.

Ejemplos

En los siguientes ejemplos, se muestra cómo personalizar los atributos mediante las funciones selectByName, append, strict y emitas.

Toma la aserción de SAML de ejemplo.

selectByName

Usa la función selectByName para seleccionar un solo atributo de una lista determinada por nombre. Por ejemplo, para seleccionar my_saml_attr_1, usa la siguiente expresión:

attributes.saml_attributes.selectByName("my_saml_attr_1")

append

Usa la función append para agregar un atributo a una lista de atributos. Debes seleccionar este atributo de una de las listas de atributos de IAP admitidos. Por ejemplo, para agregar my_saml_attr_2 a una lista que contiene my_saml_attr_1, usa la siguiente expresión:

attributes.saml_attributes.filter(x, x.name in ["my_saml_attr_1"]).append(attributes.saml_attributes.selectByName("my_saml_attr_2"))

Puedes agregar "my_saml_attr_2" a la lista de filtros. También puedes agregar varios atributos y agregarlos a una lista encadenando los anexos, como se muestra a continuación:

attributes.saml_attributes.filter(x, x.name in ["my_saml_attr_1"]).append(
attributes.saml_attributes.selectByName("my_saml_attr_2")).append(
attributes.saml_attributes.selectByName("my_saml_attr_3"))

Agregar atributos únicos es más útil cuando se combina con las funcionalidades strict y emitAs.

strict

Usa la función strict para marcar un atributo, de modo que IAP no prefija el nombre con x-goog-iap-attr-. Esto es útil cuando el nombre de un atributo debe ser exacto para la aplicación de backend. Ejemplo:

attributes.saml_attributes.selectByName("my_saml_attr_1").strict()

emitAs

Usa la función emitAs para especificar un nombre nuevo para el atributo. Todas las credenciales recibirán el nombre que especifiques. Por ejemplo, para cambiar el nombre de my_saml_attr_1 a custom_name, usa la siguiente expresión:

attributes.saml_attributes.selectByName("my_saml_attr_1").emitAs("custom_name")

Puedes usar las distintas funciones a fin de personalizar los atributos para casos de uso específicos. Por ejemplo, puedes usar la siguiente expresión para propagar el correo electrónico de un usuario desde los atributos de IAP como "SM_USER" junto con otros atributos de SAML:

attributes.saml_attributes.filter(x, x.name in ["my_saml_attr_1"]).append(
attributes.iap_attributes.selectByName("user_email").emitAs("SM_USER").strict())

Los encabezados de salida se ven de la siguiente manera:

"x-goog-iap-attr-my_saml_attr_1": "value_1,value_2"
"SM_USER": "email@domain.com"

Restricciones cuando se utiliza la propagación de atributos de SAML

Para acceder, los atributos entrantes del proveedor de identidad tienen un límite de 2 KB de datos de atributos de SAML. Las aserciones que superan el máximo de 2 KB se rechazan y el acceso falla.

La mayoría de los servidores web tienen un límite de tamaño de solicitud de 8 KB. Esto limita el tamaño de los atributos personalizados salientes, incluida la duplicación de atributos en los encabezados. Si el tamaño de los atributos (nombre más valores) supera los 5,000 bytes cuando se duplican y codifican, IAP rechaza la solicitud y muestra el código de error 401 de IAP.

Caracteres Unicode en la propagación de atributos de SAML

Esta función no es compatible con caracteres Unicode ni UTF-8, por lo que los valores de los atributos deben ser strings de bajo ASCII. Si una aserción no tiene un valor de ASCII bajo, falla el acceso.