Définir des limites sur l'attribution de rôles

Dans les grandes organisations, il peut être utile de permettre aux équipes de gérer indépendamment les stratégies de gestion de l'authentification et des accès (IAM) pour leurs ressources. Toutefois, permettre à un membre d'accorder ou de révoquer tous les rôles IAM peut considérablement augmenter les risques liés à la sécurité.

Vous pouvez définir des limites sur les rôles qu'un membre peut accorder et révoquer avec les conditions IAM et l'attribut d'API iam.googleapis.com/modifiedGrantsByRole. Ces limites vous permettent de créer des administrateurs IAM limités pouvant gérer les stratégies IAM de leur propre équipe, mais uniquement dans les limites que vous avez définies.

Avant de commencer

Autorisations requises

Pour définir des limites sur les rôles qu'un membre peut accorder ou révoquer, vous devez disposer d'un rôle qui inclut les autorisations suivantes :

  • resourcemanager.resource-type.getIamPolicy
  • resourcemanager.resource-type.setIamPolicy

Remplacez resource-type par l'un des éléments suivants :

  • Si vous souhaitez créer un administrateur IAM limité pour une organisation, utilisez organizations.
  • Si vous souhaitez créer un administrateur IAM limité pour un dossier, utilisez folders.
  • Si vous souhaitez créer un administrateur IAM limité pour un projet, utilisez projects.

Pour obtenir ces autorisations tout en suivant le principe du moindre privilège, demandez à votre administrateur de vous attribuer le rôle d'Administrateur de sécurité IAM (roles/iam.securityAdmin).

Votre administrateur peut également vous attribuer un autre rôle qui inclut les autorisations requises, par exemple un rôle personnalisé ou un rôle prédéfini moins restrictif.

Cas d'utilisation courants

Dans les sections suivantes, nous allons voir comment vous pouvez utiliser l'attribution de rôles limités pour permettre la gestion de stratégies en libre-service.

Créer des administrateurs IAM limités

Imaginons un scénario dans lequel vous souhaitez autoriser un utilisateur, Finn (finn@example.com), à agir en tant qu'administrateur IAM limité pour votre projet. Vous souhaitez que Finn ne puisse accorder et révoquer que les rôles d'administrateur de compte de facturation (roles/billing.admin) et d'utilisateur de compte de facturation (roles/billing.user) pour votre projet.

Pour accorder cette fonctionnalité limitée, vous accordez de manière conditionnelle à Finn le rôle d'administrateur de projet IAM (roles/resourcemanager.projectIamAdmin). Le rôle d'administrateur de projet IAM permet à Finn d'accorder et de révoquer des rôles IAM, et la condition limite les rôles que Finn peut accorder et révoquer :

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "finn@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_billing_roles",
        "description": "Only allows changes to role bindings for billing accounts",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/billing.admin', 'roles/billing.user'])"
      }
    }
  ]
}

Cette liaison de rôle conditionnelle permet à Finn d'effectuer les opérations suivantes :

  • Attribuer les rôles Administrateur de compte de facturation et d'Utilisateur de compte de facturation pour le projet
  • Révoquer les rôles d'administrateur de compte de facturation et d'utilisateur de compte de facturation pour le projet
  • Ajouter, supprimer ou modifier des conditions pour les liaisons de rôles au niveau du projet qui accordent les rôles d'administrateur de compte de facturation et d'utilisateur de compte de facturation
  • Effectuer d'autres actions autorisées par le rôle d'administrateur IAM du projet qui ne modifie pas la stratégie IAM du projet. Par exemple, Finn peut utiliser la méthode projects.getIamPolicy pour obtenir la stratégie du projet.

Cette liaison de rôle conditionnelle ne permet pas à Finn d'effectuer les opérations suivantes :

  • Modifier les stratégies IAM pour des ressources autres que le projet
  • Accorder des rôles autres que les rôles d'administrateur de compte de facturation ou d'utilisateur de compte de facturation
  • Révoquer des rôles autres que les rôles d'administrateur de compte de facturation ou d'utilisateur de compte de facturation
  • Ajouter, supprimer ou modifier des conditions pour les liaisons de rôles qui n'accordent pas les rôles d'administrateur de compte de facturation ou d'utilisateur de compte de facturation

Autoriser les utilisateurs à gérer des administrateurs IAM limités

Imaginons, par exemple, que vous souhaitiez qu'un utilisateur, Lila, soit un administrateur IAM limité pour son équipe. Vous souhaitez que Lila puisse uniquement accorder et révoquer le rôle d'administrateur Compute (roles/compute.admin) pour son projet. Vous souhaitez également que Lila sélectionne d'autres utilisateurs pour agir en tant qu'administrateurs IAM limités. En d'autres termes, vous souhaitez permettre à d'autres utilisateurs d'accorder et de révoquer uniquement le rôle d'administrateur de Compute.

Vous pensez peut-être que la solution consiste à attribuer à Lila le rôle d'administrateur de projet IAM (roles/resourcemanager.projectIamAdmin), puis à lui permettre d'accorder ou de révoquer ce rôle pour d'autres personnes. Toutefois, si vous accordez à Lila le rôle d'administrateur de projet IAM, elle peut supprimer la condition de son propre rôle et s'autoriser à accorder ou à révoquer n'importe quel rôle IAM.

Pour éviter cette transmission de privilèges, créez un groupe Google, iam-compute-admins@example.com, pour les administrateurs IAM limités du projet. Ensuite, ajoutez Lila au groupe et rendez-la gestionnaire de groupe.

Après avoir créé le groupe, vous lui accordez de manière conditionnelle le rôle d'administrateur de projet IAM (roles/resourcemanager.projectIamAdmin). Le rôle d'administrateur de projet IAM permet aux membres du groupe d'accorder et de révoquer des rôles IAM, et la condition limite les rôles qu'ils peuvent accorder et révoquer :

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "iam-compute-admins@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_compute_admin_role",
        "description": "Only allows changes to role bindings for the Compute Admin role",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/compute.admin'])"
      }
    }
  ]
}

En tant que membre du groupe iam-compute-admins@example.com, Lila peut effectuer les opérations suivantes :

  • Accorder le rôle d'administrateur Compute du projet en ajoutant une nouvelle liaison pour le rôle, ou en ajoutant un membre à une liaison existante pour le rôle
  • Révoquer le rôle d'administrateur Compute en supprimant une liaison existante pour le rôle ou en supprimant un membre d'une liaison existante pour le rôle
  • Modifier les autorisations pour le rôle d'administrateur Compute en ajoutant, supprimant ou modifiant des conditions associées aux liaisons du rôle
  • Effectuer d'autres actions autorisées par le rôle d'administrateur IAM du projet qui ne modifie pas la stratégie IAM du projet. Par exemple, elle peut utiliser la méthode projects.getIamPolicy pour obtenir la stratégie du projet.

En tant qu'administrateur du groupe iam-compute-admins@example.com, Lila peut autoriser d'autres utilisateurs à accorder ou à révoquer le rôle d'administrateur Compute en les ajoutant au groupe iam-compute-admins@example.com.

Lila ne peut pas effectuer les opérations suivantes :

  • S'autoriser à accorder ou à révoquer d'autres rôles
  • Modifier les stratégies IAM pour des ressources autres que le projet
  • Accorder des rôles autres que le rôle d'administrateur Compute
  • Révoquer les rôles autres que celui d'administrateur Compute
  • Ajouter, supprimer ou modifier des conditions pour les liaisons de rôles qui n'incluent pas le rôle d'administrateur Compute

Limiter l'attribution de rôles

Les sections suivantes expliquent comment autoriser des membres à accorder ou à révoquer uniquement certains rôles.

Écrire une expression de condition pour limiter l'attribution de rôles

Pour limiter la capacité d'un membre à attribuer des rôles, écrivez une expression de condition qui spécifie les rôles qu'un membre peut accorder ou révoquer.

Utilisez le format suivant pour votre expression de condition :

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(roles)

Cette expression effectue les opérations suivantes :

  • Récupérer l'attribut de l'API iam.googleapis.com/modifiedGrantsByRole à l'aide de la fonction api.getAttribute()

    Pour une requête permettant de définir la stratégie IAM d'une ressource, cet attribut contient les noms de rôle des liaisons modifiées par la requête. Pour les autres types de requêtes, l'attribut n'est pas défini. Dans ces cas, la fonction renvoie la valeur par défaut ([]).

  • Utilise la fonction hasOnly() Common Expression Language pour définir et appliquer les rôles que le membre est autorisé à accorder ou à révoquer.

    L'entrée de la fonction hasOnly() est une liste des rôles que le membre est autorisé à accorder ou à révoquer. Si les rôles de l'attribut iam.googleapis.com/modifiedGrantsByRole sont inclus dans cette liste, la fonction renvoie true. S'ils ne le sont pas, la fonction renvoie false.

    Si l'attribut iam.googleapis.com/modifiedGrantsByRole contient la valeur par défaut ([]), la fonction renvoie true, car [] ne contient aucun rôle non inclus dans la liste.

Pour personnaliser cette expression, remplacez roles par la liste des rôles que le membre peut accorder ou révoquer. Par exemple, pour permettre au membre d'accorder ou de révoquer uniquement le rôle d'Editor Pub/Sub (roles/pubsub.editor ) et de Publisher Pub/Sub (roles/pubsub.publisher ), utilisez la valeur ['roles/pubsub.editor', 'roles/pubsub.publisher'].

Vous pouvez inclure jusqu'à 10 valeurs dans la liste des rôles autorisés. Toutes ces valeurs doivent être des constantes de chaîne.

Limiter l'attribution de rôles à l'aide de liaisons de rôles conditionnelles

Pour permettre à un membre de n'accorder ou de révoquer que certains rôles, utilisez l'expression de condition de la section précédente pour créer une liaison de rôle conditionnelle. Ajoutez ensuite la liaison de rôle conditionnelle à la stratégie IAM d'une ressource.

  1. Sélectionnez une ressource qui représente le champ d'application pour lequel un membre peut attribuer et révoquer des rôles :

    • Si vous souhaitez autoriser un membre à accorder et révoquer certains rôles pour toutes les ressources d'une organisation, sélectionnez une organisation.
    • Si vous souhaitez autoriser un membre à accorder et révoquer certains rôles pour toutes les ressources d'un dossier, sélectionnez un dossier.
    • Si vous souhaitez autoriser un membre à accorder et révoquer certains rôles pour toutes les ressources d'un projet, sélectionnez un projet.
  2. Sélectionnez un rôle permettant à un membre de définir la stratégie IAM pour le type de ressource que vous avez sélectionné (projet, dossier ou organisation). Pour suivre le principe du moindre privilège, choisissez l'un des rôles prédéfinis suivants :

    • Projets : administrateur IAM de projets (roles/resourcemanager.projectIamAdmin)
    • Dossiers : administrateur IAM de dossiers (roles/resourcemanager.folderIamAdmin)
    • Organisations : administrateur de l'organisation (roles/resourcemanager.organizationAdmin)

    Vous pouvez également choisir un rôle personnalisé qui inclut les autorisations resourcemanager.resource-type.setIamPolicy et resourcemanager.resource-type.getIamPolicy, où resource-type correspond à project, folder ou organization.

  3. Accordez de manière conditionnelle à un membre le rôle que vous avez choisi pour le projet, le dossier ou l'organisation que vous avez sélectionné.

    La nouvelle stratégie est appliquée et votre membre ne peut modifier les liaisons que pour les rôles que vous avez autorisés.

    Console

    1. Dans Cloud Console, accédez à la page IAM.

      Accéder à la page IAM

    2. Assurez-vous que le nom de votre projet, dossier ou organisation apparaît dans le sélecteur de ressources en haut de la page. Le sélecteur de ressources indique le projet, le dossier ou l'organisation dans lequel vous travaillez actuellement.

      Si vous ne voyez pas le nom de votre ressource, cliquez sur le sélecteur de ressource, puis sélectionnez votre ressource.

    3. Dans la liste des membres, localisez le membre qui accorde et révoque les rôles, puis cliquez sur le bouton .

    4. Dans le panneau Modifier les autorisations, sélectionnez le rôle que vous avez choisi précédemment. Sous Condition, cliquez sur Ajouter une condition.

    5. Dans le panneau Modifier la condition, saisissez un titre et une description facultative pour la condition.

    6. Cliquez sur l'onglet Éditeur de conditions, puis saisissez l'expression que vous avez écrite dans Écrire une expression de condition pour limiter l'attribution de rôles. Cette expression limite les rôles que le membre peut accorder ou révoquer.

      Par exemple, l'expression de condition suivante limite le membre à accorder et à révoquer les rôles d'Editor Pub/Sub (roles/pubsub.editor) et de Publisher Pub/Sub (roles/pubsub.publisher) :

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Avertissement : N'incluez pas les types de rôles suivants dans la liste des rôles autorisés :

      • Rôles disposant d'autorisations pour accorder et révoquer les rôles IAM (c'est-à-dire, les rôles avec des noms d'autorisation se terminant par setIamPolicy)
      • Rôles personnalisés que l'administrateur IAM limité peut modifier. Par exemple, si l'administrateur IAM limité dispose également du rôle d'administrateur de rôle (roles/iam.roleAdmin) sur un projet, ne l'autorisez pas à accorder ou à révoquer les rôles personnalisés au niveau du projet.

      Les administrateurs IAM limités qui peuvent accorder et révoquer ces types de rôles peuvent s'autoriser à accorder et à révoquer tous les rôles IAM. Pour en savoir plus, consultez la section Écrire une expression de condition pour limiter l'attribution de rôles.

    7. Cliquez sur Enregistrer pour appliquer la condition.

    8. Une fois le panneau Modifier la condition fermé, cliquez sur Enregistrer dans le panneau Modifier les autorisations pour mettre à jour votre stratégie IAM.

    gcloud

    Les stratégies Cloud IAM sont définies à l'aide du modèle lecture-modification-écriture.

    Consultez la stratégie Cloud IAM associée à la ressource :

    Exécutez la commande get-iam-policy. Cette commande obtient la stratégie IAM actuelle de la ressource.

    Commande :

    gcloud resource-type get-iam-policy resource-id --format=json > path
    

    Remplacez les valeurs suivantes :

    • resource-type : type de ressource pour lequel un membre peut accorder ou révoquer des rôles. Utilisez l'un des éléments suivants : projects, folders ou organizations.
    • resource-id : votre projet, dossier ou ID Google Cloud
    • path : chemin d'accès au fichier vers lequel télécharger la stratégie IAM

    La stratégie IAM est enregistrée au format JSON, par exemple :

    {
      "bindings": [
        {
          "members": [
            "user:project-owner@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 1
    }
    

    Modifiez ensuite la stratégie.

    Pour permettre à un membre de ne modifier que les liaisons de certains rôles, ajoutez la liaison de rôle conditionnelle en surbrillance :

    {
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "member"
          ],
          "role": "role",
          "condition": {
            "title": "title",
            "description": "description",
            "expression":
              "expression"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }

    Remplacez les valeurs suivantes :

    • member : membre qui permet d'accorder ou de révoquer certains rôles. Exemple :user:my-user@example.com Pour connaître les formats de chaque type de membre, consultez la documentation de référence sur Binding.
    • role : rôle que vous avez choisi lors des étapes précédentes. Ce rôle doit inclure l'autorisation setIamPolicy pour le type de ressource que vous avez choisi.
    • title : chaîne décrivant brièvement la condition. Exemple :only_pubsub_roles
    • description : facultatif. Une description supplémentaire de la condition. Exemple :Only allows granting/revoking the Pub/Sub editor and publisher roles
    • expression : expression que vous avez écrite dans la section Écrire une expression de condition pour limiter l'attribution de rôles. Cette expression limite les rôles que le membre peut accorder ou révoquer.

      Par exemple, l'expression de condition suivante limite le membre à accorder et à révoquer les rôles d'Editor Pub/Sub (roles/pubsub.editor) et de Publisher Pub/Sub (roles/pubsub.publisher) :

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Avertissement : N'incluez pas les types de rôles suivants dans la liste des rôles autorisés :

      • Rôles disposant d'autorisations pour accorder et révoquer les rôles IAM (c'est-à-dire, les rôles avec des noms d'autorisation se terminant par setIamPolicy)
      • Rôles personnalisés que l'administrateur IAM limité peut modifier. Par exemple, si l'administrateur IAM limité dispose également du rôle d'administrateur de rôle (roles/iam.roleAdmin) sur un projet, ne l'autorisez pas à accorder ou à révoquer les rôles personnalisés au niveau du projet.

      Les administrateurs IAM limités qui peuvent accorder et révoquer ces types de rôles peuvent s'autoriser à accorder et à révoquer tous les rôles IAM. Pour en savoir plus, consultez la section Écrire une expression de condition pour limiter l'attribution de rôles.

    Enfin, écrivez la stratégie mise à jour :

    Définissez la nouvelle règle en exécutant la commande set-iam-policy pour la ressource :

    gcloud resource-type set-iam-policy resource-id path
    

    Remplacez les valeurs suivantes :

    • resource-type : type de ressource pour lequel un membre peut accorder ou révoquer des rôles. Utilisez l'un des éléments suivants : projects, folders ou organizations.
    • resource-id : votre projet, dossier ou ID Google Cloud
    • path : chemin d'accès au fichier contenant la stratégie mise à jour

    La nouvelle stratégie est appliquée et le membre ne peut modifier les liaisons que pour les rôles que vous avez autorisés.

    REST

    Les stratégies Cloud IAM sont définies à l'aide du modèle lecture-modification-écriture.

    Consultez la stratégie Cloud IAM associée à la ressource :

    La méthode getIamPolicy de l'API Resource Manager permet d'obtenir la stratégie IAM d'un projet, d'un dossier ou d'une organisation.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • api-version : version de l'API à utiliser. Pour les projets et les organisations, utilisez v1. Pour les dossiers, utilisez v2.
    • resource-type : type de ressource dont vous souhaitez gérer la stratégie. Utilisez la valeur projects, folders ou organizations.
    • resource-id : ID du projet, de l'organisation ou du dossier Google Cloud.
    • policy-version : version de la stratégie à renvoyer. Les requêtes doivent spécifier la version de stratégie la plus récente, qui est la version 3. Pour plus d'informations, consultez la section Spécifier une version de stratégie lors de l'obtention d'une stratégie.

    Méthode HTTP et URL :

    POST https://cloudresourcemanager.googleapis.com/api-version/resource-type/resource-id:getIamPolicy

    Corps JSON de la requête :

    {
      "options": {
        "requestedPolicyVersion": policy-version
      }
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

    Modifiez ensuite la stratégie.

    Ajoutez une liaison de rôle conditionnelle permettant à un membre d'accorder et de révoquer uniquement certains rôles. Veillez à remplacer la valeur du champ version par la valeur 3 :

    {
      "version": 3,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "member"
          ],
          "role": "role",
          "condition": {
            "title": "title",
            "description": "description",
            "expression":
              "expression"
          }
        }
      ]
    }
    • member : membre qui permet d'accorder ou de révoquer certains rôles. Exemple :user:my-user@example.com Pour connaître les formats de chaque type de membre, consultez la documentation de référence sur Binding.
    • role : rôle que vous avez choisi lors des étapes précédentes. Ce rôle doit inclure l'autorisation setIamPolicy pour le type de ressource que vous avez choisi.
    • title : chaîne décrivant brièvement la condition. Exemple :only_pubsub_roles
    • description : facultatif. Une description supplémentaire de la condition. Exemple :Only allows granting/revoking the Pub/Sub editor and publisher roles
    • expression : expression que vous avez écrite dans la section Écrire une expression de condition pour limiter l'attribution de rôles. Cette expression limite les rôles que le membre peut accorder ou révoquer.

      Par exemple, l'expression de condition suivante limite le membre à accorder et à révoquer les rôles d'Editor Pub/Sub (roles/pubsub.editor) et de Publisher Pub/Sub (roles/pubsub.publisher) :

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])
      

      Avertissement : N'incluez pas les types de rôles suivants dans la liste des rôles autorisés :

      • Rôles disposant d'autorisations pour accorder et révoquer les rôles IAM (c'est-à-dire, les rôles avec des noms d'autorisation se terminant par setIamPolicy)
      • Rôles personnalisés que l'administrateur IAM limité peut modifier. Par exemple, si l'administrateur IAM limité dispose également du rôle d'administrateur de rôle (roles/iam.roleAdmin) sur un projet, ne l'autorisez pas à accorder ou à révoquer les rôles personnalisés au niveau du projet.

      Les administrateurs IAM limités qui peuvent accorder et révoquer ces types de rôles peuvent s'autoriser à accorder et à révoquer tous les rôles IAM. Pour en savoir plus, consultez la section Écrire une expression de condition pour limiter l'attribution de rôles.

    Enfin, écrivez la stratégie mise à jour :

    La méthode setIamPolicy de l'API Resource Manager définit la stratégie de la requête comme nouvelle stratégie IAM pour le projet, le dossier ou l'organisation.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • api-version : version de l'API à utiliser. Pour les projets et les organisations, utilisez v1. Pour les dossiers, utilisez v2.
    • resource-type : type de ressource dont vous souhaitez gérer la stratégie. Utilisez la valeur projects, folders ou organizations.
    • resource-id : ID du projet, de l'organisation ou du dossier Google Cloud.
    • policy : représentation JSON de la stratégie que vous souhaitez définir. Pour en savoir plus sur le format d'une stratégie, consultez la documentation de référence sur les stratégies.

      Par exemple, pour définir la stratégie présentée à l'étape précédente, remplacez policy par ce qui suit :

      {
        "version": 3,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "members": [
              "user:owner@example.com"
            ],
            "role": "roles/owner"
          },
          {
            "members": [
              "member"
            ],
            "role": "role",
            "condition": {
              "title": "title",
              "description": "description",
              "expression":
                "expression"
            }
          }
        ]
      }
      

    Méthode HTTP et URL :

    POST https://iam.googleapis.com/api-version/resource-type/resource-id:setIamPolicy

    Corps JSON de la requête :

    {
      "policy": policy
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    La réponse contient la stratégie mise à jour.

Étape suivante