Soluciona problemas de permisos de IAM

El solucionador de problemas de políticas de IAM te ayuda a comprender por qué un usuario tiene acceso a un recurso o no tiene permiso para llamar a una API. Con una dirección de correo electrónico, un recurso y un permiso, el solucionador de problemas de políticas examina todas las políticas de permiso y de denegación que se aplican al recurso. Luego, usa esas políticas para indicar si la principal tiene el permiso. También, se enumeran las vinculaciones de roles y las reglas de denegación en las políticas y se explica cómo afectan el acceso de la principal.

Puedes acceder al Solucionador de problemas de políticas con la consola de Google Cloud, Google Cloud CLI o la API de REST. Para consultas simples, el uso de la consola de Google Cloud suele ser más rápido. Para situaciones más complejas, considera usar gcloud CLI o la API de REST.

Antes de comenzar

  • Habilita la API de Policy Troubleshooter.

    Habilita la API

Permisos necesarios

Para solucionar por completo problemas de acceso de las principales, necesitas los siguientes permisos.

Permisos para solucionar problemas de acceso de principales individuales

El Solucionador de problemas de políticas analiza el acceso de una principal a un recurso según las políticas de permiso, de denegación y las funciones para las que tienes permiso. Si no tienes permiso para ver una política que se aplica a un recurso o no tienes permiso para ver un rol personalizado, es posible que no puedas saber si una principal tiene acceso.

A fin de obtener los permisos que necesitas para solucionar problemas de acceso de una principal, pídele a tu administrador que te otorgue los siguientes roles de IAM en la organización:

Si quieres obtener más información para otorgar roles, consulta Administra el acceso.

Es posible que también puedas obtener los permisos necesarios a través de funciones personalizadas o, también, otras funciones predefinidas.

Permisos para solucionar problemas de acceso de miembros del grupo

Si tus políticas de permiso y denegación incluyen grupos, necesitas el permiso groups.read de la API de Google Workspace Admin para solucionar problemas de acceso de miembros individuales del grupo. Los administradores avanzados y los administradores de grupos tienen este permiso automáticamente. Para otorgar este permiso a un usuario que no es un administrador avanzado o de grupo, crea una función personalizada de administrador de Google Workspace que contenga el privilegio groups.read (ubicado en Privilegios de la API de administrador) y otórgale al usuario.

Si no tienes estos permisos, las vinculaciones de funciones y las reglas de denegación que contienen grupos o dominios tienen un resultado de acceso de Desconocido, a menos que la vinculación de función o la regla de denegación también incluya la principal de forma explícita.

Permisos para solucionar problemas de acceso de miembros del dominio

Si tus políticas de permiso y denegación incluyen una cuenta de Google Workspace o un dominio de Cloud Identity, debes ser un administrador de dominio para solucionar problemas de acceso de miembros individuales del dominio.

Si no tienes estos permisos, las vinculaciones de funciones y las reglas de denegación que contienen grupos o dominios tienen un resultado de acceso de Desconocido, a menos que la vinculación de función o la regla de denegación también incluya la principal de forma explícita.

Soluciona problemas de acceso

Para solucionar problemas de acceso, necesitas la siguiente información:

  • Principal: La dirección de correo electrónico que se debe verificar. La dirección de correo electrónico debe hacer referencia a un usuario o a una cuenta de servicio. No se admiten otros tipos de principales, incluidos grupos, dominios, identidades de personal y de cargas de trabajo.
  • Recurso: El nombre completo del recurso. Por ejemplo, para verificar el proyecto my-project, ingresa //cloudresourcemanager.googleapis.com/projects/my-project. Para otros tipos de recursos, consulta los ejemplos de nombres completos de recursos.
  • Permiso: El permiso que se debe verificar. Si usas la consola de Google Cloud, presenta una lista de sugerencias a medida que escribes. Para obtener una lista completa de los permisos, consulta Referencia de permisos de IAM.

Console

Para solucionar problemas de acceso, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Solucionador de problemas de políticas.

    Ir al solucionador de problemas de políticas

  2. Ingresa el correo electrónico de la principal cuyo acceso quieres verificar.

  3. Ingresa el nombre completo del recurso que quieres comprobar.

    Si no conoces el nombre completo del recurso, realiza una de las siguientes acciones:

    • Si estás solucionando problemas de acceso a un proyecto, una carpeta o una organización, comienza a escribir para ver las opciones de autocompletar.
    • Si estás solucionando problemas de acceso a otro tipo de recurso, haz clic en Explorar para abrir el diálogo de búsqueda de recursos y, luego, busca el recurso:

      1. En el cuadro Seleccionar alcance, selecciona un proyecto, una carpeta o una organización para buscar en ellos.
      2. En el cuadro Tipo de recurso, selecciona los tipos de recursos que deseas buscar.
      3. En el cuadro Buscar recursos, ingresa una parte del nombre del recurso.
      4. En la sección de resultados, selecciona el recurso que quieres verificar.
      5. Haz clic en Seleccionar para elegir el recurso y cerrar el diálogo.
  4. Ingresa el permiso que quieres verificar.

    Si no conoces el nombre completo del permiso, comienza a escribir para ver las opciones de autocompletar.

  5. Opcional: Para comprobar varios recursos y permisos, selecciona Agregar otro par y repite el paso anterior.

  6. Haz clic en Verificar acceso.

gcloud

Para averiguar por qué una principal tiene o no un permiso de IAM, usa el comando gcloud policy-troubleshoot iam.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • EMAIL: La dirección de correo electrónico del principal al que pertenecen los permisos con problemas que deseas solucionar.
  • RESOURCE: El recurso en el que se otorga el permiso.
  • PERMISSION: El permiso con los problemas que deseas solucionar.

Ejecuta el comando gcloud policy-troubleshoot iam:

Linux, macOS o 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

Deberías recibir una respuesta similar a la que figura a continuación:

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

Para averiguar por qué una principal tiene o no un permiso de IAM, usa el método iam.troubleshoot de la API del Solucionador de problemas de políticas.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • EMAIL: La dirección de correo electrónico del principal al que pertenecen los permisos con problemas que deseas solucionar.
  • RESOURCE: El recurso en el que se otorga el permiso.
  • PERMISSION: El permiso con los problemas que deseas solucionar.
  • PROJECT_ID: Es el ID del proyecto que deseas usar para realizar la solicitud. Los ID de proyecto son strings alfanuméricas, como my-project.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "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
  }
}

Comprende los resultados del solucionador de problemas

Console

La página de resultados contiene la siguiente información:

Detalles de la evaluación

La sección Detalles de la evaluación contiene un resumen del acceso en el que estás solucionando problemas, incluida la principal, el recurso y el permiso especificados. Si estás solucionando problemas de varios pares de permisos de recursos, puedes usar la lista de Evaluación de acceso para alternar entre ellos.

Detalles de la política

La sección Detalles de la política contiene detalles sobre cómo las políticas relevantes de permiso y denegación afectan el acceso de la principal.

Estas son algunas de las políticas de permiso y denegación relevantes:

  • La política de permiso del recurso
  • Las políticas de denegación del recurso, si las hay
  • Las políticas de permiso del proyecto superior, la carpeta y la organización del recurso, si las hay
  • Las políticas de denegación del proyecto superior, la carpeta y la organización del recurso, si las hay

Las políticas de permiso y denegación de los proyectos, las carpetas y las organizaciones superiores son relevantes debido a la herencia de políticas. Cuando adjuntas una política de permiso o denegación a un proyecto, una organización o una carpeta, esa política también se aplica a todos los recursos dentro de ese proyecto, organización o carpeta.

Por ejemplo, si una política de denegación para una organización indica que una principal no puede usar un permiso específico, la principal no puede usar ese permiso en ningún recurso dentro de la organización. Esta regla se aplica incluso si las carpetas y proyectos dentro de esa organización tienen políticas de denegación más permisivas o políticas de permiso que otorgan permiso a la principal.

Del mismo modo, si una política de permisos para un proyecto le da a una principal un permiso específico, la principal tiene ese permiso para cualquier recurso dentro del proyecto, siempre que no se le deniegue ese permiso.

La sección Detalles de la política incluye las siguientes secciones:

Estado de acceso

La sección Estado del acceso contiene un breve resumen del acceso de la principal según las políticas relevantes de permiso y denegación de IAM. En este resumen, se incluye el impacto de las políticas de denegación, el impacto de las políticas de permiso y el resultado final del acceso basado en las políticas de permiso y denegación relevantes.

Política de denegación

En la sección Política de denegación, puedes ver todas las políticas de denegación relevantes, identificar las reglas de denegación que deniegan el acceso a la principal y comprender por qué una regla de denegación niega o no el permiso a la principal.

En el panel Recursos con políticas de denegación, se enumeran todas las políticas de denegación relevantes, organizadas por los recursos a los que están asociadas. Junto a cada política de denegación, hay una evaluación de acceso. Esta evaluación solo se aplica a esa política de denegación; no refleja ningún acceso de las políticas heredadas. Si no tienes permiso para ver la política de denegación de un recurso, la lista de recursos no incluye ese recurso ni sus políticas de denegación.

Para ver las reglas de denegación relevantes en estas políticas, haz clic en una política de denegación. Para ver todas las reglas de denegación en las políticas de denegación de un recurso, haz clic en un recurso. Las reglas de denegación aparecen en el panel Reglas de denegación. Este panel contiene una tabla de todas las reglas de denegación con la principal o el permiso consultados para el recurso o la política de denegación que seleccionaste.

En la columna Acceso, se indica si la regla de denegación rechaza el permiso a la principal. Para ver más detalles sobre la regla de denegación, haz clic en Ver regla de denegación en la fila de esa regla.

Política de permisos

En la sección Política de permiso, puedes navegar por todas las políticas de permisos relevantes, identificar vinculaciones de funciones que otorgan acceso a la principal y comprender por qué una vinculación de función otorga o no el permiso a la principal.

En el panel Recursos, se enumera el recurso especificado y sus principales. Junto a cada recurso hay una evaluación de acceso. Esta evaluación solo se aplica a la política de permisos de ese recurso; no refleja ningún acceso de las políticas heredadas. Si no tienes permiso para ver la política de permisos de un recurso, la lista de recursos no lo incluye.

Para ver las vinculaciones de roles relevantes en la política de permisos de un recurso y ver cómo otorgan o no el permiso a la principal, haz clic en el recurso. Las vinculaciones de la política de permiso aparecen en el panel Vinculaciones de funciones.

El panel Vinculaciones de funciones contiene una tabla de vinculaciones de funciones en la política de permisos del recurso seleccionado. De forma predeterminada, la tabla solo contiene vinculaciones de funciones que incluyen una función con el permiso especificado. Si la principal no tiene acceso, en la tabla también se muestran las vinculaciones de roles con roles personalizados editables. Para ver todas las vinculaciones de funciones, desmarca la casilla de verificación Mostrar solo vinculaciones relevantes.

En la columna Acceso, se indica si la vinculación de la función le otorga el permiso a la principal. Para ver más detalles sobre la vinculación de función, haz clic en Ver detalles de vinculación en la fila de esa vinculación.

gcloud

La respuesta contiene cuatro secciones principales: una descripción de la tupla de acceso en la solicitud, los resultados de la evaluación de la política de permiso, los resultados de la evaluación de la política de denegación y el estado general del acceso.

  • accessTuple: Es una descripción de la tupla de acceso en la solicitud, incluido cualquier contexto de condición que proporcionaste. Esta sección también contiene un resumen de las etiquetas que se aplican al recurso.
  • allowPolicyExplanation: Un resumen de si las políticas de permisos relevantes otorgan el permiso a la principal, seguido de una lista de políticas de permiso y sus vinculaciones de roles

    Para cada política de permiso, la respuesta enumera todas las vinculaciones de funciones en la política y las evalúa según los siguientes criterios:

    • Indica si la vinculación incluye el permiso.
    • Indica si la vinculación incluye la principal.
    • Si se cumplen las condiciones de la vinculación, si las hay.

    Luego, la respuesta imprime el texto JSON completo de la política de permiso.

  • denyPolicyExplanation: Un resumen de si las políticas de denegación relevantes rechazan a la principal el permiso, seguido de una lista de recursos con políticas de denegación. Para cada recurso, la respuesta enumera todas las políticas de denegación adjuntas al recurso.

    Para cada política de denegación, la respuesta imprime los metadatos de la política, enumera las reglas de denegación en la política y, luego, evalúa cada regla según los siguientes criterios:

    • Indica si la regla de denegación incluye el permiso.
    • Si el permiso aparece como una excepción en la regla de denegación.
    • Indica si la regla de denegación incluye la principal.
    • Si la principal aparece como una excepción en la regla de denegación.
    • Indica si se cumplen las condiciones de la regla de denegación, si las hay.
  • overallAccessState: Indica si la principal puede usar el permiso especificado para acceder al recurso especificado según las políticas relevantes de permiso y denegación.

    Estas son algunas de las políticas de permiso y denegación relevantes:

    • La política de permiso del recurso
    • Las políticas de denegación del recurso, si las hay
    • Las políticas de permiso del proyecto superior, la carpeta y la organización del recurso, si las hay
    • Las políticas de denegación del proyecto superior, la carpeta y la organización del recurso, si las hay

    Las políticas de permiso y denegación de los proyectos, las carpetas y las organizaciones superiores son relevantes debido a la herencia de políticas. Cuando adjuntas una política de permiso o denegación a un proyecto, una organización o una carpeta, esa política también se aplica a todos los recursos dentro de ese proyecto, organización o carpeta.

    Por ejemplo, si una política de denegación para una organización indica que una principal no puede usar un permiso específico, la principal no puede usar ese permiso en ningún recurso dentro de la organización. Esta regla se aplica incluso si las carpetas y proyectos dentro de esa organización tienen políticas de denegación más permisivas o políticas de permiso que otorgan permiso a la principal.

    Del mismo modo, si una política de permisos para un proyecto le da a una principal un permiso específico, la principal tiene ese permiso para cualquier recurso dentro del proyecto, siempre que no se le deniegue ese permiso.

  • Muchos objetos en la respuesta también tienen un campo relevance. El valor de este campo indica cuánto contribuye ese objeto al estado de acceso general. El campo relevance puede tener los siguientes valores:

    • HEURISTIC_RELEVANCE_HIGH: Indica que el objeto tiene un gran impacto en el resultado. En otras palabras, quitar el objeto es probable que cambie el estado de acceso general. Por ejemplo, una vinculación de rol que otorgue a la principal el permiso especificado tendría este valor de relevancia.

    • HEURISTIC_RELEVANCE_NORMAL: Indica que el objeto tiene un impacto limitado en el resultado. En otras palabras, es poco probable que quitar el objeto cambie el estado de acceso general. Por ejemplo, una regla de denegación que no contenga el permiso o la principal tendría este valor de relevancia.

REST

La respuesta contiene cuatro secciones principales: el estado general del acceso, una descripción de la tupla de acceso en la solicitud, los resultados de la evaluación de la política de permiso y los resultados de la evaluación de la política de denegación.

  • overallAccessState: Indica si la principal puede usar el permiso especificado para acceder al recurso especificado según las políticas relevantes de permiso y denegación.

    Estas son algunas de las políticas de permiso y denegación relevantes:

    • La política de permiso del recurso
    • Las políticas de denegación del recurso, si las hay
    • Las políticas de permiso del proyecto superior, la carpeta y la organización del recurso, si las hay
    • Las políticas de denegación del proyecto superior, la carpeta y la organización del recurso, si las hay

    Las políticas de permiso y denegación de los proyectos, las carpetas y las organizaciones superiores son relevantes debido a la herencia de políticas. Cuando adjuntas una política de permiso o denegación a un proyecto, una organización o una carpeta, esa política también se aplica a todos los recursos dentro de ese proyecto, organización o carpeta.

    Por ejemplo, si una política de denegación para una organización indica que una principal no puede usar un permiso específico, la principal no puede usar ese permiso en ningún recurso dentro de la organización. Esta regla se aplica incluso si las carpetas y proyectos dentro de esa organización tienen políticas de denegación más permisivas o políticas de permiso que otorgan permiso a la principal.

    Del mismo modo, si una política de permisos para un proyecto le da a una principal un permiso específico, la principal tiene ese permiso para cualquier recurso dentro del proyecto, siempre que no se le deniegue ese permiso.

  • accessTuple: Es una descripción de la tupla de acceso en la solicitud, incluido cualquier contexto de condición que proporcionaste. Esta sección también contiene un resumen de las etiquetas que se aplican al recurso.
  • allowPolicyExplanation: Un resumen de si las políticas de permisos relevantes otorgan el permiso a la principal, seguido de una lista de políticas de permiso y sus vinculaciones de roles

    Para cada política de permiso, la respuesta enumera todas las vinculaciones de funciones en la política y las evalúa según los siguientes criterios:

    • Indica si la vinculación incluye el permiso.
    • Indica si la vinculación incluye la principal.
    • Si se cumplen las condiciones de la vinculación, si las hay.

    Luego, la respuesta imprime el texto JSON completo de la política de permiso.

  • denyPolicyExplanation: Un resumen de si las políticas de denegación relevantes rechazan a la principal el permiso, seguido de una lista de recursos con políticas de denegación. Para cada recurso, la respuesta enumera todas las políticas de denegación adjuntas al recurso.

    Para cada política de denegación, la respuesta imprime los metadatos de la política, enumera las reglas de denegación en la política y, luego, evalúa cada regla según los siguientes criterios:

    • Indica si la regla de denegación incluye el permiso.
    • Si el permiso aparece como una excepción en la regla de denegación.
    • Indica si la regla de denegación incluye la principal.
    • Si la principal aparece como una excepción en la regla de denegación.
    • Indica si se cumplen las condiciones de la regla de denegación, si las hay.
  • Muchos objetos en la respuesta también tienen un campo relevance. El valor de este campo indica cuánto contribuye ese objeto al estado de acceso general. El campo relevance puede tener los siguientes valores:

    • HEURISTIC_RELEVANCE_HIGH: Indica que el objeto tiene un gran impacto en el resultado. En otras palabras, quitar el objeto es probable que cambie el estado de acceso general. Por ejemplo, una vinculación de rol que otorgue a la principal el permiso especificado tendría este valor de relevancia.

    • HEURISTIC_RELEVANCE_NORMAL: Indica que el objeto tiene un impacto limitado en el resultado. En otras palabras, es poco probable que quitar el objeto cambie el estado de acceso general. Por ejemplo, una regla de denegación que no contenga el permiso o la principal tendría este valor de relevancia.

Soluciona problemas de vinculaciones de funciones condicionales

El Solucionador de problemas de políticas soluciona problemas de forma automática en las vinculaciones de funciones condicionales y las reglas de denegación según las etiquetas. Sin embargo, para solucionar otros tipos de vinculaciones de funciones condicionales o reglas de denegación condicionales, el Solucionador de problemas de políticas necesita contexto adicional sobre la solicitud. Por ejemplo, para solucionar problemas relacionados con condiciones basadas en atributos de fecha y hora, el Solucionador de problemas de políticas necesita el tiempo de la solicitud.

En gcloud CLI y la API de REST, proporcionas este contexto adicional de forma manual.

En la consola de Google Cloud, puedes proporcionar este contexto adicional si solucionas el problema directamente desde cualquier registro de auditoría de actividad del administrador o registro de auditoría de acceso a los datos. Cada entrada de registro de auditoría corresponde a una solicitud a una API de Google Cloud o una acción que Google Cloud realiza en tu nombre. Cuando solucionas problemas desde un registro de auditoría, el Solucionador de problemas de políticas obtiene información adicional de forma automática sobre la solicitud, como la fecha y hora, lo que permite que el Solucionador de problemas de políticas analice las vinculaciones de funciones condicionales y las reglas de denegación.

Console

Para solucionar problemas de vinculaciones de roles condicionales y reglas de denegación, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Explorador de registros.

    Ve al Explorador de registros.

  2. Si el título de la página es Visor de registros heredados, haz clic en la lista desplegable Actualizar y selecciona Actualizar al Explorador de registros nuevo.

  3. Para ver solo los registros de auditoría de actividad del administrador y acceso a los datos, ingresa la siguiente consulta en el compilador de consultas y, luego, haz clic en Ejecutar consulta:

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

    Reemplaza los siguientes valores:

    • RESOURCE_TYPE: El tipo de recurso para el que creas una lista de registros de auditoría. Usa projects, folders o organizations.
    • RESOURCE_ID: El ID de tu recurso.
  4. Ubica la entrada de registro de auditoría que corresponda a la solicitud que deseas solucionar. Si quieres obtener información sobre cómo usar el explorador de registros para encontrar entradas de registro específicas, consulta Usa el explorador de registros.

  5. En la columna Resumen de la entrada de registro, haz clic en IAM y, luego, en Solucionar problemas de acceso.

    El Solucionador de problemas de políticas usa la información de la entrada de registro para solucionar problemas de acceso y, luego, te muestra los resultados. El contexto adicional se enumera en los detalles de la evaluación en Contexto de la condición. Para ver los detalles del contexto, haz clic en Ver contexto de la condición. Para obtener más información sobre la página de resultados del Solucionador de problemas de políticas, consulta Soluciona problemas de acceso en esta página.

  6. Opcional: Para solucionar problemas de otra solicitud que involucre vinculaciones de funciones condicionales y reglas de denegación, regresa a la página del Explorador de registros y repite los pasos anteriores.

gcloud

Para solucionar problemas de vinculaciones de funciones condicionales y reglas de denegación, usa el comando gcloud policy-troubleshoot iam.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • EMAIL: La dirección de correo electrónico de la principal cuyos permisos deseas solucionar problemas.
  • RESOURCE: Es el recurso en el que se otorga el permiso.
  • PERMISSION: El permiso sobre el que deseas solucionar problemas.
  • DESTINATION_IP: Opcional La dirección IP de destino de la solicitud que se usa cuando se verifican las vinculaciones de funciones condicionales. Por ejemplo, 198.1.1.1.
  • DESTINATION_PORT: Opcional El puerto de destino de la solicitud que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Por ejemplo, “8080”.
  • REQUEST_TIME: Opcional La marca de tiempo de la solicitud que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Usa una marca de tiempo en formato RFC 3339, por ejemplo, 2099-02-01T00:00:00Z.
  • RESOURCE_NAME: Opcional El valor del nombre del recurso que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Para obtener una lista de los formatos de nombre de recurso aceptados, consulta Formato de nombre de recurso.
  • RESOURCE_SERVICE: Opcional El valor del servicio de recursos que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Para obtener una lista de los nombres de servicios aceptados, consulta Valores de servicios de recursos.
  • RESOURCE_TYPE: Opcional Para obtener una lista de los tipos de recursos aceptados, consulta Valores de tipos de recursos.

Ejecuta el comando gcloud policy-troubleshoot iam:

Linux, macOS o 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 respuesta contiene una explicación del acceso de la principal. Para cada regla de vinculación y denegación de función con una condición, la respuesta incluye un campo conditionExplanation que describe si la condición se evalúa como verdadera o falsa según el contexto de la condición que proporcionaste.

Por ejemplo, la siguiente es una evaluación de una vinculación de función con una condición que especifica el tipo de recurso y el servicio del recurso:

...
{
  "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

Para solucionar problemas de vinculaciones de roles condicionales y reglas de denegación, usa el método iam.troubleshoot de la API del Solucionador de problemas de políticas.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • EMAIL: La dirección de correo electrónico de la principal cuyos permisos deseas solucionar problemas.
  • RESOURCE: Es el recurso en el que se otorga el permiso.
  • PERMISSION: El permiso sobre el que deseas solucionar problemas.
  • DESTINATION_IP: Opcional La dirección IP de destino de la solicitud que se usa cuando se verifican las vinculaciones de funciones condicionales. Por ejemplo, 198.1.1.1.
  • DESTINATION_PORT: Opcional El puerto de destino de la solicitud que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Por ejemplo, “8080”.
  • REQUEST_TIME: Opcional La marca de tiempo de la solicitud que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Usa una marca de tiempo en formato RFC 3339, por ejemplo, 2099-02-01T00:00:00Z.
  • RESOURCE_NAME: Opcional El valor del nombre del recurso que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Para obtener una lista de los formatos de nombre de recurso aceptados, consulta Formato de nombre de recurso.
  • RESOURCE_SERVICE: Opcional El valor del servicio de recursos que se usará cuando se verifiquen las vinculaciones de funciones condicionales. Para obtener una lista de los nombres de servicios aceptados, consulta Valores de servicios de recursos.
  • RESOURCE_TYPE: Opcional Para obtener una lista de los tipos de recursos aceptados, consulta Valores de tipos de recursos.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "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
      }
    }
  }
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene una explicación del acceso de la principal. Para cada regla de vinculación y denegación de función con una condición, la respuesta incluye un campo conditionExplanation que describe si la condición se evalúa como verdadera o falsa según el contexto de la condición que proporcionaste.

Por ejemplo, la siguiente es una evaluación de una vinculación de función con una condición que especifica el tipo de recurso y el servicio del recurso:

...
{
  "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
    }]
  }
}
...

¿Qué sigue?