Prueba cambios de roles con Policy Simulator

En esta página, se describe cómo simular un cambio en una política de permisos con Policy Simulator para las políticas de permisos de Identity and Access Management. También se explica cómo interpretar los resultados de la simulación y cómo aplicar la política de permisos simulada si así lo deseas.

Antes de comenzar

Permisos necesarios

Antes de simular un cambio en una política de permisos, debes asegurarte de tener los permisos adecuados. Se requieren 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 Identity and Access Management (IAM), consulta Comprende los roles.

Permisos de recursos de destino necesarios

El recurso de destino de la simulación es el recurso cuyas políticas de permisos simulas.

Si quieres obtener los permisos que necesitas para ejecutar una simulación, pídele a tu administrador que te otorgue los siguientes roles de IAM en el recurso de destino:

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

Estos roles predefinidos contienen los permisos necesarios para ejecutar una simulación. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para ejecutar una simulación:

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

Es posible que también puedas obtener estos permisos con funciones personalizadas o con otras funciones predefinidas.

Permisos necesarios de recursos de host

El recurso de host de una simulación es la organización, la carpeta o el proyecto que crea y ejecuta la simulación. El recurso de host no necesita estar relacionado con el recurso de destino de ninguna manera.

La forma en que configuras el recurso de host depende de la plataforma que uses.

Consola

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

Para cambiar el recurso de host, elige un proyecto, una carpeta o una organización diferentes en el selector de recursos.

gcloud

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

REST

Debes especificar manualmente el recurso de host cada vez que envías una solicitud. Consulta Simula un cambio en la política en esta página para obtener más detalles.

Si quieres obtener los permisos que necesitas para ejecutar una simulación, pídele a tu administrador que te otorgue el rol de IAM Administrador del simulador (roles/policysimulator.admin) en el recurso de host. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

Este rol predefinido contiene los permisos necesarios para ejecutar una simulación. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para ejecutar una simulación:

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

Es posible que también puedas obtener estos permisos con funciones personalizadas o con otras funciones predefinidas.

Para obtener los resultados más completos de una simulación, te recomendamos que tengas ciertos permisos de IAM y de Google Workspace. Si no tienes algunos o todos los permisos, puedes ejecutar una simulación. Sin embargo, si ejecutas una simulación sin estos permisos puede generar un aumento en la cantidad de cambios de acceso desconocidos, ya que es posible que no puedas recuperar información que podría afectar los resultados de la simulación.

Te recomendamos que tengas la función de revisor de seguridad (roles/iam.securityReviewer) en tu organización cuando ejecutes una simulación. Como alternativa, si ya tienes la función de administrador de seguridad (roles/iam.securityAdmin), no necesitas tener ninguna función adicional.

Estas funciones 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 cualquier proyecto, organización o carpeta relevante en la que se definan funciones personalizadas. Un proyecto, una carpeta o una organización es relevante si es un elemento principal o secundario del recurso cuya política de permisos simulas.
  • service.resource.getIamPolicy, en la que resource es el nombre de un tipo de recurso que puede tener una política de permisos, y service es el nombre del servicio de Google Cloud que posee ese recurso.

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

    • Policy Simulator admite el recurso.
    • El recurso tiene una política de permisos que puede afectar el acceso del usuario. Esto es verdadero si se aplica una de las siguientes condiciones:

      • El recurso es un elemento secundario del recurso cuya política de permisos simulas y aparece en los registros de acceso relevantes.
      • El recurso es un elemento principal del recurso cuya política de permisos simulas.

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

Te recomendamos que tengas permiso a fin de recuperar información de pertenencia de cada Grupo de Google en la política de permisos original y la política de permisos propuesta.

Los administradores de grupo y los administradores avanzados de Google Workspace suelen tener acceso para ver las membresías del grupo. Si no eres administrador avanzado ni administrador de grupo, pídele al administrador de Google Workspace que cree un rol de administrador personalizado de Google Workspace que contenga el privilegio groups.read (ubicado en Privilegios de la API de administrador) y otorgársela. Esto te permite ver la pertenencia de todos los grupos de tu dominio y simular de manera más eficaz los cambios en una política de permisos.

Simula un cambio de política

Simula un cambio en una política de permisos mediante estos pasos.

Consola

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

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

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

    Ir a la página IAM

  2. Crea un cambio propuesto en la política de permisos mediante la edición de los permisos de una principal existente:

    1. Localiza la principal cuyo acceso deseas editar y haz clic en el botón Editar a la derecha.
    2. Para editar el acceso de la principal, agrega una función nueva, revoca o cambia una función existente.
  3. Para simular el cambio propuesto, haz clic en Probar cambios.

  4. Después de varios minutos, la consola de Google Cloud mostrará los resultados de la simulación como una lista de cambios de acceso. Consulta Información sobre los resultados de Policy Simulator en esta página para obtener más información.

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

gcloud

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

  1. Para leer la política de permisos actual, ejecuta el siguiente comando:

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

    Reemplaza los siguientes valores:

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

    Por ejemplo, el siguiente comando obtiene la política de permisos para el 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 de JSON o YAML que muestra el comando get-iam-policy para reflejar los cambios que deseas simular.

    Existen varios tipos de cambios que puedes realizar en la política de permisos. Por ejemplo, puedes agregar o quitar una principal de una vinculación de rol o quitar una vinculación de rol de la política de permisos.

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

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

    Reemplaza los siguientes valores:

    • full-resource-name: Es el nombre completo del recurso cuya política de permisos deseas simular.

      El nombre completo del recurso es un URI que consiste en el nombre del servicio y la ruta al recurso. Por ejemplo, si simulas una política de permisos para un proyecto, debes usar //cloudresourcemanager.googleapis.com/projects/project- id, donde project-id es el ID del proyecto cuya política de permisos simulas.

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

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

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

    Después de varios minutos, el comando imprime una lista de resultados de repetición que explican cómo cambiaría el acceso de la principal si se aplicara la política de permisos propuesta. En estos resultados, también se enumera cualquier error que haya ocurrido durante la simulación, incluidos los errores debido a los tipos de recursos no compatibles.

    Consulta Información sobre los resultados del simulador de políticas en esta página para aprender a leer los resultados. Para aprender a guardar los resultados de la simulación en lugar de imprimirlos, consulta Guarda los resultados de la simulación.

    La siguiente es una respuesta de muestra para una simulación de política de permisos que involucra 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 del proyecto my-project, y con seguridad no tendría el permiso resourcemanager.projects.update para 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 hubo ningún cambio en el acceso entre la política de permisos existente y la política de permisos simulada, el comando imprime No access changes found in the replay.

REST

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

  1. Lee la política de permisos para el recurso.

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

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

    • PROJECT_ID: El ID del proyecto de Google Cloud Los ID de proyecto son strings alfanuméricas, como my-project.
    • POLICY_VERSION: Es la versión de la política que se mostrará. Las solicitudes deben especificar la versión de política más reciente, que es la versión de política 3. Consulta Especifica una versión de política cuando obtienes una política para obtener más detalles.

    HTTP method and URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

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

    {
      "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 permisos que se muestra para reflejar los cambios que deseas simular.

    Existen varios tipos de cambios que puedes realizar en la política de permisos. Por ejemplo, puedes agregar o quitar una principal de una vinculación de rol o quitar una vinculación de rol de la política de permisos.

  3. Crea una simulación o repítela con la política de permisos modificada.

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

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

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

      El nombre completo del recurso es un URI que consiste en el nombre del servicio y la ruta al recurso. Por ejemplo, si simulas una política para un proyecto, usarás //cloudresourcemanager.googleapis.com/projects/PROJECT_ID, en el que PROJECT_ID es el ID del proyecto cuya política deseas simular.

      Para obtener una lista completa de los formatos de nombre de recurso, consulta Nombres de recursos completos.

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

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

    • PROJECT_ID: El ID del proyecto de Google Cloud Los ID de proyecto son strings 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, expande 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. Busca el método operations.get hasta que se complete la repetición.

    Para sondear una operación, te recomendamos que invoques el método operations.get de manera repetida hasta que la respuesta incluya los campos "done": true y name con el nombre de la repetición completada. Usa la retirada exponencial truncada para ingresar una demora entre cada solicitud.

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

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

    • OPERATION_NAME: Es 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: El ID del proyecto de Google Cloud Los ID de proyecto son strings alfanuméricas, como my-project.

    HTTP method and URL:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Las operaciones en curso muestran una respuesta como la que se muestra a continuación:

    {
      "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 muestran 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. Obtén los resultados de la repeticion.

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

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

    • REPLAY_NAME: Es el nombre de la repetición para la que deseas recuperar los resultados. Copia este valor del campo response.replay.name de una respuesta operations.get. Incluye cualquier tipo de recurso y prefijos de ubicación. Por ejemplo: "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b"
    • PAGE_SIZE: Opcional La cantidad máxima de resultados que se mostrarán con esta solicitud. Si no se especifica, el servidor determinará la cantidad de resultados que se mostrarán. Si la cantidad de resultados es mayor que el tamaño de la página, la respuesta contiene un token de paginación que puedes usar para consultar la siguiente página de resultados.
    • PAGE_TOKEN: Opcional El token de paginación que se mostró en una respuesta anterior de este método. Si se especifica, la lista de funciones comenzará desde el punto en que finalizó la solicitud anterior.
    • PROJECT_ID: El ID del proyecto de Google Cloud Los ID de proyecto son strings alfanuméricas, como my-project.

    HTTP method and URL:

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

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene una lista de resultados en la que se explica cómo cambiaría el acceso de la principal si se aplicara la política propuesta. En estos resultados, también se enumeran los errores que se produjeron durante la simulación, en particular, los errores debido a tipos de recursos no compatibles.

    Consulta la Información sobre los resultados de Policy Simulator en esta página para aprender a leer los resultados.

    La siguiente es una respuesta de muestra para una simulación de política que involucra al usuario my-user@example.com. En este caso, si se aplicara el cambio propuesto, my-user@example.com ya no tendría los permisos resourcemanager.projects.list y resourcemanager.projects.get del proyecto my-project, y con seguridad no tendría el permiso resourcemanager.projects.update para 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 hubo ningún cambio en el acceso entre la política de permisos existente y la política de permisos simulada, la solicitud muestra una lista vacía ({}).

Comprende los resultados de Policy Simulator

Policy Simulator informa el impacto de un cambio propuesto en una política de permisos como una lista de cambios de acceso. Todo 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 permisos propuesta en comparación con la política de permisos actual.

El simulador de política también enumera los errores que se produjeron durante la simulación, lo que te ayuda a identificar posibles brechas en la simulación.

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

Consola

En la página de resultados de Policy Simulator, se muestran los resultados de la simulación en varias secciones diferentes:

  • Cambios en la política: En esta sección, se muestra el recurso para el que deseas proponer cambios en la política de permisos, los roles que propones quitar y los roles que propones agregar.

    Esta sección también contiene un botón Ver diferencia de la política. Si haces clic en este botón, puedes ver cómo se ve la política de permisos del recurso antes y después de los cambios propuestos.

  • Cambios en los permisos: En esta sección, se incluyen los recuentos de permisos que se quitaron y se agregaron, lo que describe cómo cambiarían los permisos de la principal si aplicaras los cambios propuestos. Estos recuentos de permisos se calculan mediante la comparación de los permisos en los roles actuales de la principal con los permisos en los roles propuestos de la principal, ignorando los roles heredados.

    En esta sección, también se incluye el botón Ver diferencia de los permisos. Si haces clic en este botón, puedes ver una comparación en paralelo de los permisos en los roles actuales y propuestos de la principal.

  • Cambios de acceso en los últimos 90 días: en esta sección, se muestra qué intentos de acceso de los últimos 90 días tienen diferentes resultados en la política de permisos propuesta y la política de permisos 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 enumera la cantidad de cada tipo de cambio de acceso, la cantidad de errores y resultados desconocidos y la cantidad de intentos de acceso que tienen el mismo resultado bajo la política de permisos propuesta y la actual. En el resumen, también se muestra cuántos permisos no se pudieron simular. Para obtener más información, consulta Errores en esta página.

    En esta sección, también se incluye una tabla de cambios de acceso. En esta tabla, se enumera cada intento de acceso de los últimos 90 días que tiene resultados diferentes con la política de permisos propuesta y con la política actual. Cada entrada incluye el recurso al que la principal intentaba acceder, la fecha de la solicitud, la principal que realizó la solicitud, el permiso en la solicitud y el estado de acceso bajo la política de permisos propuesta en comparación con el estado de acceso bajo la política de permisos actual.

    Existen varios tipos de cambios de acceso:

    Cambio de acceso Detalles
    Se revocó el acceso La principal tenía acceso con la política de permisos actual, pero ya no tendrá acceso después del cambio propuesto.
    Es posible que se haya revocado el acceso

    Esto puede suceder por los siguientes motivos:

    • La principal tenía acceso según la política de permisos actual, pero su acceso en virtud de la política de permisos propuesta es desconocido.
    • El acceso de la principal con la política de permisos actual es desconocido, pero no tendrá acceso después del cambio propuesto.
    Acceso obtenido La principal no tiene acceso con la política de permisos actual, pero tendrá acceso después del cambio propuesto.
    Acceso potencialmente obtenido

    Esto puede suceder por los siguientes motivos:

    • La principal no tenía acceso según la política de permisos actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la principal con la política de permisos actual es desconocido, pero tendrá acceso después del cambio propuesto.
    Acceso desconocido El acceso de la principal tanto con la política de permisos actual como con la política de permisos propuesta es desconocido, y los cambios propuestos pueden afectar el acceso de la principal.
    Error Se produjo un error durante la simulación.

    Para obtener detalles adicionales sobre un cambio de acceso, haz clic en el cambio de acceso. Esto abrirá el panel Detalles de cambio de acceso, que muestra información adicional sobre el cambio de acceso, incluido el acceso existente del miembro, el acceso propuesto por la principal y detalles adicionales sobre el acceso.

gcloud

Cuando usas el comando replay-recent-access, la respuesta de la CLI de gcloud 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 permisos propuesta se hubiera implementado en el momento del intento. Por ejemplo, el siguiente resultado de 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 la política de permisos propuesta se hubiera implementado, 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: Es el intento de acceso con el que se relaciona el resultado. Este campo incluye el recurso, el permiso y la principal que se involucraron en el intento de acceso.

  • lastSeenDate: Es la fecha en la que se realizó 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 la diferencia entre los resultados del intento de acceso según la política de permisos actual y la política de permisos propuesta. Si el intento de repetición no se realiza correctamente, el resultado de la repetición contendrá un campo error con una descripción del error. Para obtener más información sobre los errores de simulación, consulta Errores en esta página.

Cada diferencia de acceso tiene los siguientes componentes:

  • baseline: Es el resultado de acceso cuando se usa la política de permisos actual. Esto se informa 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 enumerará los errores asociados con la información desconocida, así como las políticas de permisos asociadas con ese error. Para obtener más información sobre los valores UNKNOWN, consulta Resultados desconocidos en esta página.
  • simulated: Es el resultado de acceso cuando se usa la política de permisos propuesta. Esto se informa 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 enumerará los errores asociados con la información desconocida, así como las políticas de permisos asociadas con ese error. Para obtener más información sobre los valores UNKNOWN, consulta Resultados desconocidos en esta página.
  • accessChange: Es el cambio entre el estado de acceso del modelo de referencia y el estado de acceso simulado. Consulta la siguiente tabla para obtener una lista de valores posibles:

    Cambio de acceso Detalles
    ACCESS_REVOKED La principal tenía acceso con la política de permisos actual, pero ya no tendrá acceso después del cambio propuesto.
    ACCESS_MAYBE_REVOKED

    Esto puede suceder por los siguientes motivos:

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

    Esto puede suceder por los siguientes motivos:

    • La principal no tenía acceso según la política de permisos actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la principal con la política de permisos actual es desconocido, pero tendrá acceso después del cambio propuesto.
    UNKNOWN_CHANGE El acceso de la principal tanto con la política de permisos actual como con la política de permisos propuesta es desconocido, y los cambios propuestos pueden afectar el acceso de la principal.

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 permisos propuesta se hubiera implementado en el momento del intento. Por ejemplo, el siguiente resultado de 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 la política de permisos propuesta se hubiera implementado, 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: Es el intento de acceso con el que se relaciona el resultado. Este campo incluye el recurso, el permiso y la principal que se involucraron en el intento de acceso.

  • lastSeenDate: Es la fecha en la que se realizó 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 la diferencia entre los resultados del intento de acceso según la política de permisos actual y la política de permisos propuesta. Si el intento de repetición no se realiza correctamente, el resultado de la repetición contendrá un campo error con una descripción del error. Para obtener más información sobre los errores de simulación, consulta Errores en esta página.

Cada diferencia de acceso tiene los siguientes componentes:

  • baseline: Es el resultado de acceso cuando se usa la política de permisos actual. Esto se informa 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 enumerará los errores asociados con la información desconocida, así como las políticas de permisos asociadas con ese error. Para obtener más información sobre los valores UNKNOWN, consulta Resultados desconocidos en esta página.
  • simulated: Es el resultado de acceso cuando se usa la política de permisos propuesta. Esto se informa 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 enumerará los errores asociados con la información desconocida, así como las políticas de permisos asociadas con ese error. Para obtener más información sobre los valores UNKNOWN, consulta Resultados desconocidos en esta página.
  • accessChange: Es el cambio entre el estado de acceso del modelo de referencia y el estado de acceso simulado. Consulta la siguiente tabla para obtener una lista de valores posibles:

    Cambio de acceso Detalles
    ACCESS_REVOKED La principal tenía acceso con la política de permisos actual, pero ya no tendrá acceso después del cambio propuesto.
    ACCESS_MAYBE_REVOKED

    Esto puede suceder por los siguientes motivos:

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

    Esto puede suceder por los siguientes motivos:

    • La principal no tenía acceso según la política de permisos actual, pero su acceso después del cambio propuesto es desconocido.
    • El acceso de la principal con la política de permisos actual es desconocido, pero tendrá acceso después del cambio propuesto.
    UNKNOWN_CHANGE El acceso de la principal tanto con la política de permisos actual como con la política de permisos propuesta es desconocido, y los cambios propuestos pueden afectar el acceso de la principal.

Resultados desconocidos

Si un resultado de acceso es desconocido, significa que el simulador de política no tiene suficiente información para evaluar por completo el intento de acceso.

Consola

Si un resultado de acceso es desconocido, el panel de detalles de cambio de acceso informa el motivo por el que se desconoce, además de las políticas de permisos, las membresías de grupo, las condiciones y los roles específicos que no pudo evaluar o a los que no pudo acceder.

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

  • Información del rol rechazado: la principal que ejecuta la simulación no tuvo permiso para ver los detalles de una o más de las funciones que se simularon.
  • No se pudo acceder a la política: la principal que ejecuta la simulación no tuvo permiso para obtener la política de permisos de uno o más de los recursos involucrados en ella.
  • Información de la membresía rechazada: la principal que ejecuta la simulación no tuvo permiso para ver los miembros de uno o más de los grupos incluidos en la política de permisos propuesta.
  • Condición no admitida: Hay una vinculación de rol condicional en la política de permisos que se probó. Policy Simulator no admite condiciones, por lo que la vinculación no se pudo evaluar.

gcloud

En la CLI de gcloud, los resultados de la simulación informarán el motivo por el que se desconoce el resultado 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 a fin de evaluar el estado del acceso. Esto puede suceder por cualquiera de los siguientes motivos:

    • El usuario no tiene permiso para recuperar la política de permisos que se está simulando ni tiene permiso para recuperar políticas de permisos de los recursos en los registros de acceso.
    • El usuario no tiene permiso para ver una membresía del grupo.
    • El usuario no puede recuperar la información de la función necesaria.

    Para saber qué información faltaba, consulta la información de error después del estado de acceso informado.

  • UNKNOWN_CONDITIONAL: Hay una vinculación de rol condicional en la política que se prueba. Policy Simulator no admite condiciones, por lo que la vinculación no se pudo evaluar.

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

REST

En la API de REST, los resultados de la simulación informarán el motivo por el que se desconoce el resultado 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 a fin de evaluar el estado del acceso. Esto puede suceder por cualquiera de los siguientes motivos:

    • El usuario no tiene permiso para recuperar la política de permisos que se está simulando ni tiene permiso para recuperar políticas de permisos de los recursos en los registros de acceso.
    • El usuario no tiene permiso para ver una membresía del grupo.
    • El usuario no puede recuperar la información de la función necesaria.

    Para saber qué información faltaba, consulta la información de error después del estado de acceso informado.

  • UNKNOWN_CONDITIONAL: Hay una vinculación de rol condicional en la política que se prueba. Policy Simulator no admite condiciones, por lo que la vinculación no se pudo evaluar.

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

Errores

El simulador de política también informa los errores que se produjeron durante la simulación. Es importante revisar estos errores para comprender las posibles brechas en la simulación.

Consola

Existen diversos tipos de errores que el simulador de política puede informar:

  • Errores de operación: La simulación no se pudo ejecutar. Policy Simulator informa los errores de operaciones en la parte superior de la página de resultados.

    Si el mensaje de error indica que la simulación no se pudo ejecutar porque hay demasiados registros en tu organización o proyecto, no puedes ejecutar una simulación en el recurso.

    Si aparece este error por otro motivo, intenta ejecutar la simulación nuevamente. Si aún no puedes ejecutar la simulación, envía un correo electrónico a policy-simulator-feedback@google.com.

  • Errores de repetición: La repetición de un único intento de acceso no fue exitosa, por lo que Policy Simulatorno pudo determinar si el resultado del intento de acceso cambiaría con la política de permisos propuesta.

    La consola de Google Cloud muestra los errores de repetición en la tabla Cambios de acceso en los últimos 90 días. En el panel Detalles de cambio de acceso para cada error, se incluye un mensaje de error que te ayudará a comprender el problema, así como el recurso y el permiso que se simularon cuando se produjo el error.

  • Errores de tipos de recursos no admitidos: la política de permisos propuesta afecta los permisos asociados a un tipo de recurso no admitido que Policy Simulator no puede simular.

    El simulador de política enumera estos permisos en los resultados de la simulación para que sepas qué permisos no pudo simular.

gcloud

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

  • El campo replayResult.error: Si el intento de repetición no se realizó de forma correcta, Policy Simulator informa el error en el campo replayResult.error. Si el resultado de una repetición contiene este campo, no habrá un campo diff.
  • El campo replayResult.diff.accessDiff.policy-type.errors, en el que policy-type es baseline o simulated. Si el intento de repetición se realizó de forma correcta, pero el resultado fue UNKNOWN_INFO_DENIED o UNKNOWN_CONDITIONAL, el simulador de políticas informa el motivo por el que se desconoce el resultado en este campo.

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

Error Código de error Detalles
GENERIC_INTERNAL_ERROR 13 La simulación falló debido a un error interno. Para resolverlo, vuelve a ejecutar la simulación. Si la simulación aún falla, comunícate con policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 Policy Simulator no pudo volver a reproducir el intento de acceso porque contenía un permiso, un nombre de recurso o una principal no válidos.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 El simulador de políticas no pudo evaluar la membresía del principal en el grupo, ya que este tiene demasiados subgrupos. Este error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 El simulador de políticas no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para ver la membresía del grupo. Este error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar una política de permisos. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar los permisos en una función de IAM. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar la política de permisos de un recurso principal. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 La tupla de acceso contiene un tipo de principal que el simulador de políticas no admite.
UNIMPLEMENTED_MEMBER 12 La tupla de acceso contiene una principal que el simulador de políticas no admite.
UNIMPLEMENTED_CONDITION 12 La tupla de acceso contiene una condición que el Policy Simulator no admite. Este tipo de error está asociado con los cambios de acceso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 El recurso está asociado con demasiados registros de acceso, por lo que Policy Simulator no pudo ejecutar la simulación. Para obtener más información, consulta Tamaño máximo de la repetición de registros en la página de conceptos dePolicy Simulatoras.
UNSUPPORTED_RESOURCE 12

La política de permisos propuesta cambia los permisos asociados con tipos de recursos no compatibles. Este error aparece en el campo replayResult.error y contiene una lista de los permisos asociados con los tipos de recursos no compatibles. 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"
}

A fin de obtener más información sobre los tipos de recursos no compatibles, consulta Niveles de compatibilidad de los tipos de recursos en la página de conceptos de Policy Simulator.

REST

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

  • El campo replayResult.error: Si el intento de repetición no se realizó de forma correcta, Policy Simulator informa el error en el campo replayResult.error. Si el resultado de una repetición contiene este campo, no habrá un campo diff.
  • El campo replayResult.diff.accessDiff.policy-type.errors, en el que policy-type es baseline o simulated. Si el intento de repetición se realizó de forma correcta, pero el resultado fue UNKNOWN_INFO_DENIED o UNKNOWN_CONDITIONAL, el simulador de políticas informa el motivo por el que se desconoce el resultado en este campo.

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

Error Código de error Detalles
GENERIC_INTERNAL_ERROR 13 La simulación falló debido a un error interno. Para resolverlo, vuelve a ejecutar la simulación. Si la simulación aún falla, comunícate con policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 Policy Simulator no pudo volver a reproducir el intento de acceso porque contenía un permiso, un nombre de recurso o una principal no válidos.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 El simulador de políticas no pudo evaluar la membresía del principal en el grupo, ya que este tiene demasiados subgrupos. Este error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 El simulador de políticas no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para ver la membresía del grupo. Este error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar una política de permisos. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar los permisos en una función de IAM. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 Policy Simulator no pudo evaluar el acceso de un usuario porque el emisor no tiene permiso para recuperar la política de permisos de un recurso principal. Este tipo de error está asociado con los cambios de acceso UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 La tupla de acceso contiene un tipo de principal que el simulador de políticas no admite.
UNIMPLEMENTED_MEMBER 12 La tupla de acceso contiene una principal que el simulador de políticas no admite.
UNIMPLEMENTED_CONDITION 12 La tupla de acceso contiene una condición que el Policy Simulator no admite. Este tipo de error está asociado con los cambios de acceso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 El recurso está asociado con demasiados registros de acceso, por lo que Policy Simulator no pudo ejecutar la simulación. Para obtener más información, consulta Tamaño máximo de la repetición de registros en la página de conceptos dePolicy Simulatoras.
UNSUPPORTED_RESOURCE 12

La política de permisos propuesta cambia los permisos asociados con tipos de recursos no compatibles. Este error aparece en el campo replayResult.error y contiene una lista de los permisos asociados con los tipos de recursos no compatibles. 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"
}

A fin de obtener más información sobre los tipos de recursos no compatibles, consulta Niveles de compatibilidad de los tipos de recursos en la página de conceptos de Policy Simulator.

Aplica un cambio de política simulado

Para aplicar un cambio simulado a una política de permisos, 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 contiene la política de permisos simulada que deseas aplicar:

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

Ingresa los siguientes valores:

  • resource-type: Es el tipo de recurso cuya política de permisos deseas actualizar. Por ejemplo, projects
  • resource-id: El ID del recurso cuya política de permisos deseas actualizar. Por ejemplo, my-project
  • filepath: La ruta al archivo que contiene la política de permisos actualizada.

La respuesta contiene la política de permisos actualizada. Si tratas a las políticas de permisos de IAM como código y las almacenas en un sistema de control de versión, debes almacenar la política de permisos que muestra la CLI de gcloud, no el archivo JSON que contiene la política de permisos simulada.

REST

Configura la política de permisos propuesta como la nueva política de permisos del recurso.

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

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

  • PROJECT_ID: El ID del proyecto de Google Cloud Los ID de proyecto son strings alfanuméricas, como my-project.
  • POLICY: Una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta la Referencia de políticas.

HTTP method and URL:

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

Cuerpo JSON de la solicitud:

{
  "policy": {
    POLICY
  }
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene la política de permisos actualizada:


Guarda 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.

Guarda como JSON o YAML

Para guardar los resultados de una simulación como un archivo JSON o YAML, agrega la siguiente marca al comando replay-recent-access cuando ejecutes la simulación:

--output=output-format > filename

Reemplaza los siguientes valores:

  • output-format: El idioma del archivo exportado, ya sea json o yaml.
  • filename: Es el nombre para el archivo exportado.

Guarda como CSV

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

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

Reemplaza los siguientes valores:

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

De forma opcional, puedes agregar campos adicionales, como errors[], a la marca --flatten. Agregar campos a la marca --flatten permite que los elementos de esos campos se enumeren en líneas separadas en el archivo CSV.

El siguiente es un ejemplo de un comando replay-recent-access que guarda los campos más importantes de los resultados de la simulación como 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 del modelo de referencia y estado de acceso simulado.

Para obtener más información sobre cómo dar formato con gcloud CLI, consulta formatos.

¿Qué sigue?