Configurer la propagation des attributs SAML

Cette page explique comment activer et utiliser la propagation des attributs SAML (Security Assertion Markup Language). Vous pouvez utiliser cette fonctionnalité pour propager des attributs SAML à partir d'un fournisseur d'identité vers des applications protégées par Identity-Aware Proxy (IAP). Lorsque vous propagez des attributs SAML, vous pouvez spécifier les attributs à propager et la méthode de diffusion.

Avant de commencer

Pour utiliser la fonctionnalité de propagation des attributs SAML, vous devez disposer d'une licence Chrome Enterprise Premium.

Vous devez connaître la spécification des assertions et des protocoles SAML V2.0.

Comprendre comment les données sont traitées

Avant d'activer la propagation des attributs SAML, assurez-vous de comprendre comment Google Cloud gère les données et de connaître les types d'informations que vous devez transmettre et non transmettre via ce canal.

Vous pouvez configurer IAP pour qu'il inclue un ou plusieurs attributs dans les informations qu'il fournit à vos applications protégées. Si vous configurez l'authentification unique via un fournisseur d'identité tiers et que votre fournisseur d'identité inclut un <AttributeStatement> dans l'assertion SAML, Google Cloud stocke temporairement les attributs associés à la session du compte Google d'un utilisateur. Lorsqu'une session de compte Google expire, un processus asynchrone supprime définitivement les informations sous une semaine. Vous pouvez configurer la date d'expiration.

N'utilisez pas la propagation d'attributs SAML pour des informations personnelles sensibles telles que les identifiants de compte, les numéros de carte d'identité nationale, les données sur les titulaires de cartes, les données comptables, les informations de santé ou les informations concernant des parcours personnels.

Activer la propagation des attributs SAML

Activez la propagation des attributs SAML en créant un profil SSO dans Google Workspace, puis mettez à jour les paramètres de l'IAP à l'aide de la Google Cloud CLI ou de l'API REST.

Console

  1. Dans la console Google Cloud, accédez à la page "IAP".
    Accéder à IAP
  2. Ouvrez les paramètres d'une ressource, puis faites défiler la page jusqu'à Propagation des attributs.
  3. Sélectionnez Activer la propagation des attributs, puis cliquez sur Enregistrer.
  4. Dans l'onglet Attributs SAML, saisissez les attributs que vous souhaitez propager au format suivant : attribute1, attribute2, attribute3

    Vous pouvez également saisir les attributs à l'aide d'une expression personnalisée.Les attributs de votre expression personnalisée s'affichent dans l'onglet Attributs SAML. Vous devez utiliser le format d'expression suivant pour que vos attributs s'affichent dans l'onglet Attributs SAML:
    attributes.saml_attributes.filter(attribute, attribute.name in ['attribute', 'attribute2', 'attribute1'])

  5. Pour Types d'identifiants à transmettre, sélectionnez au moins un format d'attribut provenant de l'IdP à transmettre aux applications.

gcloud

Exécutez les commandes gcloud CLI IAP suivantes pour mettre à jour les paramètres de propagation des attributs SAML:

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

Remplacez les éléments suivants :

  • FOLDER: dossier dans lequel se trouve votre application.
  • ORGANIZATION: organisation dans laquelle se trouve votre application.
  • PROJECT: projet dans lequel se trouve votre application.
  • RESOURCE_TYPE: type de ressource.
  • SERVICE: service.
  • VERSION: numéro de version.

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 REST

Vous pouvez configurer la propagation des attributs SAML à l'aide de l'objet ApplicationSettings dans IapSettings, comme illustré dans les exemples suivants:

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

AttributePropagationSettings

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

Définir les identifiants de sortie

Lorsque vous utilisez la propagation des attributs SAML, vous pouvez envoyer des attributs via plusieurs supports, y compris des jetons Web JSON (JWT) et des en-têtes, en définissant des identifiants de sortie. Pour définir les identifiants dans l'API, vous pouvez spécifier une liste de chaînes séparées par une virgule, comme illustré dans l'exemple suivant:

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

Filtrer les attributs SAML à l'aide de Common Expression Language

Vous pouvez utiliser des fonctions CEL (Common Expression Language) pour filtrer les attributs SAML.

L'utilisation d'expressions CEL avec la propagation d'attributs SAML présente les limites suivantes:

  • Une expression doit renvoyer une liste d'attributs.
  • Une expression peut sélectionner 45 attributs maximum.
  • Une chaîne d'expression ne peut pas dépasser 1 000 caractères.

Vous trouverez ci-dessous les fonctions CEL compatibles avec la fonctionnalité de propagation des attributs SAML de l'API Play.

Notez que les fonctions sont sensibles à la casse et doivent être utilisées exactement comme elles sont écrites. L'ordre des fonctions strict et emitAs n'a pas d'importance lorsque vous enchaînez des appels de fonction.

Fonction Exemple Description
Sélection de champs a.b Sélectionnez le champ b du proto a. Le caractère b peut être un autre proto, une liste ou un type de valeur simple tel qu'une chaîne.
Filtrer les listes list.Filter(iter_var, condition) Renvoie un sous-ensemble de list où les éléments répondent aux critères condition.
Membres des listes a dans b Renvoie true si la valeur a est membre de la liste b.
selectByName list.selectByName("name") Dans la liste, sélectionnez l'attribut où name = "name".
append list.append(attribute) Ajoute l'attribut donné à la liste donnée.
strict attribute.strict() Émet l'attribut sans le préfixe x-goog-iap-attr- lorsque vous utilisez HEADERS comme identifiant de sortie.
emitAs attribute.emitAs("new_name") Affiche l'attribut donné avec le nom "new_name" pour tous les identifiants de sortie sélectionnés.

Exemple d'expression CEL

Supposons une assertion 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>

Pour sélectionner my_saml_attr_1, utilisez l'expression CEL suivante:

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

Pour sélectionner my_saml_attr_1 et my_saml_attr_2, utilisez l'expression CEL suivante:

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

Format d'attribut

Tous les attributs sélectionnés sont entièrement dupliqués dans tous les identifiants de sortie sélectionnés.

Exemple: Supposer une assertion 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>

Jeton JWT et jeton RC

Le jeton JWT fournit les attributs via le champ additional_claims. Le champ est un objet et contient un mappage des noms d'attributs sur une liste de valeurs d'attributs. Les noms des attributs restent inchangés par rapport aux assertions SAML fournies.

Pour l'exemple d'assertion SAML, le jeton JWT de l'IAP contient les éléments suivants:

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

En-têtes dans une assertion SAML

Dans les en-têtes, les valeurs des attributs, des clés et des noms sont échappées en URL conformément à la RFC 3986 et sont jointes par des virgules. Par exemple, header&name: header$value devient x-goog-iap-attr-header%26name: header%24value.

Pour identifier de manière unique les en-têtes IAP, chaque en-tête contient le préfixe IAP x-goog-iap-attr-. Pour des raisons de sécurité, l'équilibreur de charge supprime tous les en-têtes de requêtes avec le préfixe x-goog-iap-attr. Cela garantit que les en-têtes reçus par l'application sont générés par l'IAP.

Pour l'exemple d'assertion SAML, l'en-tête se présente comme suit:

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

L'exemple suivant montre comment l'IAP échappe aux caractères spéciaux lors de la propagation d'attributs dans les en-têtes, tels que value&1, value$2 et value,3:

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

Voici un exemple d'échappement de nom d'en-tête.

Nom de l'en-tête:

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

Nom d'en-tête échappé:

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

Personnaliser les attributs

Vous pouvez utiliser les fonctions selectByName, append, strict et emitas pour modifier les noms des attributs propagés, spécifier si vous devez utiliser ou non le préfixe d'en-tête pour certains attributs, et sélectionner de nouveaux attributs fournis par l'IAP.

Si vous n'avez pas besoin de la propagation des attributs SAML, mais que vous avez besoin de l'adresse e-mail, de l'ID de l'appareil ou du code temporel dans un champ SM_USER, vous pouvez sélectionner ces attributs dans iap_attributes list: attributes.iap_attributes

IAP fournissent les attributs suivants: user_email, device_id et timestamp.

Examples

Les exemples suivants montrent comment personnaliser des attributs à l'aide des fonctions selectByName, append, strict et emitas.

Prenons l'exemple d'assertion SAML.

selectByName

Utilisez la fonction selectByName pour sélectionner un seul attribut d'une liste donnée par nom. Par exemple, pour sélectionner my_saml_attr_1, utilisez l'expression suivante:

attributes.saml_attributes.selectByName("my_saml_attr_1")

append

Utilisez la fonction append pour ajouter un attribut à une liste d'attributs. Vous devez sélectionner cet attribut dans l'une des listes d'attributs IAP compatibles. Par exemple, pour ajouter my_saml_attr_2 à une liste contenant my_saml_attr_1, utilisez l'expression suivante:

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

Vous pouvez ajouter "my_saml_attr_2" à la liste des filtres. Vous pouvez également ajouter plusieurs attributs et les ajouter à une liste en enchaînant les ajouts, comme suit:

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"))

L'ajout d'attributs uniques est particulièrement utile lorsqu'il est combiné à la fonctionnalité strict et emitAs.

strict

Utilisez la fonction strict pour signaler un attribut afin qu'IAP ne préfixe pas le nom par x-goog-iap-attr-. Cela est utile lorsqu'un nom d'attribut doit être exact pour l'application backend. Exemple :

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

emitAs

Utilisez la fonction emitAs pour spécifier un nouveau nom pour l'attribut. Le nom que vous spécifiez sera affiché pour tous les identifiants. Par exemple, pour renommer my_saml_attr_1 en custom_name, utilisez l'expression suivante:

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

Vous pouvez utiliser les différentes fonctions pour personnaliser les attributs en fonction de cas d'utilisation spécifiques. Par exemple, vous pouvez utiliser l'expression suivante pour propager l'adresse e-mail d'un utilisateur à partir des attributs IAP en tant que "SM_USER", ainsi que d'autres attributs SAML:

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

Les en-têtes de sortie se présentent comme suit:

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

Contraintes lors de l'utilisation de la propagation des attributs SAML

Lors de la connexion, les attributs entrants du fournisseur d'identité sont limités à 2 ko de données d'attributs SAML. Les assertions qui dépassent la limite de 2 Ko sont refusées et la connexion échoue.

La plupart des serveurs Web limitent la taille des requêtes à 8 Ko. Cela limite la taille des attributs personnalisés sortants, y compris les attributs en double dans les en-têtes. Si la taille des attributs (nom et valeurs) dépasse 5 000 octets lorsqu'ils sont dupliqués et encodés, l'IAP rejette la requête et renvoie le code d'erreur 401.

Caractères Unicode dans la propagation des attributs SAML

Cette fonctionnalité n'est pas compatible avec les caractères Unicode et UTF-8. Par conséquent, les valeurs des attributs doivent être des chaînes ASCII à valeur basse. Si une assertion n'est pas en ASCII de valeur basse, la connexion échoue.