Dépannage de "withcond" dans les stratégies et les liaisons de rôles

Lorsque vous affichez une stratégie de gestion de l'authentification et des accès (IAM), vous pouvez voir des noms de rôles incluant la chaîne withcond, suivis d'une valeur de hachage. Par exemple, vous pouvez voir un nom de rôle tel que roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

Cette page explique quand et pourquoi vous pouvez voir la chaîne withcond dans une stratégie IAM. Elle vous recommande également les mesures à prendre si vous voyez cette chaîne.

Versions de stratégies et liaisons de rôle conditionnelles

Une stratégie IAM peut être représentée sous différentes formes, qui sont appelées versions de stratégie.

Dans une stratégie IAM utilisant la version 1, certaines liaisons de rôle peuvent contenir la chaîne withcond dans un nom de rôle, suivie d'une valeur de hachage :

{
  "bindings": [
    {
      "members": [
        "user:dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Ce format indique que la liaison de rôle est conditionnelle. En d'autres termes, le rôle n'est accordé que si des conditions spécifiques sont remplies.

Les stratégies de version 1 ne présentent pas ces conditions. Si vous voyez la chaîne withcond suivie d'une valeur de hachage, la liaison de rôle inclut une condition qui n'est pas visible.

Solution : spécifier la version de stratégie 3

Pour vous assurer de pouvoir afficher et mettre à jour l'intégralité de la stratégie IAM, y compris ses conditions, vous devez toujours spécifier la version de stratégie 3 dans vos requêtes. Pour spécifier la version de stratégie 3, effectuez les tâches décrites dans les sections suivantes.

Mettre à jour l'outil gcloud

Si vous utilisez l'outil de ligne de commande gcloud, exécutez gcloud version pour vérifier son numéro de version. Le résultat inclut une chaîne semblable à celle-ci : Google Cloud SDK 279.0.0.

Si le numéro de version est inférieur à 263.0.0, exécutez gcloud components update pour mettre à jour l'outil gcloud. Dans les versions 263.0.0 et ultérieures, l'outil gcloud spécifie automatiquement une version de stratégie compatible avec les conditions.

Mettre à jour les bibliothèques clientes

Si votre application utilise une bibliothèque cliente, procédez comme suit :

  1. Recherchez le nom et le numéro de version de la bibliothèque cliente, puis consultez la liste des bibliothèques clientes compatibles avec les versions de stratégies.

    • Si vous utilisez déjà une version récente de la bibliothèque cliente et qu'elle est compatible avec les versions de stratégies, vous n'avez pas besoin de mettre à jour votre bibliothèque cliente. Passez à l'étape suivante.

    • Si vous utilisez une ancienne version de la bibliothèque cliente, et qu'une version ultérieure est compatible avec les versions de stratégies, mettez à jour votre bibliothèque cliente vers la version la plus récente.

    • Si vous utilisez une bibliothèque cliente qui n'est pas compatible avec les versions de stratégies, vous pouvez ajouter à votre application une autre bibliothèque cliente qui est compatible avec les versions de stratégies. Utilisez cette bibliothèque cliente pour travailler avec les stratégies IAM. Vous pouvez également utiliser l'API REST IAM directement.

  2. Mettez à jour le code de votre application qui obtient et définit les stratégies IAM :

Mettre à jour les appels d'API REST

Si votre application utilise directement l'API REST IAM, mettez à jour le code qui obtient et définit les stratégies IAM :

Mettre à jour les outils de gestion des stratégies IAM

Si vous conservez des copies locales de vos stratégies IAM (par exemple, si vous les stockez dans un système de contrôle des versions et les traitez comme du code), assurez-vous que tous les outils que vous utilisez répondent aux critères suivants :

  • Toutes les requêtes spécifient la version de stratégie 3
  • Toutes les requêtes de mise à jour d'une stratégie incluent le champ etag

Si un outil ne répond pas à ces critères, recherchez une version à jour de celui-ci.

Assurez-vous également que vos outils de gestion conservent les attributions de rôles conditionnelles, plutôt que d'ajouter une attribution de rôle en double qui n'inclut pas de condition. Prenons les exemples suivants :

  1. Vous accordez le rôle "Créer des comptes de service" (roles/iam.serviceAccountCreator) à l'utilisateur vikram@example.com sur le dossier my-folder. La stratégie IAM du dossier est semblable à l'exemple suivant :

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. Vous utilisez un outil pour récupérer la stratégie IAM et la stocker dans un système de contrôle des versions.

  3. Vous ajoutez une condition de sorte que vikram@example.com ne puisse créer des comptes de service que pendant la semaine de travail normale, en fonction de la date et de l'heure de Berlin, en Allemagne. La stratégie IAM mise à jour est semblable à l'exemple suivant :

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. Vous utilisez un outil pour récupérer la stratégie IAM mise à jour. L'outil ne spécifie pas de version de stratégie lorsqu'il demande la stratégie. Par conséquent, vous recevez une stratégie de version 1 avec un nom de rôle modifié :

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

À ce stade, l'outil de gestion peut décider que la liaison entre vikram@example.com et le rôle roles/iam.serviceAccountCreator a disparu, et qu'il doit restaurer la liaison de rôle originale de la stratégie :

À éviter : Toute liaison de rôle supplémentaire sans condition

{
  "bindings": [
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

Cette modification n'est pas correcte : elle attribue le rôle roles/iam.serviceAccountCreator à vikram@example.com quel que soit le jour de la semaine. Par conséquent, la condition incluse dans la première liaison de rôle n'a aucun effet.

Si vos outils de gestion tentent d'effectuer ce type de modification, n'approuvez pas la modification. Vous devez plutôt mettre à jour vos outils de gestion pour spécifier la version de stratégie 3 dans les requêtes.

Étapes suivantes