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:
- Probar los cambios en las políticas de denegación con el simulador de políticas
- Probar los cambios en las políticas de organización con el simulador de políticas
- Probar los cambios en la política Límites de Acceso de Principales con el simulador de política
Antes de empezar
-
Enable the Policy Simulator and Resource Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - Opcional: Consulta cómo funciona el simulador de políticas de permiso.
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, consulta el artículo Descripción de 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:
-
Visor de recursos de Cloud (
roles/cloudasset.viewer) -
Administrador del simulador (
roles/policysimulator.admin) -
Revisor de seguridad (
roles/iam.securityReviewer)
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar 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, donderesourcees el tipo de recurso de destino yservicees 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 asigne el rol de gestión de identidades y accesos administrador del simulador (roles/policysimulator.admin) en el recurso host.
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar 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.
Permisos recomendados
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.
Permisos de gestión de identidades y accesos recomendados
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.getyiam.roles.listen 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, donderesourcees el nombre de un tipo de recurso que puede tener una política de permiso yservicees 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:
- El 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.getIamPolicyen ese segmento. Si el proyecto tiene una carpeta superior con una política de permiso, también necesitas el permisoresourcemanager.folders.getIamPolicyen esa carpeta.
Permisos recomendados de Google Workspace
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 contenga el privilegio groups.read (situado en Privilegios de la API Admin) y que te lo conceda. Esto te permite ver la pertenencia 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:
En la consola de Google Cloud , ve a la página Gestión de identidades y accesos.
Crea un cambio propuesto en la política de permisos editando los permisos de un principal:
- Busca el principal cuyo acceso quieras editar y haz clic en el botón Editar situado a la derecha.
- Edita el acceso de la cuenta principal añadiendo un nuevo rol o revocando o cambiando un rol ya asignado.
Para simular el cambio propuesto, haga clic en Probar cambios.
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.
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 valorjsonoyaml.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-projecten formato JSON y la guarda en el directorio principal del usuario:gcloud projects get-iam-policy my-project --format=json > ~/policy.json
Modifica la política de permiso JSON o YAML devuelta por el comando
get-iam-policypara 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.
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, dondeproject-ides 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 permiso modificada que quieres simular. Por ejemplo,~/proposed_policy.json.format: el formato de la respuesta. Por ejemplo,jsonoyaml.
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, consulta 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.compodría perder los permisosresourcemanager.projects.listyresourcemanager.projects.getdel proyectomy-project, y sin duda perdería el permisoresourcemanager.projects.updatedel proyectomy-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.
Lee la política de permiso del recurso.
Para obtener la política de permisos de un proyecto, usa el método
projects.getIamPolicyde 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, comomy-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" ] } ] }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.
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.createde 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 serprojects,foldersoorganizations. HOST_RESOURCE_ID: el ID del recurso 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, dondePROJECT_IDes 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" : POLICYen el cuerpo de la solicitud. PROJECT_ID: tu ID de proyecto Google Cloud . Los IDs de proyecto son cadenas alfanuméricas, comomy-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" } }-
Consulta el método
operations.gethasta que se complete la repetición.Para sondear una operación, te recomendamos que invoques repetidamente el método
operations.gethasta que la respuesta incluya el campo"done": truey un camponamecon 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.getde 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 prefijooperations. Copia este valor del camponamede una respuestareplays.create. Por ejemplo:operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8PROJECT_ID: tu ID de proyecto Google Cloud . Los IDs de proyecto son cadenas alfanuméricas, comomy-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 } } } } }Obtener los resultados de la repetición.
Para obtener los resultados de una repetición, usa el método
replays.results.listde 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 camporesponse.replay.namede una respuestaoperations.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, comomy-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 explican cómo cambiaría el acceso de la principal 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 el artículo Interpretar los resultados del simulador de políticas de esta página para saber cómo leer los resultados.
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.comresourcemanager.projects.listyresourcemanager.projects.getmy-projectya no tendrían los permisosresourcemanager.projects.updateen el proyectomy-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 en el acceso. Cada cambio de acceso representa un intento de acceso de los últimos 90 días que habría tenido 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 un 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 actual y propuesto del principal.
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 de seguridad tenía acceso con 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 director no tenía acceso según 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 pueden 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"