Répertorier toutes les ressources de votre hiérarchie

Les ressources présentes dans Google Cloud sont organisées selon une hiérarchie, dont chacun des nœuds (Organisations, Dossiers, Projets, etc.) fait référence à son parent. Vous pouvez utiliser cette référence comme une expression de filtre par clé permettant aux analyses d'améliorer la cohérence des recherches de ressources.

Vous pouvez accorder des autorisations aux utilisateurs en définissant des rôles personnalisés. Ces rôles fonctionnent selon le principe du moindre privilège et ne fournissent généralement que le minimum d'autorisations nécessaires pour effectuer une tâche donnée.

Un tel dispositif peut être utile pour isoler différents groupes d'utilisateurs. Exemples :

  • Une grande entreprise dont les différents services ne doivent pas avoir la possibilité d'inspecter les ressources les uns des autres
  • Des sous-traitants recevant des autorisations pour un projet spécifique à l'exclusion de toute autre ressource

Toutefois, en raison de leurs autorisations restreintes, les rôles personnalisés peuvent entraîner l'omission de nombreuses ressources de votre hiérarchie lors de l'exécution d'une opération de liste. Lorsque vous effectuez des recherches en tant qu'utilisateur doté d'un rôle personnalisé, il peut être difficile de déterminer pourquoi certaines ressources ne s'affichent pas.

Afin d'éviter un tel scénario, cette page présente les bonnes pratiques à suivre pour répertorier toutes les ressources gérées par l'API Resource Manager dans votre hiérarchie de ressources. Ces conseils peuvent vous aider à configurer des vérifications d'audit personnalisées, ou à créer votre propre expérience utilisateur en plus de l'API Resource Manager.

Répertorier toutes les ressources

Lorsque vous analysez votre hiérarchie de ressources afin de répertorier toutes les ressources, il importe que les résultats obtenus soient fortement cohérents. Si votre analyse omet certaines ressources ou fournit des résultats obsolètes, il peut être difficile de déterminer si un problème est survenu. Pour obtenir à coup sûr les résultats les plus précis et les plus complets possibles, utilisez un compte de service et procédez comme suit pour l'analyse :

  1. Attribuez à un compte de service les autorisations list et get pour les organisations, les dossiers et les projets de la ressource Organisation.
  2. Si vous répertoriez les ressources de projets et de dossiers, spécifiez la ressource parente dans la chaîne de filtre.
  3. Exécutez la méthode projects.list() via ce compte de service pour chaque type de ressource recherché, ainsi que pour toutes les ressources intermédiaires telles que les dossiers.

Exemple montrant comment répertorier toutes les ressources

L'exemple qui suit explique comment répertorier tous les nœuds de ressources de votre organisation :

organizations = CloudResourceManager.Organizations.Search()
projects = emptyList()

parentsToList = queueOf(organizations)
while (parent = parentsToList.pop()) {
  // NOTE: Don't forget to iterate over paginated results.
  // TODO: handle PERMISSION_DENIED appropriately.
  projects.addAll(CloudResourceManager.Projects.List(
      "parent.type:" + parent.type + " parent.id:" + parent.id))
  parentsToList.addAll(CloudResourceManager.Folders.List(parent))
}

Lorsque vous créez une expérience utilisateur personnalisée, vous pouvez également avoir besoin de mélanger les résultats de recherche et de charger les ressources parentes selon vos besoins (tout en interceptant l'exception PERMISSION_DENIED).

Rechercher des ressources

Si votre analyse a pour but de rechercher une ressource qui a été créée il y a quelque temps, vous pouvez effectuer une analyse plus rapide privilégiant une cohérence à terme par rapport à une cohérence forte. Notez que cette méthode de recherche peut exclure certaines ressources des résultats, en particulier celles qui ont été modifiées récemment. Pour rechercher des ressources, procédez comme suit :

  1. Utilisez un compte de service disposant de l'autorisation get pour la ressource que vous recherchez.
  2. Exécutez la méthode projects.list() avec ce compte de service.

Résoudre les problèmes d'omission de ressources

Si vous développez un outil d'analyse, nous vous recommandons d'utiliser les autorisations list et get accordées au niveau de l'organisation. Vous évitez ainsi les problèmes liés au caractère partiel des autorisations détenues par l'utilisateur, qui entraîne l'omission de certaines ressources dans la liste.

Si vous concevez une expérience utilisateur personnalisée qui vérifie les autorisations des utilisateurs, il n'existe pas de solution simple. Si un utilisateur ne détient pas les autorisations requises au niveau de l'organisation, il lui faudra disposer de certaines autorisations sur chacune des ressources à répertorier. Si un utilisateur ne dispose pas des autorisations nécessaires sur une ressource de la hiérarchie, certaines ressources risquent de ne pas s'afficher.

Si un utilisateur dispose de l'autorisation list mais pas de l'autorisation get pour une ressource donnée, cette ressource ne sera pas visible du tout dans Google Cloud Console. Cette même ressource sera toutefois renvoyée lors d'une recherche effectuée via l'API ou l'outil de ligne de commande gcloud, et spécifiant le parent de la ressource. La disparité entre Google Cloud Console et les autres méthodes est une source courante de confusion lors des tentatives d'analyse de la hiérarchie des ressources.

Les schémas suivants illustrent certaines configurations courantes des autorisations, en indiquant comment elles modifient les ressources visibles par un utilisateur effectuant une recherche.

Répertorier toutes les ressources

Dans cet exemple, toutes les autorisations requises sont accordées dans la ressource Organisation. Par conséquent, la hiérarchie tout entière est visible lorsque vous effectuez une recherche ou une opération de liste.

Autorisations d'organisation manquantes

Dans cet exemple, l'utilisateur dispose de toutes les autorisations requises à l'exception de resourcemanager.organizations.get, mais ces autorisations ne lui sont accordées qu'au niveau du dossier. Lors des opérations de liste ou de recherche, cette lacune dans les autorisations lui donne une visibilité totale sur une branche de la hiérarchie, mais pas sur l'autre.

Autorisation projects.get uniquement

Cet exemple illustre l'expérience d'un utilisateur ne disposant que de l'autorisation resourcemanager.projects.get accordée au niveau d'une ressource Dossier. L'utilisateur peut voir les projets situés sous ce dossier dans la hiérarchie, mais uniquement en effectuant une recherche. La fonctionnalité de liste ne renvoie aucun résultat.

Autorisation folders.get uniquement

Cet exemple présente le même problème que le précédent : les autorisations accordées permettent uniquement à l'utilisateur de trouver ses ressources Dossier via des recherches. La fonctionnalité de liste ne renvoie aucun résultat.

Autorisations mixtes

Dans cet exemple, les utilisateurs disposent d'une combinaison d'autorisations au sein de leur organisation. Ils peuvent obtenir la liste des dossiers depuis le niveau de l'organisation, ce qui leur permet de retrouver les dossiers de l'ensemble de la hiérarchie via des recherches spécifiant la ressource parente. Ils peuvent répertorier les ressources Projet d'un dossier, mais pas celles de l'autre, et ils disposent de l'autorisation resourcemanager.projects.get pour un projet situé au niveau inférieur de la hiérarchie.

Ils n'ont donc pas la possibilité de répertorier les projets de la branche de gauche de cette hiérarchie de ressources. Ils ne peuvent répertorier les projets de la branche de droite qu'au moyen d'une recherche spécifiant la ressource parente, et ils ne voient qu'un seul projet dans Cloud Console.

Ressources non visibles

Dans cet exemple, les utilisateurs peuvent récupérer la ressource Organisation et répertorier les ressources Projet de la hiérarchie tout entière en spécifiant la ressource parente. En revanche, ils n'ont pas la possibilité de répertorier ni de rechercher les dossiers intermédiaires. L'utilisateur ne peut rechercher des projets que s'il connaît l'ID de leur dossier parent. Les dossiers ne sont pas du tout visibles par cet utilisateur, qui ne peut donc pas retrouver leur ID s'il ne le connaît pas déjà. La seule ressource qui apparaît dans Cloud Console est l'organisation.

Lors de la conception de votre expérience utilisateur personnalisée, il est important d'identifier les situations comparables à celles décrites ci-dessus. Vous pouvez afficher la hiérarchie des ressources à l'aide d'une combinaison d'opérations de liste et de recherche. Vous pouvez également réfléchir à la manière d'indiquer aux utilisateurs qu'il leur manque certaines autorisations pour afficher la hiérarchie des ressources tout entière.