Résoudre les problèmes liés aux autorisations IAM

Policy Troubleshooter pour IAM vous aide à comprendre pourquoi un utilisateur a accès à une ressource ou ne dispose pas de l'autorisation d'appeler une API. À l'aide d'une adresse e-mail, d'une ressource et d'une autorisation, Policy Troubleshooter examine toutes les stratégies d'autorisation et de refus qui s'appliquent à la ressource. À partir de ces stratégies, il vous indique ensuite si le compte principal dispose de l'autorisation. Il répertorie également les liaisons de rôle et les règles de refus contenues dans les stratégies, et explique leur impact sur l'accès du compte principal.

Vous pouvez accéder à Policy Troubleshooter à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API REST. Pour les requêtes simples, la console Google Cloud est généralement plus rapide. Pour des scénarios plus complexes, envisagez plutôt gcloud CLI ou l'API REST.

Avant de commencer

  • Activez l'API Policy Troubleshooter

    Activer l'API

Autorisations requises

Pour résoudre les problèmes d'accès de vos comptes principaux, vous devez disposer des autorisations suivantes.

Autorisations permettant de résoudre les problèmes d'accès pour des comptes principaux individuels

Policy Troubleshooter analyse l'accès d'un compte principal à une ressource en fonction des règles d'autorisation et de refus, et des rôles que vous êtes autorisé à consulter. Si vous n'êtes pas autorisé à afficher une stratégie qui s'applique à une ressource ou à afficher un rôle personnalisé, il est possible que vous ne puissiez pas savoir si un compte principal dispose d'un accès.

Pour obtenir les autorisations nécessaires pour résoudre les problèmes d'accès d'un compte principal, demandez à votre administrateur de vous accorder les rôles IAM suivants sur l'organisation:

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Autorisations permettant de résoudre les problèmes d'accès des membres du groupe

Si vos règles d'autorisation et de refus incluent des groupes, vous devez disposer de l'autorisation groups.read pour l'API Google Workspace Admin afin de résoudre les problèmes d'accès des membres de groupe individuels. Les super-administrateurs et les administrateurs de groupe disposent automatiquement de cette autorisation. Pour accorder cette autorisation à un utilisateur qui n'est pas un super-administrateur ni un administrateur de groupe, créez un rôle d'administrateur Google Workspace personnalisé contenant le droit groups.read (situé sous Droits pour l'API Admin) et accordez-le à l'utilisateur.

Si vous ne disposez pas de ces autorisations, les liaisons de rôles et les règles de refus contenant des groupes ou des domaines ont un résultat d'accès Unknown, sauf si la règle de liaison ou de refus de rôle inclut également explicitement le compte principal.

Autorisations permettant de résoudre les problèmes d'accès des membres du domaine

Si vos règles d'autorisation et de refus incluent un compte Google Workspace ou un domaine Cloud Identity, vous devez être un administrateur du domaine pour résoudre les problèmes d'accès des membres de domaine individuels.

Si vous ne disposez pas de ces autorisations, les liaisons de rôles et les règles de refus contenant des groupes ou des domaines ont un résultat d'accès Unknown, sauf si la règle de liaison ou de refus de rôle inclut également explicitement le compte principal.

Résoudre les problèmes d'accès

Pour résoudre les problèmes d'accès, vous devez disposer des informations suivantes :

  • Principale : l'adresse e-mail à vérifier. L'adresse e-mail doit faire référence à un utilisateur ou un compte de service. Les autres types de comptes principaux, tels que les groupes, les domaines, les identités des employés et les identités de charge de travail, ne sont pas compatibles.
  • Ressource : le nom complet de la ressource. Par exemple, pour vérifier le projet my-project, saisissez //cloudresourcemanager.googleapis.com/projects/my-project. Pour les autres types de ressources, consultez les exemples de noms de ressources complets.
  • Autorisation : l'autorisation pour la vérification. Si vous utilisez la console Google Cloud, elle affiche une liste de suggestions au fur et à mesure de la saisie. Pour obtenir la liste complète des autorisations, consultez la documentation de référence sur les autorisations.

Console

Pour résoudre les problèmes d'accès, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Policy Troubleshooter.

    Accéder à Policy Troubleshooter

  2. Saisissez l'adresse e-mail du compte principal dont vous souhaitez vérifier l'accès.

  3. Saisissez le nom complet de la ressource à vérifier.

    Si vous ne connaissez pas le nom complet de la ressource, effectuez l'une des opérations suivantes:

    • Si vous dépannez l'accès à un projet, un dossier ou une organisation, commencez à saisir du texte pour afficher les options de saisie semi-automatique.
    • Si vous dépannez l'accès pour un autre type de ressource, cliquez sur Parcourir pour ouvrir la boîte de dialogue de recherche de ressources, puis recherchez la ressource:

      1. Dans la zone Sélectionner un champ d'application, sélectionnez un projet, un dossier ou une organisation dans lequel effectuer la recherche.
      2. Dans la zone Type de ressource, sélectionnez les types de ressources que vous souhaitez rechercher.
      3. Dans la zone Rechercher des ressources, saisissez une partie du nom de la ressource.
      4. Dans la section des résultats, sélectionnez la ressource que vous souhaitez vérifier.
      5. Cliquez sur Sélectionner pour choisir la ressource et fermer la boîte de dialogue.
  4. Saisissez l'autorisation à vérifier.

    Si vous ne connaissez pas le nom complet de l'autorisation, commencez à saisir du texte pour afficher les options de saisie semi-automatique.

  5. Facultatif : pour vérifier plusieurs ressources et autorisations, sélectionnez Ajouter une autre paire et répétez l'étape précédente.

  6. Cliquez sur Vérifier l'accès.

gcloud

Pour savoir pourquoi un compte principal dispose ou non d'une autorisation IAM, exécutez la commande gcloud policy-troubleshoot iam.

Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :

  • EMAIL : adresse e-mail du compte principal dont vous souhaitez résoudre les problèmes d'autorisation.
  • RESOURCE : ressource pour laquelle l'autorisation est accordée.
  • PERMISSION : autorisation dont vous souhaitez résoudre les problèmes.

Exécutez la commande gcloud policy-troubleshoot iam:

Linux, macOS ou Cloud Shell

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION

Windows (PowerShell)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION

Windows (cmd.exe)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION

Vous devriez obtenir un résultat semblable à celui-ci :

{
  "accessTuple": {
    "conditionContext": {
      "destination": {},
      "effectiveTags": [
        {
          "tagValue": "tagValues/281481941428044",
          "namespacedTagValue": "803434038361/env/dev",
          "tagKey": "tagKeys/281475994198094",
          "namespacedTagKey": "803434038361/env",
          "tagKeyParentName": "organizations/803434038361"
        }
      ],
      "request": {},
      "resource": {}
    },
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "compute.instances.get",
    "permissionFqdn": "compute.googleapis.com/instances.get",
    "principal": "user1@example.com"
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_HIGH"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "role": "roles/compute.viewer",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/owner",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL",
            "role": "roles/resourcemanager.organizationAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
        "policy": {
          "bindings": [
            {
              "members": [
                "user:user1@example.com"
              ],
              "role": "roles/compute.viewer"
            },
            {
              "members": [
                "user:user2@example.com"
              ],
              "role": "roles/owner"
            },
            {
              "members": [
                "user:user1@example.com"
              ],
              "role": "roles/resourcemanager.organizationAdmin"
            },
          ],
          "etag": "BwX5/L9Vbg4=",
          "version": 3
        },
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_DENIED",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_DENIED",
            "policy": {
              "createTime": "2023-04-18T07:15:47.702191Z",
              "displayName": "Deny compute instance get",
              "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=",
              "kind": "DenyPolicy",
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get",
              "rules": [
                {
                  "denyRule": {
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com"
                    ],
                    "deniedPermissions": [
                      "compute.googleapis.com/instances.get"
                    ]
                  }
                }
              ],
              "uid": "77e93c80-b383-0027-268e-a52a608aa13d",
              "updateTime": "2023-04-18T07:15:47.702191Z",
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH",
            "ruleExplanations": [
              {
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "compute.googleapis.com/instances.get": {
                    "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": {
                    "membership": "MEMBERSHIP_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "denyAccessState": "DENY_ACCESS_STATE_DENIED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ]
          }
        ],
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "permissionDeniable": true,
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "overallAccessState": "CANNOT_ACCESS"
}

REST

Pour savoir pourquoi un compte principal dispose ou non d'une autorisation IAM, utilisez la méthode iam.troubleshoot de l'API Policy Troubleshooter.

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

  • EMAIL : adresse e-mail du compte principal dont vous souhaitez résoudre les problèmes d'autorisation.
  • RESOURCE : ressource pour laquelle l'autorisation est accordée.
  • PERMISSION : autorisation dont vous souhaitez résoudre les problèmes.
  • PROJECT_ID: ID du projet que vous souhaitez utiliser pour envoyer la requête. Les ID de projet sont des chaînes alphanumériques, telles que my-project.

Méthode HTTP et URL :

POST https://policytroubleshooter.googleapis.com/v3/iam:troubleshoot

Corps JSON de la requête :

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION"
  }
}

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

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

{
  "overallAccessState": "CANNOT_ACCESS",
  "accessTuple": {
    "principal": "user1@example.com",
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "compute.instances.get",
    "permissionFqdn": "compute.googleapis.com/instances.get",
    "conditionContext": {
      "effectiveTags": [
        {
          "tagValue": "tagValues/281481941428044",
          "namespacedTagValue": "803434038361/env/dev",
          "tagKey": "tagKeys/281475994198094",
          "namespacedTagKey": "803434038361/env",
          "tagKeyParentName": "organizations/803434038361"
        }
      ]
    }
  },
  "allowPolicyExplanation": {
    "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
    "explainedPolicies": [
      {
        "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
        "bindingExplanations": [
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
            "role": "roles/compute.viewer",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_HIGH"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_HIGH"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "role": "roles/owner",
            "rolePermission": "ROLE_PERMISSION_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
            "combinedMembership": {
              "membership": "MEMBERSHIP_NOT_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user2@example.com": {
                "membership": "MEMBERSHIP_NOT_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL"
          },
          {
            "allowAccessState": "ALLOW_ACCESS_STATE_NOT_GRANTED",
            "role": "roles/resourcemanager.organizationAdmin",
            "rolePermission": "ROLE_PERMISSION_NOT_INCLUDED",
            "rolePermissionRelevance": "HEURISTIC_RELEVANCE_NORMAL",
            "combinedMembership": {
              "membership": "MEMBERSHIP_MATCHED",
              "relevance": "HEURISTIC_RELEVANCE_NORMAL"
            },
            "memberships": {
              "user:user1@example.com": {
                "membership": "MEMBERSHIP_MATCHED",
                "relevance": "HEURISTIC_RELEVANCE_NORMAL"
              }
            },
            "relevance": "HEURISTIC_RELEVANCE_NORMAL"
          }
        ],
        "relevance": "HEURISTIC_RELEVANCE_HIGH",
        "policy": {
          "version": 3,
          "etag": "BwX5/L9Vbg4=",
          "bindings": [
            {
              "role": "roles/compute.viewer",
              "members": [
                "user:user1@example.com"
              ]
            },
            {
              "role": "roles/owner",
              "members": [
                "user:user2@example.com"
              ]
            },
            {
              "role": "roles/resourcemanager.organizationAdmin",
              "members": [
                "user:user1@example.com"
              ]
            },
          ]
        }
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
  },
  "denyPolicyExplanation": {
    "denyAccessState": "DENY_ACCESS_STATE_DENIED",
    "explainedResources": [
      {
        "denyAccessState": "DENY_ACCESS_STATE_DENIED",
        "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/123456789012",
        "explainedPolicies": [
          {
            "denyAccessState": "DENY_ACCESS_STATE_DENIED",
            "policy": {
              "name": "policies/cloudresourcemanager.googleapis.com%2Fprojects%2F123456789012/denypolicies/deny-compute-get",
              "uid": "77e93c80-b383-0027-268e-a52a608aa13d",
              "kind": "DenyPolicy",
              "displayName": "Deny compute instance get",
              "etag": "MTc3MDA1ODIyNjExNTMzMDg2NzI=",
              "createTime": "2023-04-18T07:15:47.702191Z",
              "updateTime": "2023-04-18T07:15:47.702191Z",
              "rules": [
                {
                  "denyRule": {
                    "deniedPrincipals": [
                      "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com"
                    ],
                    "deniedPermissions": [
                      "compute.googleapis.com/instances.get"
                    ]
                  }
                }
              ]
            },
            "ruleExplanations": [
              {
                "denyAccessState": "DENY_ACCESS_STATE_DENIED",
                "combinedDeniedPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPermissions": {
                  "compute.googleapis.com/instances.get": {
                    "permissionMatchingState": "PERMISSION_PATTERN_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "combinedExceptionPermission": {
                  "permissionMatchingState": "PERMISSION_PATTERN_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "combinedDeniedPrincipal": {
                  "membership": "MEMBERSHIP_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "deniedPrincipals": {
                  "principal://iam.googleapis.com/projects/-/serviceAccounts/user1@example.com": {
                    "membership": "MEMBERSHIP_MATCHED",
                    "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                  }
                },
                "combinedExceptionPrincipal": {
                  "membership": "MEMBERSHIP_NOT_MATCHED",
                  "relevance": "HEURISTIC_RELEVANCE_NORMAL"
                },
                "relevance": "HEURISTIC_RELEVANCE_HIGH"
              }
            ],
            "relevance": "HEURISTIC_RELEVANCE_HIGH"
          }
        ],
        "relevance": "HEURISTIC_RELEVANCE_HIGH"
      }
    ],
    "relevance": "HEURISTIC_RELEVANCE_HIGH",
    "permissionDeniable": true
  }
}

Comprendre les résultats de l'outil de dépannage

Console

La page de résultats contient les informations suivantes :

Détails de l'évaluation

La section Détails de l'évaluation contient un résumé de l'accès que vous dépannez, y compris le compte principal, la ressource et l'autorisation spécifiés. Si vous dépannez plusieurs paires d'autorisations de ressources, vous pouvez passer de l'une à l'autre à l'aide de la liste Évaluation des accès.

Détails des règles

La section Détails des règles détaille la manière dont les règles d'autorisation et de refus applicables affectent l'accès du compte principal.

Les règles d'autorisation et de refus applicables sont les suivantes:

  • La stratégie d'autorisation de la ressource
  • Les règles de refus de la ressource, le cas échéant
  • Les stratégies d'autorisation du projet, du dossier et de l'organisation parent de la ressource, le cas échéant
  • Les stratégies de refus du projet, du dossier et de l'organisation parent de la ressource, le cas échéant

Les stratégies d'autorisation et de refus des projets, dossiers et organisations parents sont pertinentes en raison de l'héritage des stratégies. Lorsque vous associez une stratégie d'autorisation ou de refus à un projet, un dossier ou une organisation, cette stratégie s'applique également à toutes les ressources de ce projet, ce dossier ou cette organisation.

Par exemple, si une stratégie de refus pour une organisation indique qu'un compte principal ne peut pas utiliser une autorisation spécifique, le compte principal ne peut utiliser cette autorisation sur aucune ressource de l'organisation. Cette règle s'applique même si les dossiers et les projets de cette organisation sont associés à des stratégies de refus plus permissives ou à des stratégies d'autorisation qui accordent cette autorisation au compte principal.

De même, si une stratégie d'autorisation pour un projet accorde une autorisation spécifique à un compte principal, celui-ci dispose de cette autorisation pour n'importe quelle ressource du projet, à condition que cette autorisation ne lui soit pas refusée.

La section Détails des règles contient les sections suivantes:

État d'accès

La section État de l'accès contient un bref résumé de l'accès du compte principal en fonction des stratégies d'autorisation et de refus IAM appropriées. Ce résumé inclut l'impact des règles de refus et d'autorisation, ainsi que le résultat final de l'accès en fonction des règles de refus et d'autorisation applicables.

Règle de refus

Dans la section Règle de refus, vous pouvez afficher toutes les stratégies de refus pertinentes, identifier celles qui refusent l'accès au compte principal et comprendre pourquoi une règle de refus refuse ou ne refuse pas l'autorisation.

Le volet Ressources avec des stratégies de refus répertorie toutes les stratégies de refus pertinentes, organisées en fonction des ressources auxquelles elles sont associées. À côté de chaque règle de refus se trouve une évaluation des accès. Cette évaluation ne s'applique qu'à cette règle de refus et ne reflète aucun accès provenant des règles héritées. Si vous ne disposez pas des autorisations nécessaires pour afficher la stratégie de refus d'une ressource, la liste des ressources n'inclut pas cette ressource ni ses stratégies de refus.

Pour afficher les règles de refus pertinentes dans ces stratégies de refus, cliquez sur une stratégie de refus. Pour afficher toutes les règles de refus dans les stratégies de refus d'une ressource, cliquez sur une ressource. Les règles de refus apparaissent dans le volet Règles de refus. Ce volet contient une table de toutes les règles de refus avec le compte principal interrogé ou l'autorisation pour la ressource ou la stratégie de refus que vous avez sélectionnée.

La colonne Accès indique si la règle de refus refuse l'autorisation au compte principal. Pour en savoir plus sur la règle de refus, cliquez sur Afficher la règle de refus sur la ligne de cette règle.

Règle d'autorisation

Dans la section Règle d'autorisation, vous pouvez parcourir toutes les stratégies d'autorisation pertinentes, identifier les liaisons de rôles qui accordent l'accès au compte principal et comprendre pourquoi une liaison de rôle accorde ou ne donne pas l'autorisation au compte principal.

Le volet Ressources répertorie la ressource spécifiée et ses ancêtres. À côté de chaque ressource se trouve une évaluation de l'accès. Cette évaluation ne s'applique qu'à la règle d'autorisation de cette ressource. Elle ne reflète aucun accès provenant des stratégies héritées. Si vous ne disposez pas des autorisations nécessaires pour afficher la stratégie d'autorisation d'une ressource, la liste de ressources n'inclut pas cette ressource.

Pour afficher les liaisons de rôles pertinentes dans la stratégie d'autorisation d'une ressource et voir comment elles accordent ou non l'autorisation au compte principal, cliquez sur la ressource. Les liaisons de la stratégie d'autorisation apparaissent dans le volet Liaisons de rôles.

Le volet Liaisons de rôles contient une table des liaisons de rôles dans la stratégie d'autorisation de la ressource sélectionnée. Par défaut, la table ne contient que des liaisons de rôles incluant un rôle disposant de l'autorisation spécifiée. Si le compte principal n'a pas accès, la table affiche également les liaisons de rôles avec des rôles personnalisés modifiables. Pour afficher toutes les liaisons de rôle, décochez la case Afficher uniquement les liaisons pertinentes.

La colonne Accès indique si la liaison de rôle accorde l'autorisation au compte principal. Pour en savoir plus sur la liaison de rôle, cliquez sur Afficher les détails de la liaison sur la ligne de cette liaison.

gcloud

La réponse contient quatre sections principales: une description du tuple d'accès dans la requête, les résultats de l'évaluation de la stratégie d'autorisation, les résultats de l'évaluation de la stratégie de refus et l'état d'accès global.

  • accessTuple: description du tuple d'accès dans la requête, y compris tout contexte de condition que vous avez fourni. Cette section contient également un résumé des tags qui s'appliquent à la ressource.
  • allowPolicyExplanation: résumé indiquant si les stratégies d'autorisation appropriées accordent l'autorisation au compte principal, suivi d'une liste des stratégies d'autorisation et de leurs liaisons de rôle.

    Pour chaque stratégie d'autorisation, la réponse répertorie toutes les liaisons de rôles de la stratégie et les évalue en fonction des critères suivants:

    • Indique si la liaison inclut l'autorisation.
    • Indique si la liaison inclut le compte principal.
    • Indique si les conditions de la liaison, le cas échéant, sont remplies.

    La réponse imprime ensuite le texte JSON complet de la stratégie d'autorisation.

  • denyPolicyExplanation: résumé indiquant si les règles de refus applicables refusent l'autorisation au compte principal, suivi d'une liste de ressources avec des règles de refus. Pour chaque ressource, la réponse répertorie toutes les stratégies de refus associées à la ressource.

    Pour chaque stratégie de refus, la réponse imprime les métadonnées de la stratégie, répertorie les règles de refus de la stratégie, puis évalue chaque règle en fonction des critères suivants:

    • Indique si la règle de refus inclut l'autorisation.
    • Indique si l'autorisation est répertoriée en tant qu'exception dans la règle de refus.
    • Indique si la règle de refus inclut le compte principal.
    • Indique si le compte principal est répertorié en tant qu'exception dans la règle de refus.
    • Indique si les conditions de la règle de refus, le cas échéant, sont remplies.
  • overallAccessState: indique si le compte principal est en mesure d'utiliser l'autorisation spécifiée pour accéder à la ressource spécifiée, en fonction des règles d'autorisation et de refus applicables.

    Les règles d'autorisation et de refus applicables sont les suivantes:

    • La stratégie d'autorisation de la ressource
    • Les règles de refus de la ressource, le cas échéant
    • Les stratégies d'autorisation du projet, du dossier et de l'organisation parent de la ressource, le cas échéant
    • Les stratégies de refus du projet, du dossier et de l'organisation parent de la ressource, le cas échéant

    Les stratégies d'autorisation et de refus des projets, dossiers et organisations parents sont pertinentes en raison de l'héritage des stratégies. Lorsque vous associez une stratégie d'autorisation ou de refus à un projet, un dossier ou une organisation, cette stratégie s'applique également à toutes les ressources de ce projet, ce dossier ou cette organisation.

    Par exemple, si une stratégie de refus pour une organisation indique qu'un compte principal ne peut pas utiliser une autorisation spécifique, le compte principal ne peut utiliser cette autorisation sur aucune ressource de l'organisation. Cette règle s'applique même si les dossiers et les projets de cette organisation sont associés à des stratégies de refus plus permissives ou à des stratégies d'autorisation qui accordent cette autorisation au compte principal.

    De même, si une stratégie d'autorisation pour un projet accorde une autorisation spécifique à un compte principal, celui-ci dispose de cette autorisation pour n'importe quelle ressource du projet, à condition que cette autorisation ne lui soit pas refusée.

  • De nombreux objets dans la réponse comportent également un champ relevance. La valeur de ce champ indique dans quelle mesure cet objet contribue à l'état d'accès global. Le champ relevance peut avoir les valeurs suivantes:

    • HEURISTIC_RELEVANCE_HIGH: indique que l'objet a un impact important sur le résultat. En d'autres termes, la suppression de l'objet modifiera probablement l'état d'accès global. Par exemple, une liaison de rôle qui accorde au compte principal l'autorisation spécifiée aurait cette valeur de pertinence.

    • HEURISTIC_RELEVANCE_NORMAL: indique que l'objet a un impact limité sur le résultat. En d'autres termes, il est peu probable que la suppression de l'objet modifie l'état d'accès global. Par exemple, une règle de refus qui ne contient pas l'autorisation ni le compte principal aurait cette valeur de pertinence.

REST

La réponse contient quatre sections principales: l'état d'accès global, une description du tuple d'accès dans la requête, les résultats de l'évaluation de la stratégie d'autorisation et les résultats de l'évaluation de la stratégie de refus.

  • overallAccessState: indique si le compte principal est en mesure d'utiliser l'autorisation spécifiée pour accéder à la ressource spécifiée, en fonction des règles d'autorisation et de refus applicables.

    Les règles d'autorisation et de refus applicables sont les suivantes:

    • La stratégie d'autorisation de la ressource
    • Les règles de refus de la ressource, le cas échéant
    • Les stratégies d'autorisation du projet, du dossier et de l'organisation parent de la ressource, le cas échéant
    • Les stratégies de refus du projet, du dossier et de l'organisation parent de la ressource, le cas échéant

    Les stratégies d'autorisation et de refus des projets, dossiers et organisations parents sont pertinentes en raison de l'héritage des stratégies. Lorsque vous associez une stratégie d'autorisation ou de refus à un projet, un dossier ou une organisation, cette stratégie s'applique également à toutes les ressources de ce projet, ce dossier ou cette organisation.

    Par exemple, si une stratégie de refus pour une organisation indique qu'un compte principal ne peut pas utiliser une autorisation spécifique, le compte principal ne peut utiliser cette autorisation sur aucune ressource de l'organisation. Cette règle s'applique même si les dossiers et les projets de cette organisation sont associés à des stratégies de refus plus permissives ou à des stratégies d'autorisation qui accordent cette autorisation au compte principal.

    De même, si une stratégie d'autorisation pour un projet accorde une autorisation spécifique à un compte principal, celui-ci dispose de cette autorisation pour n'importe quelle ressource du projet, à condition que cette autorisation ne lui soit pas refusée.

  • accessTuple: description du tuple d'accès dans la requête, y compris tout contexte de condition que vous avez fourni. Cette section contient également un résumé des tags qui s'appliquent à la ressource.
  • allowPolicyExplanation: résumé indiquant si les stratégies d'autorisation appropriées accordent l'autorisation au compte principal, suivi d'une liste des stratégies d'autorisation et de leurs liaisons de rôle.

    Pour chaque stratégie d'autorisation, la réponse répertorie toutes les liaisons de rôles de la stratégie et les évalue en fonction des critères suivants:

    • Indique si la liaison inclut l'autorisation.
    • Indique si la liaison inclut le compte principal.
    • Indique si les conditions de la liaison, le cas échéant, sont remplies.

    La réponse imprime ensuite le texte JSON complet de la stratégie d'autorisation.

  • denyPolicyExplanation: résumé indiquant si les règles de refus applicables refusent l'autorisation au compte principal, suivi d'une liste de ressources avec des règles de refus. Pour chaque ressource, la réponse répertorie toutes les stratégies de refus associées à la ressource.

    Pour chaque stratégie de refus, la réponse imprime les métadonnées de la stratégie, répertorie les règles de refus de la stratégie, puis évalue chaque règle en fonction des critères suivants:

    • Indique si la règle de refus inclut l'autorisation.
    • Indique si l'autorisation est répertoriée en tant qu'exception dans la règle de refus.
    • Indique si la règle de refus inclut le compte principal.
    • Indique si le compte principal est répertorié en tant qu'exception dans la règle de refus.
    • Indique si les conditions de la règle de refus, le cas échéant, sont remplies.
  • De nombreux objets dans la réponse comportent également un champ relevance. La valeur de ce champ indique dans quelle mesure cet objet contribue à l'état d'accès global. Le champ relevance peut avoir les valeurs suivantes:

    • HEURISTIC_RELEVANCE_HIGH: indique que l'objet a un impact important sur le résultat. En d'autres termes, la suppression de l'objet modifiera probablement l'état d'accès global. Par exemple, une liaison de rôle qui accorde au compte principal l'autorisation spécifiée aurait cette valeur de pertinence.

    • HEURISTIC_RELEVANCE_NORMAL: indique que l'objet a un impact limité sur le résultat. En d'autres termes, il est peu probable que la suppression de l'objet modifie l'état d'accès global. Par exemple, une règle de refus qui ne contient pas l'autorisation ni le compte principal aurait cette valeur de pertinence.

Dépanner des liaisons de rôles conditionnelles

Policy Troubleshooter résout automatiquement les problèmes liés aux liaisons de rôles conditionnelles et aux règles de refus en fonction des tags. Toutefois, pour résoudre d'autres types de liaisons de rôles conditionnelles ou de règles de refus conditionnelles, Policy Troubleshooter a besoin de contexte supplémentaire concernant la requête. Par exemple, pour résoudre les problèmes liés aux conditions basées sur des attributs de date/heure, Policy Troubleshooter a besoin de l'heure de la requête.

Dans la gcloud CLI et l'API REST, vous fournissez ce contexte supplémentaire manuellement.

Dans la console Google Cloud, vous pouvez fournir ce contexte supplémentaire en dépannant directement depuis n'importe quel journal d'audit pour les activités d'administration ou journal d'audit des accès aux données. Chaque entrée de journal d'audit correspond à une requête adressée à une API Google Cloud ou à une action que Google Cloud effectue en votre nom. Lorsque vous effectuez le dépannage à partir d'un journal d'audit, Policy Troubleshooter obtient automatiquement des informations supplémentaires sur la requête, telles que la date et l'heure, ce qui permet à Policy Troubleshooter d'analyser les liaisons de rôles conditionnelles et les règles de refus.

Console

Pour résoudre les problèmes liés aux liaisons de rôles conditionnelles et aux règles de refus, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page Explorateur de journaux.

    Accédez à l'explorateur de journaux.

  2. Si le titre de la page est Legacy Logs Viewer (Ancienne version de la visionneuse de journaux), cliquez sur la liste déroulante Upgrade (Mettre à niveau) et sélectionnez Upgrade to new Logs Explorer (Mettre à niveau vers le nouvel explorateur de journaux).

  3. Pour n'afficher que les journaux d'audit des activités d'administration et des accès aux données, saisissez la requête suivante dans le générateur de requêtes, puis cliquez sur Exécuter la requête :

    logName=("RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity" OR "RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Fdata_access")
    

    Remplacez les valeurs suivantes :

    • RESOURCE_TYPE : type de ressource pour lequel vous souhaitez répertorier les journaux d'audit. Utilisez projects, folders ou organizations.
    • RESOURCE_ID : ID de votre ressource.
  4. Recherchez l'entrée du journal d'audit qui correspond à la requête que vous souhaitez résoudre. Pour découvrir comment rechercher des entrées de journal spécifiques à l'aide de l'explorateur de journaux, consultez la page Utiliser l'explorateur de journaux.

  5. Dans la colonne Résumé de l'entrée de journal, cliquez sur IAM, puis sur Résoudre un problème d'accès.

    Policy Troubleshooter utilise les informations de l'entrée de journal pour résoudre les problèmes d'accès, puis affiche les résultats. Le contexte supplémentaire est indiqué dans les détails de l'évaluation, sous Contexte de la condition. Pour afficher les détails du contexte, cliquez sur Afficher le contexte de la condition. Pour en savoir plus sur la page de résultats de Policy Troubleshooter, consultez la section Résoudre les problèmes d'accès sur cette page.

  6. Facultatif: Pour résoudre les problèmes liés à une autre requête impliquant des liaisons de rôles conditionnelles et des règles de refus, revenez à la page "Explorateur de journaux" et répétez les étapes précédentes.

gcloud

Pour résoudre les problèmes liés aux liaisons de rôles conditionnelles et aux règles de refus, utilisez la commande gcloud policy-troubleshoot iam.

Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :

  • EMAIL: adresse e-mail du compte principal dont vous souhaitez résoudre les problèmes d'autorisation.
  • RESOURCE: ressource pour laquelle l'autorisation est accordée.
  • PERMISSION: autorisation dont vous souhaitez résoudre les problèmes.
  • DESTINATION_IP : facultatif. Adresse IP de destination de la requête à utiliser lors de la vérification des liaisons de rôles conditionnelles. Exemple : 198.1.1.1.
  • DESTINATION_PORT : facultatif. Port de destination des requêtes à utiliser lors de la vérification des liaisons de rôles conditionnelles. Exemple : "8080".
  • REQUEST_TIME : facultatif. Code temporel de requête à utiliser lors de la vérification des liaisons de rôles conditionnelles. Utilisez un horodatage au format RFC 3339, par exemple 2099-02-01T00:00:00Z.
  • RESOURCE_NAME : facultatif. Valeur du nom de ressource à utiliser lors de la vérification des liaisons de rôles conditionnelles. Pour obtenir la liste des formats de nom de ressource acceptés, consultez la section Format du nom de ressource.
  • RESOURCE_SERVICE : facultatif. Valeur du service de ressources à utiliser lors de la vérification des liaisons de rôles conditionnelles. Pour obtenir la liste des noms de service acceptés, consultez la section Valeurs de service de ressources.
  • RESOURCE_TYPE : facultatif. Pour obtenir la liste des types de ressources acceptés, consultez la section Valeurs des types de ressources.

Exécutez la commande gcloud policy-troubleshoot iam:

Linux, macOS ou Cloud Shell

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL \
    --permission=PERMISSION --destination-ip=DESTINATION_IP \
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME \
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE \
    --resource-type=RESOURCE_TYPE

Windows (PowerShell)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL `
    --permission=PERMISSION --destination-ip=DESTINATION_IP `
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME `
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE `
    --resource-type=RESOURCE_TYPE

Windows (cmd.exe)

gcloud policy-intelligence troubleshoot-policy iam RESOURCE --principal-email=EMAIL ^
    --permission=PERMISSION --destination-ip=DESTINATION_IP ^
    --destination-port=DESTINATION_PORT --request-time=REQUEST_TIME ^
    --resource-name=RESOURCE_NAME --resource-service=RESOURCE_SERVICE ^
    --resource-type=RESOURCE_TYPE

La réponse contient une explication de l'accès du compte principal. Pour chaque liaison de rôle et règle de refus avec une condition, la réponse inclut un champ conditionExplanation décrivant si la condition renvoie la valeur "true" ou "false" en fonction du contexte de condition que vous avez fourni.

Par exemple, voici une évaluation d'une liaison de rôle avec une condition spécifiant le type de ressource et le service de ressources:

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "evaluationStates": [{
      "end": 51,
      "start": 1,
      "value": true
    }, {
      "end": 99,
      "start": 55,
      "value": true
    }],
    "value": true,
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH"
}
...

REST

Pour résoudre les problèmes liés aux liaisons de rôles conditionnelles et aux règles de refus, utilisez la méthode iam.troubleshoot de l'API Policy Troubleshooter.

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

  • EMAIL: adresse e-mail du compte principal dont vous souhaitez résoudre les problèmes d'autorisation.
  • RESOURCE: ressource pour laquelle l'autorisation est accordée.
  • PERMISSION: autorisation dont vous souhaitez résoudre les problèmes.
  • DESTINATION_IP : facultatif. Adresse IP de destination de la requête à utiliser lors de la vérification des liaisons de rôles conditionnelles. Exemple : 198.1.1.1.
  • DESTINATION_PORT : facultatif. Port de destination des requêtes à utiliser lors de la vérification des liaisons de rôles conditionnelles. Exemple : "8080".
  • REQUEST_TIME : facultatif. Code temporel de requête à utiliser lors de la vérification des liaisons de rôles conditionnelles. Utilisez un horodatage au format RFC 3339, par exemple 2099-02-01T00:00:00Z.
  • RESOURCE_NAME : facultatif. Valeur du nom de ressource à utiliser lors de la vérification des liaisons de rôles conditionnelles. Pour obtenir la liste des formats de nom de ressource acceptés, consultez la section Format du nom de ressource.
  • RESOURCE_SERVICE : facultatif. Valeur du service de ressources à utiliser lors de la vérification des liaisons de rôles conditionnelles. Pour obtenir la liste des noms de service acceptés, consultez la section Valeurs de service de ressources.
  • RESOURCE_TYPE : facultatif. Pour obtenir la liste des types de ressources acceptés, consultez la section Valeurs des types de ressources.

Méthode HTTP et URL :

POST https://policytroubleshooter.googleapis.com/v3/iam:troubleshoot

Corps JSON de la requête :

{
  "accessTuple": {
    "principal": "EMAIL",
    "fullResourceName": "RESOURCE",
    "permission": "PERMISSION",
    "conditionContext": {
      "destination": {
        "ip": DESTINATION_IP,
        "port": DESTINATION_PORT
      },
      "request": {
        "receiveTime": REQUEST_TIME
      },
      "resource": {
        "name": RESOURCE_NAME,
        "service": RESOURCE_SERVICE,
        "type": RESOURCE_TYPE
      }
    }
  }
}

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

La réponse contient une explication de l'accès du compte principal. Pour chaque liaison de rôle et règle de refus avec une condition, la réponse inclut un champ conditionExplanation décrivant si la condition renvoie la valeur "true" ou "false" en fonction du contexte de condition que vous avez fourni.

Par exemple, voici une évaluation d'une liaison de rôle avec une condition spécifiant le type de ressource et le service de ressources:

...
{
  "allowAccessState": "ALLOW_ACCESS_STATE_GRANTED",
  "role": "roles/compute.viewer",
  "rolePermission": "ROLE_PERMISSION_INCLUDED",
  "rolePermissionRelevance": "HEURISTIC_RELEVANCE_HIGH",
  "combinedMembership": {
    "membership": "MEMBERSHIP_MATCHED",
    "relevance": "HEURISTIC_RELEVANCE_HIGH"
  },
  "memberships": {
    "user:my-user@example.com": {
      "membership": "MEMBERSHIP_MATCHED",
      "relevance": "HEURISTIC_RELEVANCE_HIGH"
    }
  },
  "relevance": "HEURISTIC_RELEVANCE_HIGH",
  "condition": {
    "expression": " resource.type \u003d\u003d \"compute.googleapis.com/Instance\" \u0026\u0026 resource.service \u003d\u003d \"compute.googleapis.com\"",
    "title": "Compute instances only",
    "description": "Condition that limits permissions to only Compute instances"
  },
  "conditionExplanation": {
    "value": true,
    "evaluationStates": [{
      "start": 1,
      "end": 51,
      "value": true
    }, {
      "start": 55,
      "end": 99,
      "value": true
    }]
  }
}
...

Étapes suivantes