Probar los cambios de rol con Simulador de políticas

En esta página se describe cómo simular un cambio en una política de permisos de IAM mediante el simulador de políticas. También se explica cómo interpretar los resultados de la simulación y cómo aplicar la política de permiso simulada si lo desea.

Esta función solo evalúa el acceso en función de las políticas de permiso.

Para saber cómo simular cambios en otros tipos de políticas, consulta lo siguiente:

Antes de empezar

Permisos obligatorios

Antes de simular un cambio en una política de permiso, debes asegurarte de que tienes los permisos adecuados. Se necesitan ciertos permisos para ejecutar una simulación. Otros no son obligatorios, pero te ayudan a obtener los resultados más completos de la simulación.

Para obtener más información sobre los roles de Gestión de Identidades y Accesos (IAM), consulta el artículo Descripción de los roles.

Permisos de recursos de destino necesarios

El recurso de destino de la simulación es el recurso cuyas políticas de permiso estás simulando.

Para obtener los permisos que necesitas para ejecutar una simulación, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el recurso de destino:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para ejecutar una simulación. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para ejecutar una simulación, se necesitan los siguientes permisos:

  • cloudasset.assets.searchAllResources
  • policysimulator.replays.run
  • service.resource.getIamPolicy, donde resource es el tipo de recurso de destino y service es el nombre del servicio Google Cloud propietario de ese recurso.

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Permisos de recursos de host necesarios

El recurso host de una simulación es el proyecto, la carpeta o la organización que crea y ejecuta la simulación. No es necesario que el recurso de host esté relacionado con el recurso de destino de ninguna manera.

La forma de definir el recurso de host depende de la plataforma que utilices.

Consola

El recurso host es el proyecto, la carpeta o la organización que aparece en el selector de recursos.

Para cambiar el recurso host, elige otro proyecto, carpeta u organización en el selector de recursos.

gcloud

El recurso host es el proyecto de cuota actual. Para definir el proyecto de cuota, usa el comando gcloud auth application-default set-quota-project.

REST

Especificas manualmente el recurso de host cada vez que envías una solicitud. Consulta los detalles en la sección Simular un cambio de política de esta página.

Para obtener los permisos que necesitas para ejecutar una simulación, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de simulador (roles/policysimulator.admin) en el recurso host. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para ejecutar una simulación. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para ejecutar una simulación, se necesitan los siguientes permisos:

  • policysimulator.replayResults.list
  • policysimulator.replays.create
  • policysimulator.replays.get

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Para obtener los resultados más completos de una simulación, te recomendamos que tengas determinados permisos de IAM y Google Workspace. Si no tiene algunos o todos estos permisos, puede seguir ejecutando una simulación. Sin embargo, si ejecutas una simulación sin estos permisos, puede que aumente el número de cambios de acceso desconocidos, ya que es posible que no puedas obtener información que podría influir en los resultados de la simulación.

Te recomendamos que tengas el rol de revisor de seguridad (roles/iam.securityReviewer) de tu organización al ejecutar una simulación. Si ya tienes el rol Administrador de seguridad (roles/iam.securityAdmin), no es necesario que se te conceda ningún otro rol.

Estos roles te otorgan los siguientes permisos, que te ayudan a obtener los resultados más completos de la simulación:

  • iam.roles.get y iam.roles.list en los proyectos, carpetas u organizaciones pertinentes en los que se hayan definido roles personalizados. Un proyecto, una carpeta o una organización son relevantes si son antecesores o descendientes del recurso cuya política de permiso estás simulando.
  • service.resource.getIamPolicy, donde resource es el nombre de un tipo de recurso que puede tener una política de permiso y service es el nombre del servicioGoogle Cloud propietario de ese recurso.

    Cuando ejecutes una simulación, te recomendamos que tengas este permiso en cada recurso que cumpla estos criterios:

    • Simulador de políticas admite el recurso.
    • El recurso tiene una política de permiso que puede afectar al acceso del usuario. Esto es así si se cumple una de las siguientes condiciones:

      • El recurso es un descendiente del recurso cuya política de permiso estás simulando y aparece en los registros de acceso pertinentes.
      • El recurso es un ancestro del recurso cuya política de permiso estás simulando.

    Por ejemplo, supongamos que quieres simular una política de permiso para un proyecto. Si los registros de acceso incluyen un intento de acceso a un segmento de Cloud Storage del proyecto, necesitas el permiso storage.buckets.getIamPolicy en ese segmento. Si el proyecto tiene una carpeta superior con una política de permiso, también necesitas el permiso resourcemanager.folders.getIamPolicy en esa carpeta.

Te recomendamos que tengas permiso para obtener información sobre los miembros de cada grupo de Google en la política de permisos original y en la propuesta.

Los superadministradores y los administradores de grupos de Google Workspace suelen tener acceso para ver la pertenencia a grupos. Si no eres superadministrador ni administrador de grupo, pide a tu administrador de Google Workspace que cree un rol de administrador de Google Workspace personalizado que incluya el privilegio groups.read (situado en Privilegios de la API Admin) y que te lo conceda. Esto te permite ver los miembros de todos los grupos de tu dominio y simular de forma más eficaz los cambios en una política de permisos.

Simular un cambio de política

Simula un cambio en una política de permiso siguiendo estos pasos.

Consola

En el siguiente ejemplo se muestra cómo simular un cambio en una política de permiso de un proyecto. Sin embargo, puedes simular un cambio en una política de permiso para cualquier recurso que tenga una política de permiso.

Edita los permisos de un principal y, en lugar de hacer clic en Guardar, haz clic en Probar cambios:

  1. En la consola, ve a la página Gestión de identidades y accesos. Google Cloud

    Ir a la página de gestión de identidades y accesos

  2. Crea un cambio propuesto en la política de permisos editando los permisos de un principal:

    1. Busca el principal cuyo acceso quieras editar y haz clic en el botón Editar situado a la derecha.
    2. Edita el acceso de la cuenta principal añadiendo un nuevo rol o revocando o cambiando un rol ya asignado.
  3. Para simular el cambio propuesto, haga clic en Probar cambios.

  4. Después de unos minutos, la consola mostrará los resultados de la simulación como una lista de cambios de acceso. Google Cloud Consulta la sección Interpretar los resultados del simulador de políticas de esta página para obtener más información.

    Si no ha habido ningún cambio en el acceso entre la política de permiso actual y la política de permiso simulada, la consola Google Cloud no mostrará ningún cambio en el acceso.

gcloud

Para simular un cambio en una política de permiso, sigue el patrón de lectura, modificación y escritura, pero simula la política de permiso en lugar de escribirla.

  1. Lee la política de permisos actual ejecutando el siguiente comando:

    gcloud resource-type get-iam-policy resource-id --format=format > filepath

    Sustituye los siguientes valores:

    • resource-type: el tipo de recurso para el que quieres simular una política de permiso. Por ejemplo, projects.
    • resource-id: el ID del recurso cuya política de permiso quieres simular. Por ejemplo, my-project.
    • format: el formato de la respuesta. Usa el valor json o yaml.
    • filepath: ruta a un nuevo archivo de salida para la política de permiso.

    Por ejemplo, el siguiente comando obtiene la política de permiso del proyecto my-project en formato JSON y la guarda en el directorio principal del usuario:

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json
  2. Modifica la política de permisos JSON o YAML devuelta por el comando get-iam-policy para reflejar los cambios que quieras simular.

    Hay varios tipos de cambios que puedes hacer en la política de permiso. Por ejemplo, puedes añadir o quitar un principal de una vinculación de rol, o quitar una vinculación de rol de la política de permiso.

  3. Ejecuta el siguiente comando para simular el cambio en la política de permiso:

    gcloud iam simulator replay-recent-access \
        full-resource-name \
        filepath \
        --format=format

    Sustituye los siguientes valores:

    • full-resource-name: Nombre completo del recurso cuya política de permiso quieres simular.

      El nombre completo del recurso es un URI que consta del nombre del servicio y la ruta al recurso. Por ejemplo, si simulas una política de permiso para un proyecto, usarías //cloudresourcemanager.googleapis.com/projects/project- id, donde project-id es el ID del proyecto cuya política de permiso estás simulando.

      Para ver una lista de los formatos de nombres de recursos completos, consulta Nombres de recursos completos.

    • filepath: ruta al archivo que contiene la política de permisos modificada que quieres simular. Por ejemplo, ~/proposed_policy.json.

    • format: el formato de la respuesta. Por ejemplo, json o yaml.

    Después de varios minutos, el comando muestra una lista de resultados de repetición que explica cómo cambiaría el acceso de la entidad principal si se aplicara la política de permiso propuesta. En estos resultados también se indican los errores que se han producido durante la simulación, incluidos los que se deben a tipos de recursos no admitidos.

    Consulta la sección Interpretar los resultados del simulador de políticas de esta página para saber cómo leer los resultados. Para saber cómo guardar los resultados de la simulación en lugar de imprimirlos, consulte el artículo Guardar los resultados de una simulación.

    A continuación se muestra una respuesta de ejemplo de una simulación de política de permiso que implica al usuario my-user@example.com. En este caso, si se aplicara el cambio propuesto, my-user@example.com podría dejar de tener los permisos resourcemanager.projects.list y resourcemanager.projects.get en el proyecto my-project, y sin duda dejaría de tener el permiso resourcemanager.projects.update en el proyecto my-project:

    [
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.list",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 12,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.get",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_MAYBE_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "UNKNOWN_INFO_DENIED",
              "errors": [
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to view group membership.",
                      "resourceName": "group:everyone@example.com",
                      "resourceType": "Google group"
                    }
                  ],
                  "message": "Missing permission to view group membership."
                },
                {
                  "code": 7,
                  "details": [
                    {
                      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                      "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                      "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                      "resourceType": "cloudresourcemanager.googleapis.com/projects"
                    }
                  ],
                  "message": "Missing permission to get relevant IAM policies."
                }
              ],
              "policies": [
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "bindingExplanations": [
                    {
                      "access": "UNKNOWN_INFO_DENIED",
                      "memberships": {
                        "group:everyone@example.com": {
                          "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                        }
                      },
                      "role": "roles/owner"
                    }
                  ],
                  "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                  "policy": {
                    "bindings": [
                      {
                        "members": [
                          "group:everyone@example.com"
                        ],
                        "role": "roles/owner"
                      }
                    ],
                    "etag": "BwWgJSIInYA=",
                    "version": 3
                  }
                },
                {
                  "access": "UNKNOWN_INFO_DENIED",
                  "policy": {}
                }
              ]
            }
          }
        },
        "lastSeenDate": {
          "day": 10,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {
          "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "permission": "resourcemanager.projects.update",
          "principal": "my-user@example.com"
        },
        "diff": {
          "accessDiff": {
            "accessChange": "ACCESS_REVOKED",
            "baseline": {
              "accessState": "GRANTED"
            },
            "simulated": {
              "accessState": "NOT_GRANTED"
            }
          }
        },
        "lastSeenDate": {
          "day": 15,
          "month": 1,
          "year": 2021
        }
      },
      {
        "accessTuple": {},
        "error": {
          "code": 12,
          "details": [
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.create"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.setIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.delete"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.update"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "pubsub.topics.publish"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.list"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.getIamPolicy"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            },
            {
              "@type": "type.googleapis.com/google.rpc.ErrorInfo",
              "domain": "policysimulator.googleapis.com",
              "metadata": {
                "permission": "storage.objects.get"
              },
              "reason": "UNSUPPORTED_RESOURCE"
            }
          ],
          "message": "Simulator does not yet support all resource types for 8 removed permissions."
        }
      }
    ]

    Si no ha habido ningún cambio en el acceso entre la política de permiso actual y la política de permiso simulada, el comando imprime No access changes found in the replay.

REST

Para simular un cambio en una política de permiso, sigue el patrón de lectura, modificación y escritura, pero, en lugar de escribir la política de permiso, crea y ejecuta una simulación.

  1. Lee la política de permisos del recurso.

    Para obtener la política de permiso de un proyecto, usa el método projects.getIamPolicy de la API Resource Manager.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

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

  2. Modifica la política de permiso devuelta para reflejar los cambios que quieras simular.

    Hay varios tipos de cambios que puedes hacer en la política de permiso. Por ejemplo, puedes añadir o quitar un principal de una vinculación de rol, o quitar una vinculación de rol de la política de permiso.

  3. Crea una simulación o una repetición con la política de permitir modificada.

    Para crear una repetición de un proyecto, una carpeta o una organización, usa el método replays.create de la API Policy Simulator.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • HOST_RESOURCE_TYPE: el tipo de recurso que alojará la repetición. Este valor debe ser projects, folders o organizations.
    • HOST_RESOURCE_ID: el ID del recurso de host (por ejemplo, my-project).
    • TARGET_FULL_RESOURCE_NAME: nombre completo del recurso cuya política quieres simular. Este recurso puede ser cualquier recurso que acepte políticas de gestión de identidades y accesos y no tiene por qué estar relacionado con el recurso host de ninguna manera.

      El nombre completo del recurso es un URI que consta del nombre del servicio y de la ruta al recurso. Por ejemplo, si simulas una política de un proyecto, usarías //cloudresourcemanager.googleapis.com/projects/PROJECT_ID, donde PROJECT_ID es el ID del proyecto cuya política estás simulando.

      Para ver una lista completa de los formatos de nombres de recursos, consulta Nombres de recursos completos.

    • POLICY: la política que quieres simular. Para ver un ejemplo de una política, consulta la referencia de la política.

      Para simular varias políticas, incluya varios pares "OBJECT_FULL_RESOURCE_NAME" : POLICY en el cuerpo de la solicitud.

    • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.

    Método HTTP y URL:

    POST https://policysimulator.googleapis.com/v1/HOST_RESOURCE_TYPE/HOST_RESOURCE_ID/locations/global/replays

    Cuerpo JSON de la solicitud:

    {
      "config": {
        "policyOverlay": {
          "TARGET_FULL_RESOURCE_NAME" : POLICY
        }
      }
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene el nombre de una operación que representa tu repetición:

    {
      "name": "operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8",
      "metadata": {
        "type_url": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata"
      }
    }
    

  4. Consulta el método operations.get hasta que se complete la repetición.

    Para sondear una operación, te recomendamos que invoques repetidamente el método operations.get hasta que la respuesta incluya el campo "done": true y el campo name con el nombre de la repetición completada. Usa un tiempo de espera exponencial truncado para introducir un retraso entre cada solicitud.

    Para obtener el estado de una repetición, usa el método operations.get de la API Policy Simulator.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • OPERATION_NAME: el nombre de una operación de repetición, incluido el prefijo operations. Copia este valor del campo name de una respuesta replays.create. Por ejemplo: operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8
    • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.

    Método HTTP y URL:

    GET https://policysimulator.googleapis.com/v1/OPERATION_NAME

    Para enviar tu solicitud, despliega una de estas opciones:

    Las operaciones en curso devuelven una respuesta como la siguiente:

    {
      "name": "operations/42083b6b-3788-41b9-ae39-e97d7615a22d",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:34:14.732Z"
      }
    }
    

    Las operaciones completadas devuelven una respuesta como la siguiente:

    {
      "name": "operations/89ab4892-9605-4c84-aedb-4fce4fc5195b",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.ReplayOperationMetadata",
        "startTime": "2021-01-15T05:40:15.922Z"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.policysimulator.v1.Replay",
        "replay": {
          "name": "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b",
          "state": SUCCEEDED,
          "config": {},
          "resultsSummary": {
            "logCount": 1319,
            "unchangedCount": 1169,
            "differenceCount": 149,
            "errorCount": 1,
            "oldestDate": {
              "year": 2020,
              "month": 10,
              "day": 15
            },
            "newestDate": {
              "year": 2021,
              "month": 1,
              "day": 12
            }
          }
        }
      }
    }
    

  5. Obtener los resultados de la repetición.

    Para obtener los resultados de una repetición, usa el método replays.results.list de la API Policy Simulator.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • REPLAY_NAME: el nombre de la repetición de la que quieras obtener resultados. Copia este valor del campo response.replay.name de una respuesta operations.get. Incluya los prefijos de tipo de recurso y de ubicación. Por ejemplo, "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b"
    • PAGE_SIZE: opcional. Número máximo de resultados que se devolverán en esta solicitud. Si no se especifica, el servidor determinará el número de resultados que se devolverán. Si el número de resultados es mayor que el tamaño de página, la respuesta contiene un token de paginación que puedes usar para obtener la siguiente página de resultados.
    • PAGE_TOKEN: opcional. El token de paginación devuelto en una respuesta anterior de este método. Si se especifica, la lista de resultados empezará donde terminó la solicitud anterior.
    • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.

    Método HTTP y URL:

    GET https://policysimulator.googleapis.com/v1/REPLAY_NAME/results?pageSize=page-size&pageToken=PAGE_TOKEN

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene una lista de resultados que explica cómo cambiaría el acceso de la entidad si se aplicara la política propuesta. En estos resultados también se indican los errores que se han producido durante la simulación, sobre todo los que se deben a tipos de recursos no admitidos.

    Consulta la sección Interpretar los resultados del simulador de políticas de esta página para saber cómo leerlos.

    A continuación, se muestra un ejemplo de respuesta de una simulación de política que implica al usuario my-user@example.com. En este caso, si se aplicara el cambio propuesto, my-user@example.com resourcemanager.projects.list y resourcemanager.projects.getmy-project ya no tendrían los permisos resourcemanager.projects.update en el proyecto my-project:

    {
      "replayResults": [
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.list",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.get",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_MAYBE_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "UNKNOWN_INFO_DENIED",
                "errors": [
                  {
                    "code": 7,
                    "message": "Missing permission to view group membership.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to view group membership.",
                        "resourceName": "group:everyone@example.com",
                        "resourceType": "Google group"
                      }
                    ]
                  },
                  {
                    "code": 7,
                    "message": "Missing permission to get relevant IAM policies.",
                    "details": [
                      {
                        "@type": "type.googleapis.com/google.rpc.ResourceInfo",
                        "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.",
                        "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                        "resourceType": "cloudresourcemanager.googleapis.com/projects"
                      }
                    ]
                  }
                ],
                "policies": [
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "bindingExplanations": [
                      {
                        "access": "UNKNOWN_INFO_DENIED",
                        "memberships": {
                          "group:everyone@example.com": {
                            "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED"
                          }
                        },
                        "role": "roles/owner"
                      }
                    ],
                    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
                    "policy": {
                      "bindings": [
                        {
                          "members": [
                            "group:everyone@example.com"
                          ],
                          "role": "roles/owner"
                        }
                      ],
                      "etag": "BwWgJSIInYA=",
                      "version": 3
                    }
                  },
                  {
                    "access": "UNKNOWN_INFO_DENIED",
                    "policy": {}
                  }
                ]
              }
            }
          }
        },
        {
          "accessTuple": {
            "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
            "permission": "resourcemanager.projects.update",
            "principal": "my-user@example.com"
          },
          "lastSeenDate": {
            "day": 27,
            "month": 3,
            "year": 2020
          },
          "diff": {
            "accessDiff": {
              "accessChange": "ACCESS_REVOKED",
              "baseline": {
                "accessState": "GRANTED"
              },
              "simulated": {
                "accessState": "NOT_GRANTED"
              }
            }
          }
        },
        {
          "accessTuple": {},
          "error": {
            "code": 12,
            "message": "Simulator does not yet support all resource types for 8 removed permissions.",
            "details": [
              {
                "@type": "type.googleapis.com/google.rpc.Status",
                "code": 12,
                "message": "Simulator does not yet support all resource types for 8 removed permissions.",
                "details": [
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.create"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.setIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.delete"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.update"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "pubsub.topics.publish"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.list"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.getIamPolicy"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  },
                  {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "domain": "policysimulator.googleapis.com",
                    "metadata": {
                      "permission": "storage.objects.get"
                    },
                    "reason": "UNSUPPORTED_RESOURCE"
                  }
                ]
              }
            ]
          }
        }
      ],
      "nextPageToken": "AWukk3zjv80La+chWx6WNt7X8czGPLtP792gRpkNVEV/URZ/VdWzxmuJKr"
    }
    

    Si no ha habido ningún cambio en el acceso entre la política de permiso actual y la política de permiso simulada, la solicitud devuelve una lista vacía ({}).

Interpretar los resultados del simulador de políticas

El simulador de políticas informa del impacto de un cambio propuesto en una política de permiso como una lista de cambios de acceso. Cada cambio de acceso representa un intento de acceso de los últimos 90 días que tendría un resultado diferente con la política de acceso propuesta que con la política de acceso actual.

El simulador de políticas también muestra los errores que se han producido durante la simulación, lo que te ayuda a identificar posibles lagunas en la simulación.

La presentación de estos cambios y errores depende de la plataforma que utilices.

Consola

En la página de resultados del simulador de políticas se muestran los resultados de la simulación en varias secciones:

  • Cambios en la política: en esta sección se muestra el recurso cuya política de permisos quieres modificar, los roles que quieres quitar y los roles que quieres añadir.

    Esta sección también contiene el botón Ver diferencias de la política. Si haces clic en este botón, podrás ver cómo es la política de permisos del recurso antes y después de los cambios propuestos.

  • Cambios en los permisos: esta sección contiene el número de permisos que se han quitado y añadido, que describen cómo cambiarían los permisos de la entidad si aplicaras los cambios propuestos. Estos recuentos de permisos se calculan comparando los permisos de los roles actuales de la principal con los permisos de los roles propuestos de la principal, sin tener en cuenta los roles heredados.

    Esta sección también contiene un botón Ver diferencias de permisos. Si haces clic en este botón, podrás ver una comparación de los permisos de los roles actuales y propuestos de la entidad de seguridad.

  • Cambios en el acceso en los últimos 90 días: en esta sección se muestran los intentos de acceso de los últimos 90 días que tienen resultados diferentes en la política de permiso propuesta y en la política de permiso actual. En esta sección se incluye un resumen de los cambios de acceso y una tabla con resultados más detallados.

    El resumen de los cambios de acceso muestra el número de cada tipo de cambio de acceso, el número de errores y resultados desconocidos, y el número de intentos de acceso que tienen el mismo resultado en la política de permiso propuesta y en la política de permiso actual. El resumen también muestra cuántos permisos no se han podido simular. Para obtener más información, consulta la sección Errores de esta página.

    Esta sección también contiene una tabla de cambios de acceso. En esta tabla se muestra cada intento de acceso de los últimos 90 días que tiene un resultado diferente en la política de permiso propuesta y en la política de permiso actual. Cada entrada incluye el recurso al que el principal intentaba acceder, la fecha de la solicitud, el principal que realiza la solicitud, el permiso de la solicitud y el estado del acceso en la política de permiso propuesta en comparación con el estado del acceso en la política de permiso actual.

    Hay varios tipos de cambios de acceso:

    Cambio en el acceso Detalles
    Acceso revocado La entidad principal tenía acceso según la política de permiso actual, pero ya no lo tendrá después del cambio propuesto.
    Acceso potencialmente revocado

    Este resultado puede producirse por los siguientes motivos:

    • La entidad tenía acceso según la política de permiso actual, pero su acceso según la política de permiso propuesta es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero no tendrá acceso después del cambio propuesto.
    Acceso adquirido La entidad principal no tenía acceso con la política de permiso actual, pero sí lo tendrá después del cambio propuesto.
    Acceso potencialmente adquirido

    Este resultado puede producirse por los siguientes motivos:

    • El principal no tenía acceso con la política de permiso actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero tendrá acceso después del cambio propuesto.
    Acceso desconocido El acceso de la entidad de seguridad según la política de permiso actual y la propuesta es desconocido, y los cambios propuestos podrían afectar al acceso de la entidad de seguridad.
    Error Se ha producido un error durante la simulación.

    Para ver más detalles sobre un cambio de acceso, haz clic en él. Se abrirá el panel Detalles del cambio en el acceso, que muestra información adicional sobre el cambio en el acceso, como el acceso actual de la cuenta principal, el acceso propuesto y más detalles sobre el resultado del cambio.

gcloud

Cuando usas el comando replay-recent-access, la respuesta de gcloud CLI contiene una lista de replayResults.

Cada resultado de repetición describe un intento de acceso cuyo resultado habría sido diferente si la política de permiso propuesta hubiera estado vigente en el momento del intento. Por ejemplo, el siguiente resultado de la repetición muestra que my-user@example.com usó el permiso resourcemanager.projects.update en el pasado para realizar una acción en el proyecto my-project. Sin embargo, si se hubiera aplicado la política de permiso propuesta, se les habría denegado el acceso.

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

Cada resultado de repetición tiene los siguientes campos:

  • accessTuple: el intento de acceso al que se refiere el resultado. Este campo incluye el recurso, el permiso y la entidad principal que han participado en el intento de acceso.

  • lastSeenDate: la fecha en la que se hizo el último intento de acceso.

  • diff.accessDiff o error: si la repetición de un intento de acceso se realiza correctamente, el resultado contiene un campo diff.accessDiff que informa de la diferencia entre los resultados del intento de acceso con la política de acceso actual y con la propuesta. Si el intento de repetición no se realiza correctamente, el resultado de la repetición contiene un campo error con una descripción del error. Para obtener más información sobre los errores de simulación, consulta la sección Errores de esta página.

Cada diferencia de acceso tiene los siguientes componentes:

  • baseline: el resultado del acceso al usar la política de permiso actual. Se indica como uno de los siguientes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED. Si el resultado es UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED, la respuesta también mostrará los errores asociados a la información desconocida, así como las políticas de permiso asociadas a ese error. Para obtener más información sobre los valores de UNKNOWN, consulta la sección Resultados desconocidos de esta página.
  • simulated: resultado del acceso al usar la política de permiso propuesta. Se indica como uno de los siguientes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED. Si el resultado es UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED, la respuesta también mostrará los errores asociados a la información desconocida, así como las políticas de permiso asociadas a ese error. Para obtener más información sobre los valores de UNKNOWN, consulta la sección Resultados desconocidos de esta página.
  • accessChange: el cambio entre el estado de acceso de referencia y el estado de acceso simulado. Consulta la siguiente tabla para ver una lista de valores posibles:

    Cambio en el acceso Detalles
    ACCESS_REVOKED La entidad principal tenía acceso según la política de permiso actual, pero ya no lo tendrá después del cambio propuesto.
    ACCESS_MAYBE_REVOKED

    Este resultado puede producirse por los siguientes motivos:

    • La entidad tenía acceso según la política de permiso actual, pero su acceso según la política de permiso propuesta es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero no tendrá acceso después del cambio propuesto.
    ACCESS_GAINED La entidad principal no tenía acceso con la política de permiso actual, pero sí lo tendrá después del cambio propuesto.
    ACCESS_MAYBE_GAINED

    Este resultado puede producirse por los siguientes motivos:

    • El principal no tenía acceso con la política de permiso actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero tendrá acceso después del cambio propuesto.
    UNKNOWN_CHANGE El acceso de la entidad de seguridad según la política de permiso actual y la propuesta es desconocido, y los cambios propuestos podrían afectar al acceso de la entidad de seguridad.

REST

Cuando llamas al método replays.results.list, la respuesta contiene una lista de replayResults.

Cada resultado de repetición describe un intento de acceso cuyo resultado habría sido diferente si la política de permiso propuesta hubiera estado vigente en el momento del intento. Por ejemplo, el siguiente resultado de la repetición muestra que my-user@example.com usó el permiso resourcemanager.projects.update en el pasado para realizar una acción en el proyecto my-project. Sin embargo, si se hubiera aplicado la política de permiso propuesta, se les habría denegado el acceso.

{
  "accessTuple": {
    "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project",
    "permission": "resourcemanager.projects.update",
    "principal": "my-user@example.com"
  },
  "lastSeenDate": {
    "day": 15,
    "month": 1,
    "year": 2021
  },
  "diff": {
    "accessDiff": {
      "baseline": {
        "accessState": "GRANTED"
      },
      "simulated": {
        "accessState": "NOT_GRANTED"
      },
      "accessChange": "ACCESS_REVOKED"
    }
  }
}

Cada resultado de repetición tiene los siguientes campos:

  • accessTuple: el intento de acceso al que se refiere el resultado. Este campo incluye el recurso, el permiso y la entidad principal que han participado en el intento de acceso.

  • lastSeenDate: la fecha en la que se hizo el último intento de acceso.

  • diff.accessDiff o error: si la repetición de un intento de acceso se realiza correctamente, el resultado contiene un campo diff.accessDiff que informa de la diferencia entre los resultados del intento de acceso con la política de acceso actual y con la propuesta. Si el intento de repetición no se realiza correctamente, el resultado de la repetición contiene un campo error con una descripción del error. Para obtener más información sobre los errores de simulación, consulta la sección Errores de esta página.

Cada diferencia de acceso tiene los siguientes componentes:

  • baseline: el resultado del acceso al usar la política de permiso actual. Se indica como uno de los siguientes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED. Si el resultado es UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED, la respuesta también mostrará los errores asociados a la información desconocida, así como las políticas de permiso asociadas a ese error. Para obtener más información sobre los valores de UNKNOWN, consulta la sección Resultados desconocidos de esta página.
  • simulated: resultado del acceso al usar la política de permiso propuesta. Se indica como uno de los siguientes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED. Si el resultado es UNKNOWN_CONDITIONAL o UNKNOWN_INFO_DENIED, la respuesta también mostrará los errores asociados a la información desconocida, así como las políticas de permiso asociadas a ese error. Para obtener más información sobre los valores de UNKNOWN, consulta la sección Resultados desconocidos de esta página.
  • accessChange: el cambio entre el estado de acceso de referencia y el estado de acceso simulado. Consulta la siguiente tabla para ver una lista de valores posibles:

    Cambio en el acceso Detalles
    ACCESS_REVOKED La entidad principal tenía acceso según la política de permiso actual, pero ya no lo tendrá después del cambio propuesto.
    ACCESS_MAYBE_REVOKED

    Este resultado puede producirse por los siguientes motivos:

    • La entidad tenía acceso según la política de permiso actual, pero su acceso según la política de permiso propuesta es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero no tendrá acceso después del cambio propuesto.
    ACCESS_GAINED La entidad principal no tenía acceso con la política de permiso actual, pero sí lo tendrá después del cambio propuesto.
    ACCESS_MAYBE_GAINED

    Este resultado puede producirse por los siguientes motivos:

    • El principal no tenía acceso con la política de permiso actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la entidad de seguridad según la política de permiso actual es desconocido, pero tendrá acceso después del cambio propuesto.
    UNKNOWN_CHANGE El acceso de la entidad de seguridad según la política de permiso actual y la propuesta es desconocido, y los cambios propuestos podrían afectar al acceso de la entidad de seguridad.

Resultados desconocidos

Si el resultado de un acceso es desconocido, significa que el simulador de políticas no tenía suficiente información para evaluar completamente el intento de acceso.

Consola

Si se desconoce el resultado de un acceso, en el panel de detalles del cambio de acceso se indica el motivo por el que se desconoce, así como los roles, las políticas de permiso, las pertenencias a grupos y las condiciones específicos a los que no se ha podido acceder o que no se han podido evaluar.

Hay varios motivos por los que un resultado puede ser desconocido:

  • Información del rol denegada: la entidad principal que ejecuta la simulación no tiene permiso para ver los detalles de uno o varios de los roles que se están simulando.
  • No se puede acceder a la política: la entidad de seguridad que ejecuta la simulación no tiene permiso para obtener la política de permiso de uno o varios de los recursos implicados en la simulación.
  • Información de pertenencia denegada: la entidad de seguridad que ejecuta la simulación no tenía permiso para ver los miembros de uno o varios de los grupos incluidos en la política de permiso propuesta.
  • Condición no admitida: hay una vinculación de rol condicional en la política de permiso que se está probando. El simulador de políticas no admite condiciones, por lo que no se ha podido evaluar la vinculación.

gcloud

En la CLI de gcloud, los resultados de la simulación indicarán el motivo por el que el resultado es desconocido en la diferencia de acceso.

El motivo por el que se desconoce el resultado del acceso será uno de los siguientes:

  • UNKNOWN_INFO_DENIED: el usuario no tiene permiso para acceder a la información necesaria para evaluar el estado de acceso. Esto puede deberse a uno de los siguientes motivos:

    • El usuario no tiene permiso para recuperar la política de permiso que se está simulando o no tiene permiso para recuperar políticas de permiso de los recursos de los registros de acceso.
    • El usuario no tiene permiso para ver los miembros de un grupo.
    • El usuario no puede obtener la información de rol necesaria.

    Para saber qué información faltaba, consulta la información sobre el error que aparece después del estado de acceso notificado.

  • UNKNOWN_CONDITIONAL: hay una vinculación de rol condicional en la política de permiso que se está probando. El simulador de políticas no admite condiciones, por lo que no se ha podido evaluar la vinculación.

Si el resultado es desconocido, el campo de la política de permiso (baseline o simulated) contiene un campo errors que describe por qué se desconoce la información y un campo policies que muestra las políticas de permiso asociadas a los errores. Para obtener más información sobre los errores, consulta la sección Errores de esta página.

REST

En la API REST, los resultados de la simulación indicarán el motivo por el que el resultado es desconocido en la diferencia de acceso.

El motivo por el que se desconoce el resultado del acceso será uno de los siguientes:

  • UNKNOWN_INFO_DENIED: el usuario no tiene permiso para acceder a la información necesaria para evaluar el estado de acceso. Esto puede deberse a uno de los siguientes motivos:

    • El usuario no tiene permiso para recuperar la política de permiso que se está simulando o no tiene permiso para recuperar políticas de permiso de los recursos de los registros de acceso.
    • El usuario no tiene permiso para ver los miembros de un grupo.
    • El usuario no puede obtener la información de rol necesaria.

    Para saber qué información faltaba, consulta la información sobre el error que aparece después del estado de acceso notificado.

  • UNKNOWN_CONDITIONAL: hay una vinculación de rol condicional en la política de permiso que se está probando. El simulador de políticas no admite condiciones, por lo que no se ha podido evaluar la vinculación.

Si el resultado es desconocido, el campo de la política de permiso (baseline o simulated) contiene un campo errors que describe por qué se desconoce la información y un campo policies que muestra las políticas de permiso asociadas a los errores. Para obtener más información sobre los errores, consulta la sección Errores de esta página.

Errores

El simulador de políticas también informa de los errores que se hayan producido durante la simulación. Es importante que revises estos errores para entender las posibles deficiencias de la simulación.

Consola

El simulador de políticas puede informar de varios tipos de errores:

  • Errores de operación: no se ha podido ejecutar la simulación. El simulador de políticas informa de los errores de operación en la parte superior de la página de resultados.

    Si el mensaje de error indica que no se ha podido ejecutar la simulación porque hay demasiados registros en tu proyecto u organización, no podrás ejecutar una simulación en el recurso.

    Si recibes este error por otro motivo, prueba a volver a ejecutar la simulación. Si sigues sin poder ejecutar la simulación, ponte en contacto con policy-simulator-feedback@google.com.

  • Errores de repetición: no se ha podido repetir un intento de acceso, por lo que el simulador de políticas no ha podido determinar si el resultado del intento de acceso cambiaría con la política de permiso propuesta.

    La Google Cloud consola muestra los errores de repetición en la tabla Cambios en el acceso en los últimos 90 días. El panel Detalles del cambio de acceso de cada error incluye un mensaje de error para ayudarte a entender el problema, así como el recurso y el permiso que se estaban simulando cuando se produjo el error.

  • Errores de tipo de recurso no admitido: la política de permiso propuesta afecta a los permisos asociados a un tipo de recurso no admitido, que el simulador de políticas no puede simular.

    El Simulador de políticas muestra estos permisos en los resultados de la simulación para que sepas cuáles no ha podido simular.

gcloud

En los resultados de simulación de la CLI de gcloud, los errores pueden aparecer en dos lugares:

  • Campo replayResult.error: si el intento de repetición no se ha completado correctamente, Simulador de políticas informa del error en el campo replayResult.error. Si un resultado de repetición contiene este campo, no contiene el campo diff.
  • El campo replayResult.diff.accessDiff.policy-type.errors, donde policy-type es baseline o simulated. Si el intento de repetición se ha realizado correctamente, pero el resultado ha sido UNKNOWN_INFO_DENIED o UNKNOWN_CONDITIONAL, el Simulador de políticas indica el motivo por el que el resultado era desconocido en este campo.

El simulador de políticas genera los siguientes tipos de errores:

Error Código de error Detalles
GENERIC_INTERNAL_ERROR 13 No se ha podido realizar la simulación debido a un error interno. Para solucionarlo, prueba a ejecutar la simulación de nuevo. Si la simulación sigue fallando, ponte en contacto con policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 El simulador de políticas no ha podido reproducir el intento de acceso porque contenía un permiso, un nombre de recurso o un principal no válidos.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 El Simulador de políticas no ha podido evaluar la pertenencia de la entidad al grupo porque el grupo tiene demasiados subgrupos. Este error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para ver la pertenencia al grupo. Este error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para recuperar una política de permiso. Este tipo de error está asociado a los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para obtener los permisos de un rol de gestión de identidades y accesos. Este tipo de error está asociado a los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para recuperar la política de permiso de un recurso antecesor. Este tipo de error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 La tupla de acceso contiene un tipo de principal que no admite el simulador de políticas.
UNIMPLEMENTED_MEMBER 12 La tupla de acceso contiene una principal que no es compatible con el simulador de políticas.
UNIMPLEMENTED_CONDITION 12 La tupla de acceso contiene una condición que no admite el simulador de políticas. Este tipo de error está asociado a los cambios de acceso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 El recurso está asociado a demasiados registros de acceso, por lo que el simulador de políticas no ha podido ejecutar la simulación. Consulta la sección Tamaño máximo de repetición de registros de la página de conceptos del Simulador de políticas para obtener más información.
UNSUPPORTED_RESOURCE 12

Los cambios propuestos en la política de permisos permiten cambiar los permisos asociados a tipos de recursos no compatibles. Este error aparece en el campo replayResult.error y contiene una lista de los permisos asociados a tipos de recursos no admitidos. Por ejemplo:

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

Para obtener más información sobre los tipos de recursos no admitidos, consulta Niveles de asistencia para tipos de recursos en la página Conceptos del simulador de políticas.

REST

En los resultados de la simulación de la API REST, los errores pueden aparecer en dos lugares:

  • Campo replayResult.error: si el intento de repetición no se ha completado correctamente, Simulador de políticas informa del error en el campo replayResult.error. Si un resultado de repetición contiene este campo, no contiene el campo diff.
  • El campo replayResult.diff.accessDiff.policy-type.errors, donde policy-type es baseline o simulated. Si el intento de repetición se ha realizado correctamente, pero el resultado ha sido UNKNOWN_INFO_DENIED o UNKNOWN_CONDITIONAL, el Simulador de políticas indica el motivo por el que el resultado era desconocido en este campo.

El simulador de políticas genera los siguientes tipos de errores:

Error Código de error Detalles
GENERIC_INTERNAL_ERROR 13 No se ha podido realizar la simulación debido a un error interno. Para solucionarlo, prueba a ejecutar la simulación de nuevo. Si la simulación sigue fallando, ponte en contacto con policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 El simulador de políticas no ha podido reproducir el intento de acceso porque contenía un permiso, un nombre de recurso o un principal no válidos.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 El Simulador de políticas no ha podido evaluar la pertenencia de la entidad al grupo porque el grupo tiene demasiados subgrupos. Este error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para ver la pertenencia al grupo. Este error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para recuperar una política de permiso. Este tipo de error está asociado a los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para obtener los permisos de un rol de gestión de identidades y accesos. Este tipo de error está asociado a los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 El simulador de políticas no ha podido evaluar el acceso de un usuario porque el llamador no tiene permiso para recuperar la política de permiso de un recurso antecesor. Este tipo de error está asociado a los cambios de acceso de UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 La tupla de acceso contiene un tipo de principal que no admite el simulador de políticas.
UNIMPLEMENTED_MEMBER 12 La tupla de acceso contiene una principal que no es compatible con el simulador de políticas.
UNIMPLEMENTED_CONDITION 12 La tupla de acceso contiene una condición que no admite el simulador de políticas. Este tipo de error está asociado a los cambios de acceso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 El recurso está asociado a demasiados registros de acceso, por lo que el simulador de políticas no ha podido ejecutar la simulación. Consulta la sección Tamaño máximo de repetición de registros de la página de conceptos del Simulador de políticas para obtener más información.
UNSUPPORTED_RESOURCE 12

Los cambios propuestos en la política de permisos permiten cambiar los permisos asociados a tipos de recursos no compatibles. Este error aparece en el campo replayResult.error y contiene una lista de los permisos asociados a tipos de recursos no admitidos. Por ejemplo:

"error": {
  "code": 12,
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.create"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.setIamPolicy"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    },
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "policysimulator.googleapis.com",
      "metadata": {
        "permission": "storage.objects.get"
      },
      "reason": "UNSUPPORTED_RESOURCE"
    }
  ],
  "message": "unsupported-permissions-error-message"
}

Para obtener más información sobre los tipos de recursos no admitidos, consulta Niveles de asistencia para tipos de recursos en la página Conceptos del simulador de políticas.

Aplicar un cambio de política simulado

Para aplicar un cambio simulado a una política de permiso, sigue estos pasos:

Consola

  1. Haz clic en Aplicar cambios propuestos.

  2. En el cuadro de diálogo de confirmación, haz clic en Aplicar para confirmar el cambio.

gcloud

Usa el comando set-iam-policy y proporciona una ruta al archivo JSON que contenga la política de permiso simulada que quieras aplicar:

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

Proporciona los siguientes valores:

  • resource-type: el tipo de recurso cuya política de permiso quieres actualizar. Por ejemplo, projects.
  • resource-id: el ID del recurso cuya política de permiso quieres actualizar. Por ejemplo, my-project.
  • filepath: ruta a un archivo que contiene la política de permisos actualizada.

La respuesta contiene la política de permiso actualizada. Si tratas las políticas de permisos de gestión de identidades y accesos como código y las almacenas en un sistema de control de versiones, debes almacenar la política de permisos que devuelve la CLI de gcloud, no el archivo JSON que contiene la política de permisos simulada.

REST

Define la política de permiso propuesta como la nueva política de permiso del recurso.

Para definir la política de permisos de la solicitud como la nueva política de permisos del proyecto, usa el método projects.setIamPolicy de la API Resource Manager.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto. Google Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
  • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

Método HTTP y URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

Cuerpo JSON de la solicitud:

{
  "policy": {
    POLICY
  }
}

Para enviar tu solicitud, despliega una de estas opciones:

La respuesta contiene la política de permiso actualizada.


Guardar los resultados de la simulación

Si usas la CLI de gcloud, puedes guardar los resultados de Policy Simulator como archivos JSON, YAML o CSV.

Guardar como JSON o YAML

Para guardar los resultados de una simulación como un archivo JSON o YAML, añade la siguiente marca al comando replay-recent-access al ejecutar la simulación:

--output=output-format > filename

Sustituye los siguientes valores:

  • output-format: el idioma del archivo exportado, json o yaml.
  • filename: el nombre del archivo exportado.

Guardar como CSV

Para guardar un archivo CSV, añade la siguiente marca al comando replay-recent-access cuando ejecutes la simulación:

--flatten="diffs[]" --format=csv(output-fields) > filename

Sustituye los siguientes valores:

  • output-fields: lista separada por comas de los campos que quieres incluir en los resultados exportados. Por ejemplo, diffs.accessTuple.principal, diffs.accessTuple.permission.
  • filename: el nombre del archivo exportado.

De forma opcional, puedes añadir campos adicionales, como errors[], a la marca --flatten. Si añades campos a la marca --flatten, los elementos de esos campos se mostrarán en líneas independientes en el archivo CSV.

A continuación, se muestra un ejemplo de un comando replay-recent-access que guarda los campos más importantes de los resultados de la simulación en el archivo CSV simulation-results.csv:

gcloud iam simulator replay-recent-access --flatten="diffs[]" \
    --format="csv(diffs.accessTuple.principal, diffs.accessTuple.permission, \
    diffs.accessTuple.fullResourceName, diffs.diff.accessDiff.accessChange, \
    diffs.diff.accessDiff.baseline.accessState, \
    diffs.diff.accessDiff.simulated.accessState)" \
    //cloudresourcemanager.googleapis.com/projects/my-project \
    proposed-policy.json > simulation-results.csv

En este ejemplo se simula proposed-policy.json para el proyecto my-project y se guardan los resultados como simulation-results.csv. Este archivo CSV contiene los siguientes campos: principal, permiso, recurso, cambio de acceso, estado de acceso de referencia y estado de acceso simulado.

Para obtener más información sobre el formato con la CLI de gcloud, consulta formatos.

Siguientes pasos