Testar mudanças de papel com o simulador de políticas

Nesta página, descrevemos como simular uma alteração em uma política de permissão usando o Simulador de política. Ela também explica como interpretar os resultados da simulação e como aplicar a política de permissão simulada se escolher fazer isso.

Antes de começar

Permissões necessárias

Antes de simular uma alteração em uma política de permissão, verifique se você tem as permissões apropriadas. Algumas permissões são necessárias para executar uma simulação. Outras não são necessárias, mas ajudam a conseguir resultados mais completos da simulação.

Para saber mais sobre os papéis do Identity and Access Management (IAM), consulte Noções básicas sobre papéis.

Permissões de recurso de destino necessárias

O recurso de destino da simulação é o recurso com as políticas de permissão que você está simulando.

Para conseguir as permissões necessárias para executar uma simulação, peça ao administrador para conceder a você os seguintes papéis do IAM no recurso de destino:

  • Administrador do simulador (roles/policysimulator.admin)
  • Avaliador de segurança (roles/iam.securityReviewer)

Para mais informações sobre como conceder papéis, consulte Gerenciar o acesso.

Esses papéis predefinidos têm as permissões necessárias para executar uma simulação. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

  • cloudassets.assets.searchAllResources
  • policysimulator.replays.run
  • service.resource.getIamPolicy, em que resource é o tipo do recurso de destino e service é o nome do serviço do Google Cloud proprietário desse recurso.

Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.

Permissões necessárias do recurso host

O recurso host de uma simulação é o projeto, a pasta ou a organização que cria e executa a simulação. O recurso host não precisa estar relacionado ao recurso de destino.

A maneira como você define o recurso host depende da plataforma que você está usando.

Console

O recurso host é o projeto, a pasta ou a organização que aparece no seletor de recursos.

Para alterar o recurso host, escolha um projeto, uma pasta ou uma organização diferente no seletor de recursos.

gcloud

O recurso host é o projeto de cota atual. Para definir o projeto de cota, use o comando gcloud auth application-default set-quota-project.

REST

Você especifica manualmente o recurso host sempre que envia uma solicitação. Consulte Como simular uma alteração de política nesta página para mais detalhes.

Para receber as permissões necessárias para executar uma simulação, peça ao administrador que conceda a você o papel de administrador do simulador (roles/policysimulator.admin) no recurso host. Para mais informações sobre como conceder papéis, consulte Gerenciar o acesso.

Esse papel predefinido contém as permissões necessárias para executar uma simulação. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

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

Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.

Para ter os resultados mais completos de uma simulação, recomendamos que você tenha determinadas permissões do IAM e do Google Workspace. Se você não tiver algumas ou todas essas permissões, ainda poderá executar uma simulação. No entanto, executar uma simulação sem essas permissões pode resultar em um número maior de alterações de acesso desconhecidas, porque talvez não seja possível recuperar informações que possam afetar os resultados da simulação.

Recomendamos que você tenha o papel Revisor de segurança (roles/iam.securityReviewer) para a organização ao executar uma simulação. Como alternativa, se você já tiver o papel Administrador de segurança (roles/iam.securityAdmin), não precisará receber outros papéis.

Esses papéis fornecem as seguintes permissões, que ajudam você a conseguir os resultados mais completos da simulação:

  • iam.roles.get e iam.roles.list em todos os projetos, pastas ou organizações relevantes em que os papéis personalizados estão definidos. Um projeto, pasta ou organização é relevante se for um ancestral ou descendente do recurso cuja política de permissão você está simulando.
  • service.resource.getIamPolicy, em que resource é o nome de um tipo de recurso que pode ter uma política de permissão e service é o nome do serviço do Google Cloud proprietário desse recurso.

    Ao executar uma simulação, recomendamos que você tenha essa permissão em cada recurso que atenda a estes critérios:

    Por exemplo, imagine que você quer simular uma política de permissão para um projeto. Se os registros de acesso incluírem uma tentativa de acesso a um bucket do Cloud Storage no projeto, você precisa da permissão storage.buckets.getIamPolicy nesse bucket. Se o projeto tiver uma pasta pai com uma política de permissão, você também precisará da permissão resourcemanager.folders.getIamPolicy nessa pasta.

Recomendamos que você tenha permissão para recuperar informações de associação ao grupo para cada grupo do Google na política de permissão original e na política de permissão proposta.

Os superadministradores e administradores de grupo do Google Workspace geralmente têm acesso para visualizar a associação ao grupo. Se você não for um superadministrador ou administrador de grupo, peça ao administrador do Google Workspace para criar um papel personalizado de administrador do Google Workspace que contenha o privilégio groups.read (localizado em Privilégios da API Admin) e concedê-lo a você. Isso permite que você veja a associação de todos os grupos no seu domínio e simule alterações de maneira mais eficaz em uma política de permissão.

Simular uma alteração de política

Simule uma alteração em uma política de permissão seguindo estas etapas.

Console

Veja no exemplo a seguir como simular uma alteração em uma política de permissão para um projeto. No entanto, você pode simular uma alteração em uma política de permissão para qualquer recurso com essa política.

Edite as permissões de um principal e, em vez de clicar em Salvar, clique em Testar alterações:

  1. No console, acesse a página IAM.

    Acessar a página IAM

  2. Crie uma alteração proposta na política de permissão editando as permissões de um principal existente:

    1. Localize o participante com o acesso que você quer editar e clique no botão Editar à direita.
    2. Para editar o acesso do participante, adicione um novo papel ou revogue ou altere um papel.
  3. Para simular a alteração proposta, clique em Testar alterações.

  4. Após alguns minutos, o console exibirá os resultados da simulação como uma lista de mudanças de acesso. Consulte Noções básicas sobre os resultados do Simulador de política nesta página para mais informações.

    Se não houver alteração no acesso entre a política de permissões existente e a política de permissão simulada, o console não exibirá nenhuma mudança de acesso.

gcloud

Para simular uma alteração em uma política de permissão, siga o padrão read-modify-write, mas simule a política de permissão em vez de gravá-la.

  1. Leia a política de permissão atual executando o seguinte comando:

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

    Substitua os seguintes valores:

    • resource-type: o tipo de recurso para o qual você quer simular uma política de permissão. Por exemplo, projects.
    • resource-id: o ID do recurso com a política de permissão que você quer simular. Por exemplo, my-project.
    • format: o valor JSON ou YAML.
    • filepath: o caminho para um novo arquivo de saída para a política de permissão.

    Por exemplo, o comando a seguir recebe a política de permissão do projeto my-project no formato JSON e a salva no diretório inicial do usuário:

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json
    
  2. Modifique a política de permissão JSON ou YAML retornada pelo comando get-iam-policy para refletir as alterações que você quer simular.

    Há vários tipos de alteração que podem ser feitos na política de permissão. Por exemplo, é possível adicionar ou remover um principal de uma vinculação de papel ou remover uma vinculação de papel da política de permissão.

  3. Execute o seguinte comando para simular a alteração na política de permissão:

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

    Substitua os seguintes valores:

    • full-resource-name: o nome completo do recurso cuja política de permissão você quer simular.

      O nome completo do recurso é um URI que consiste no nome do serviço e no caminho para o recurso. Por exemplo, se você estiver simulando uma política de permissão para um projeto, use //cloudresourcemanager.googleapis.com/projects/project- id, em que project-id é o ID do projeto cuja política de permissão você está simulando.

      Para uma lista de formatos de nome de recurso completos, consulte Nomes de recursos completos.

    • filepath: o caminho para o arquivo que contém a política de permissão modificada que você quer simular. Por exemplo, ~/proposed_policy.json.

    • format: o formato da resposta. Por exemplo, json ou yaml.

    Após alguns minutos, o comando imprime uma lista de resultados de reprodução, explicando como o acesso do principal mudaria se a política de permissão proposta fosse aplicada. Esses resultados também listam todos os erros que ocorreram durante a simulação, incluindo todos os erros devido a tipos de recursos incompatíveis.

    Consulte Noções básicas sobre os resultados do Simulador de política nesta página para saber como ler os resultados. Para saber como salvar os resultados da simulação em vez de imprimi-los, consulte Como salvar resultados da simulação.

    Veja a seguir um exemplo de resposta para uma simulação de política de permissão que envolve o usuário my-user@example.com. Nesse caso, se a alteração proposta fosse aplicada, my-user@example.com provavelmente não teria mais as permissões resourcemanager.projects.list e resourcemanager.projects.get para o projeto my-project e certamente não teria mais a permissão resourcemanager.projects.update para o projeto 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."
        }
      }
    ]
    

    Se não houver alteração no acesso entre a política de permissão existente e a simulada, o comando imprimirá No access changes found in the replay.

REST

Para simular uma alteração em uma política de permissão, siga o padrão read-modify-write. Em vez de gravar a política de permissão, crie e execute uma simulação.

  1. Leia a política de permissão para o recurso.

    Para ver a política de permissão de um projeto, use o método projects.getIamPolicy da API Resource Manager.

    Antes de usar qualquer um dos dados da solicitação, faça as seguintes substituições:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

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

    Corpo JSON da solicitação:

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

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

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

  2. Modifique a política de permissão retornada para refletir as alterações que você quer simular.

    Há vários tipos de alteração que podem ser feitos na política de permissão. Por exemplo, é possível adicionar ou remover um principal de uma vinculação de papel ou remover uma vinculação de papel da política de permissão.

  3. Crie uma simulação ou Reproduza com a política de permissão modificada.

    Para criar uma nova reprodução de um projeto, pasta ou organização, use o método replays.create da API Policy Simulator.

    Antes de usar qualquer um dos dados da solicitação, faça as seguintes substituições:

    • host-resource-type: o tipo do recurso que hospedará a reprodução. Esse valor precisa ser projects, folders ou organizations.
    • host-resource-id: o ID do recurso host, por exemplo, my-project.
    • target-full-resource-name: o nome completo do recurso cuja política você quer simular. Esse recurso pode ser qualquer recurso que aceite políticas do IAM e não precisa estar relacionado ao recurso host de nenhuma forma.

      O nome completo do recurso é um URI que consiste no nome do serviço e no caminho para o recurso. Por exemplo, se você estiver simulando uma política para um projeto, use //cloudresourcemanager.googleapis.com/projects/project- id, em que project-id é o ID do projeto cuja política você está simulando.

      Para uma lista completa de formatos de nome de recurso, consulte Nomes de recursos completos.

    • policy: a política que você quer simular. Para ver um exemplo de política, consulte a referência da política.

      Para simular várias políticas, inclua vários pares "object-full-resource-name" : policy no corpo da solicitação.

    Método HTTP e URL:

    POST https://policysimulator.googleapis.com/v1/host-resource-type/host-resource-id/locations/global/replays

    Corpo JSON da solicitação:

    {
      "config": {
        "policyOverlay": {
          "target-full-resource-name" : policy
        }
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém o nome de uma operação que representa a reprodução:

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

  4. Pesquise o método operations.get até que a reprodução seja concluída.

    Para pesquisar uma operação, recomendamos que você invoque repetidamente o método operations.get até que a resposta inclua os campos "done": true e name com o nome da repetição concluída. Use a espera exponencial truncada para introduzir um atraso entre cada solicitação.

    Para ver o estado de uma nova reprodução, use o método operations.get da API Policy Simulator.

    Antes de usar qualquer um dos dados da solicitação, faça as seguintes substituições:

    • operation-name: o nome de uma operação de reprodução, incluindo o prefixo operations. Copie esse valor do campo name de uma resposta replays.create. Por exemplo: operations/6de23e63-f61a-4b8c-b502-34d717d2d7f8

    Método HTTP e URL:

    GET https://policysimulator.googleapis.com/v1/operation-name

    Para enviar a solicitação, expanda uma destas opções:

    As operações em andamento retornam uma resposta como esta:

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

    As operações concluídas retornam uma resposta como esta:

    {
      "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. Veja os resultados da reprodução.

    Para ver os resultados de uma repetição, use o método replays.results.list da API Policy Simulator.

    Antes de usar qualquer um dos dados da solicitação, faça as seguintes substituições:

    • replay-name: o nome da reprodução para a qual você quer recuperar resultados. Copie esse valor no campo response.replay.name de uma resposta operations.get. Inclua qualquer tipo de recurso e prefixos de local. Por exemplo, "projects/my-project/locations/global/replays/89ab4892-9605-4c84-aedb-4fce4fc5195b"
    • page-size: opcional. O número máximo de resultados a serem retornados a partir dessa solicitação. Se não especificado, o servidor determinará o número de resultados a serem retornados. Se o número de resultados for maior do que o tamanho da página, a resposta conterá um token de paginação que é possível usar para recuperar a próxima página de resultados.
    • page-token: opcional. O token de paginação retornado em uma resposta anterior desse método. Se especificada, a lista de resultados começará onde a solicitação anterior foi finalizada.

    Método HTTP e URL:

    GET https://policysimulator.googleapis.com/v1/replay-name/results?pageSize=page-size&pageToken=page-token

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém uma lista de resultados que explicam como o acesso do participante seria alterado se a política proposta fosse aplicada. Esses resultados também listam todos os erros que ocorreram durante a simulação, particularmente os erros devido a tipos de recursos incompatíveis.

    Consulte Noções básicas sobre resultados do Simulador de política nesta página para saber como ler os resultados.

    Veja a seguir um exemplo de resposta para uma simulação de política que envolve o usuário my-user@example.com. Nesse caso, se a alteração proposta fosse aplicada, my-user@example.com provavelmente não teria mais as permissões resourcemanager.projects.list e resourcemanager.projects.get para o projeto my-project e certamente não teria mais a permissão resourcemanager.projects.update para o projeto 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"
    }
    

    Se não houve alteração no acesso entre a política de permissão existente e a política simulada, a solicitação retornará uma lista vazia ({}).

Entender os resultados do Simulador de políticas

O Simulador de política informa o impacto de uma alteração proposta a uma política de permissão como uma lista de alterações de acesso. Cada alteração de acesso representa uma tentativa de acesso nos últimos 90 dias que teria um resultado diferente na política de permissão proposta em relação à política de permissão atual.

O simulador de política também lista todos os erros que ocorreram durante a simulação, o que ajuda a identificar possíveis lacunas na simulação.

A apresentação dessas alterações e erros depende da plataforma que você está usando.

Console

A página de resultados do Simulador de política exibe os resultados da simulação em várias seções diferentes:

  • Alterações na política: nessa seção, há uma lista dos recursos com a política de permissão para a qual você está sugerindo alterações, os papéis que você quer remover e os papéis que você quer adicionar.

    Esta seção também contém um botão Ver diferença de política. Se você clicar nesse botão, poderá ver a aparência da política de permissão do recurso antes e depois das alterações propostas.

  • Alterações de permissão: essa seção contém contagens de permissões removidas e adicionadas, que descrevem como as permissões do principal mudariam se você aplicasse as alterações propostas. Essas contagens de permissões são calculadas pela comparação das permissões nos papéis atuais do principal com as permissões nos papéis propostos dele, ignorando os papéis herdados.

    Esta seção também contém um botão Visualizar diferença de permissões. Se você clicar nesse botão, será possível ver uma comparação lado a lado das permissões nos papéis atuais e propostos pelo principal.

  • Alterações de acesso nos últimos 90 dias: esta seção mostra quais tentativas de acesso dos últimos 90 dias têm resultados diferentes de acordo com a política de permissão proposta e a atual. Esta seção inclui um resumo das alterações de acesso e uma tabela com resultados mais detalhados.

    O resumo das alterações de acesso lista o número de cada tipo de alteração, o número de erros e de resultados desconhecidos e o número de tentativas de acesso que têm o mesmo resultado de acordo com a política de permissão proposta e a atual. O resumo também mostra quantas permissões não puderam ser simuladas. Para mais informações, consulte a seção Erros nesta página.

    Esta seção também contém uma tabela de alterações de acesso. Esta tabela lista cada tentativa de acesso dos últimos 90 dias que teve um resultado diferente de acordo com a política de permissão proposta e a atual. Cada entrada inclui o recurso que o principal estava tentando acessar, a data da solicitação, o principal que fez a solicitação, a permissão na solicitação e o status de acesso de acordo com a política de permissão proposta em comparação com o status de acesso de acordo com a política de permissão atual.

    Existem vários tipos diferentes de acesso:

    Mudança de acesso Detalhes
    Acesso revogado O principal tinha acesso à política de permissão atual, mas não terá mais acesso após a alteração proposta.
    Acesso potencialmente revogado

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal tinha acesso à política de permissão atual, mas o acesso à política de permissão proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas ele não terá acesso após a alteração proposta.
    Acesso recebido O principal não tinha acesso à política de permissão atual, mas terá acesso após a alteração proposta.
    Acesso potencialmente recebido

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal não tinha acesso de acordo com a política de permissão atual, mas o acesso dele após a alteração proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas terá acesso após a alteração proposta.
    Acesso desconhecido O acesso do principal à política de permissão atual e à política de permissão proposta é desconhecido, e as alterações propostas podem afetar o acesso do principal.
    Erro Ocorreu um erro durante a simulação.

    Para mais detalhes sobre uma alteração de acesso, clique nela. Isso abrirá o painel Detalhes da alteração de acesso, que exibe mais informações sobre a alteração, incluindo o acesso atual do participante, o acesso proposto do participante e detalhes adicionais sobre o resultado da alteração de acesso.

gcloud

Ao usar o comando replay-recent-access, a resposta da CLI gcloud contém uma lista de replayResults.

Cada resultado de reprodução descreve uma tentativa de acesso que teria tido um resultado diferente se a política de permissão proposta tivesse sido aplicada no momento da tentativa. Por exemplo, o resultado de reprodução a seguir mostra que my-user@example.com usou a permissão resourcemanager.projects.update no passado para executar uma ação no projeto my-project. No entanto, se a política de permissão proposta estivesse em vigor, o acesso a ela teria sido negado.

{
  "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 reprodução tem os seguintes campos:

  • accessTuple: a tentativa de acesso relacionada ao resultado. Esse campo inclui o recurso, a permissão e o participante envolvidos na tentativa de acesso.

  • lastSeenDate: a data em que a tentativa de acesso foi feita pela última vez.

  • diff.accessDiff ou error: se a reprodução de uma tentativa de acesso for bem-sucedida, o resultado conterá um campo diff.accessDiff que informa a diferença entre os resultados da tentativa de acesso à política de permissão atual e à política de permissão proposta. Se a tentativa de reprodução não for bem-sucedida, o resultado da reprodução conterá um campo error com uma descrição do erro. Para saber mais sobre erros de simulação, consulte Erros nesta página.

Cada diferença de acesso tem os seguintes componentes:

  • baseline: o resultado do acesso ao usar a política de permissão atual. Isso é informado como um dos seguintes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED. Se o resultado for UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED, a resposta também listará todos os erros associados às informações desconhecidas, bem como as políticas de permissão associadas a esse erro. Para mais informações sobre valores UNKNOWN, consulte Resultados desconhecidos nesta página.
  • simulated: o resultado do acesso ao usar a política de permissão proposta. Isso é informado como um dos seguintes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED. Se o resultado for UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED, a resposta também listará todos os erros associados às informações desconhecidas, bem como as políticas de permissão associadas a esse erro. Para mais informações sobre valores UNKNOWN, consulte Resultados desconhecidos nesta página.
  • accessChange: a alteração entre o estado de acesso de referência e o estado de acesso simulado. Consulte a tabela a seguir para ver uma lista de possíveis valores:

    Mudança de acesso Detalhes
    ACCESS_REVOKED O principal tinha acesso à política de permissão atual, mas não terá mais acesso após a alteração proposta.
    ACCESS_MAYBE_REVOKED

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal tinha acesso à política de permissão atual, mas o acesso à política de permissão proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas ele não terá acesso após a alteração proposta.
    ACCESS_GAINED O principal não tinha acesso à política de permissão atual, mas terá acesso após a alteração proposta.
    ACCESS_MAYBE_GAINED

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal não tinha acesso de acordo com a política de permissão atual, mas o acesso dele após a alteração proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas terá acesso após a alteração proposta.
    UNKNOWN_CHANGE O acesso do principal à política de permissão atual e à política de permissão proposta é desconhecido, e as alterações propostas podem afetar o acesso do principal.

REST

Quando você chama o método replays.results.list, a resposta contém uma lista de replayResults.

Cada resultado de reprodução descreve uma tentativa de acesso que teria tido um resultado diferente se a política de permissão proposta tivesse sido aplicada no momento da tentativa. Por exemplo, o resultado de reprodução a seguir mostra que my-user@example.com usou a permissão resourcemanager.projects.update no passado para executar uma ação no projeto my-project. No entanto, se a política de permissão proposta estivesse em vigor, o acesso a ela teria sido negado.

{
  "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 reprodução tem os seguintes campos:

  • accessTuple: a tentativa de acesso relacionada ao resultado. Esse campo inclui o recurso, a permissão e o participante envolvidos na tentativa de acesso.

  • lastSeenDate: a data em que a tentativa de acesso foi feita pela última vez.

  • diff.accessDiff ou error: se a reprodução de uma tentativa de acesso for bem-sucedida, o resultado conterá um campo diff.accessDiff que informa a diferença entre os resultados da tentativa de acesso à política de permissão atual e à política de permissão proposta. Se a tentativa de reprodução não for bem-sucedida, o resultado da reprodução conterá um campo error com uma descrição do erro. Para saber mais sobre erros de simulação, consulte Erros nesta página.

Cada diferença de acesso tem os seguintes componentes:

  • baseline: o resultado do acesso ao usar a política de permissão atual. Isso é informado como um dos seguintes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED. Se o resultado for UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED, a resposta também listará todos os erros associados às informações desconhecidas, bem como as políticas de permissão associadas a esse erro. Para mais informações sobre valores UNKNOWN, consulte Resultados desconhecidos nesta página.
  • simulated: o resultado do acesso ao usar a política de permissão proposta. Isso é informado como um dos seguintes valores: GRANTED, NOT_GRANTED, UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED. Se o resultado for UNKNOWN_CONDITIONAL ou UNKNOWN_INFO_DENIED, a resposta também listará todos os erros associados às informações desconhecidas, bem como as políticas de permissão associadas a esse erro. Para mais informações sobre valores UNKNOWN, consulte Resultados desconhecidos nesta página.
  • accessChange: a alteração entre o estado de acesso de referência e o estado de acesso simulado. Consulte a tabela a seguir para ver uma lista de possíveis valores:

    Mudança de acesso Detalhes
    ACCESS_REVOKED O principal tinha acesso à política de permissão atual, mas não terá mais acesso após a alteração proposta.
    ACCESS_MAYBE_REVOKED

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal tinha acesso à política de permissão atual, mas o acesso à política de permissão proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas ele não terá acesso após a alteração proposta.
    ACCESS_GAINED O principal não tinha acesso à política de permissão atual, mas terá acesso após a alteração proposta.
    ACCESS_MAYBE_GAINED

    Este problema pode ocorrer pelos seguintes motivos:

    • O principal não tinha acesso de acordo com a política de permissão atual, mas o acesso dele após a alteração proposta é desconhecido.
    • O acesso do principal à política de permissão atual é desconhecido, mas terá acesso após a alteração proposta.
    UNKNOWN_CHANGE O acesso do principal à política de permissão atual e à política de permissão proposta é desconhecido, e as alterações propostas podem afetar o acesso do principal.

Resultados desconhecidos

Se um resultado de acesso for desconhecido, isso significa que o simulador de políticas não tinha informações suficientes para avaliar completamente a tentativa de acesso.

Console

Se um resultado de acesso for desconhecido, o painel de detalhes da alteração de acesso informará o motivo do desconhecimento, além dos papéis, políticas de permissão, associações a grupos e condições específicos pelos quais não foi possível acessar ou avaliar.

Um resultado pode ser desconhecido por vários motivos:

  • Informações do papel negadas: o principal que executa a simulação não tinha permissão para ver os detalhes de um ou mais papéis sendo simulados.
  • Não foi possível acessar a política: o principal que executa a simulação não tinha permissão para acessar a política de permissão de um ou mais dos recursos envolvidos na simulação.
  • Informações de associação negadas: o principal que executa a simulação não tinha permissão para visualizar os membros de um ou mais grupos incluídos na política de permissão proposta.
  • Condição não compatível: há uma vinculação de papel condicional na política de permissão que está sendo testada. O Simulador de política não é compatível com condições, por isso a vinculação não foi avaliada.

gcloud

Na CLI gcloud, os resultados da simulação informarão o motivo pelo qual o resultado é desconhecido na diferença de acesso.

O motivo pelo qual o resultado de acesso é desconhecido será um dos seguintes:

  • UNKNOWN_INFO_DENIED: o usuário não tem permissão para acessar as informações necessárias para avaliar o estado de acesso. Isso pode acontecer por um dos seguintes motivos:

    • O usuário não tem permissão para recuperar a política de permissão que está sendo simulada ou não tem permissão para recuperar políticas de permissão para recursos nos registros de acesso.
    • O usuário não tem permissão para ver em uma associação ao grupo.
    • O usuário não pode recuperar as informações necessárias do papel.

    Para saber quais informações estavam faltando, consulte as informações de erro após o estado de acesso relatado.

  • UNKNOWN_CONDITIONAL: há uma vinculação de papel condicional na política de permissão que está sendo testada. O Simulador de política não é compatível com condições, por isso a vinculação não foi avaliada.

Se o resultado for desconhecido, o campo da política de permissão (baseline ou simulated) conterá um campo errors que descreve por que as informações eram desconhecidas, e um campo policies que lista as políticas de permissão associadas aos erros. Para mais informações sobre erros, consulte Erros nesta página.

REST

Na API REST, os resultados da simulação informarão o motivo pelo qual o resultado é desconhecido na diferença de acesso.

O motivo pelo qual o resultado de acesso é desconhecido será um dos seguintes:

  • UNKNOWN_INFO_DENIED: o usuário não tem permissão para acessar as informações necessárias para avaliar o estado de acesso. Isso pode acontecer por um dos seguintes motivos:

    • O usuário não tem permissão para recuperar a política de permissão que está sendo simulada ou não tem permissão para recuperar políticas de permissão para recursos nos registros de acesso.
    • O usuário não tem permissão para ver em uma associação ao grupo.
    • O usuário não pode recuperar as informações necessárias do papel.

    Para saber quais informações estavam faltando, consulte as informações de erro após o estado de acesso relatado.

  • UNKNOWN_CONDITIONAL: há uma vinculação de papel condicional na política de permissão que está sendo testada. O Simulador de política não é compatível com condições, por isso a vinculação não foi avaliada.

Se o resultado for desconhecido, o campo da política de permissão (baseline ou simulated) conterá um campo errors que descreve por que as informações eram desconhecidas, e um campo policies que lista as políticas de permissão associadas aos erros. Para mais informações sobre erros, consulte Erros nesta página.

Erros

O Simulador de políticas também informa todos os erros que ocorreram durante a simulação. É importante analisar esses erros para entender as possíveis lacunas na simulação.

Console

Há vários tipos de erros que o simulador de políticas pode informar:

  • Erros de operação: não foi possível executar a simulação. O Simulador de política informa erros de operação na parte superior da página de resultados.

    Se a mensagem de erro informar que a simulação não foi executada porque há muitos registros no projeto ou na organização, não será possível executar uma simulação no recurso.

    Se você vir esse erro por outro motivo, tente executar a simulação novamente. Se você ainda não conseguir executar a simulação, entre em contato com policy-simulator-feedback@google.com.

  • Erros de repetição: a repetição de uma única tentativa de acesso não foi bem-sucedida. Por isso, o Simulador de política não conseguiu determinar se o resultado da tentativa de acesso seria alterado na política de permissão proposta.

    O console lista erros de repetição na tabela Alterações de acesso nos últimos 90 dias. O painel Detalhes da alteração de acesso de cada erro inclui uma mensagem de erro para ajudar você a entender o problema, além do recurso e da permissão que estavam sendo simulados quando o erro ocorreu.

  • Erros de tipo de recurso incompatível: a política de permissão proposta afeta as permissões associadas a um tipo de recurso incompatível, que o Simulador de política não pode simular.

    O simulador de políticas lista essas permissões nos resultados da simulação para que você saiba quais permissões não foi possível simular.

gcloud

Nos resultados da simulação da CLI gcloud, os erros podem aparecer em dois locais:

  • No campo replayResult.error: se a tentativa de reprodução não for bem-sucedida, o Simulador de política informará o erro no campo replayResult.error. Se um resultado de reprodução contiver esse campo, ele não conterá um campo diff.
  • No campo replayResult.diff.accessDiff.policy-type.errors, em que policy-type é baseline ou simulated. Se a tentativa de reprodução foi bem-sucedida, mas o resultado foi UNKNOWN_INFO_DENIED ou UNKNOWN_CONDITIONAL, o Simulador de política informará o motivo pelo qual o resultado foi desconhecido nesse campo.

O Simulador de política gera estes tipos de erros:

Erro Código do erro Detalhes
GENERIC_INTERNAL_ERROR 13 Ocorreu uma falha na simulação devido a um erro interno. Para resolver isso, tente executar a simulação novamente. Se mesmo assim a simulação falhar, entre em contato com policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 O Simulador de política não conseguiu reproduzir a tentativa de acesso porque continha uma permissão inválida, um nome de recurso ou um principal.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 O Simulador de política não conseguiu avaliar a associação do principal ao grupo porque ele tem muitos subgrupos. Esse erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 O Simulador de política não conseguiu avaliar o acesso do usuário porque o autor da chamada não tem permissão para visualizar a associação ao grupo. Esse erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar uma política de permissão. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar as permissões em um papel do IAM. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar a política de permissão de um recurso ancestral. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 A tupla de acesso contém um tipo de participante que não é compatível com o Simulador de política.
UNIMPLEMENTED_MEMBER 12 A tupla de acesso contém um participante que não é compatível com o Simulador de política.
UNIMPLEMENTED_CONDITION 12 A tupla de acesso contém uma condição, que não é compatível com o Simulador de política. Esse tipo de erro está associado a alterações de acesso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 O recurso está associado a muitos registros de acesso, por isso o Simulador de política não conseguiu executar a simulação. Consulte Tamanho máximo da repetição de registros na página de conceitos do Simulador de políticas para ver mais detalhes.
UNSUPPORTED_RESOURCE 12

A política de permissão proposta altera as permissões associadas a tipos de recursos incompatíveis. Esse erro aparece no campo replayResult.error e contém uma lista das permissões associadas a tipos de recursos não compatíveis. Exemplo:


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

Para mais informações sobre tipos de recursos não compatíveis, consulte Níveis de compatibilidade para tipos de recursos na página de conceitos do Simulador de política.

REST

Nos resultados da simulação da API REST, os erros podem aparecer em dois lugares:

  • No campo replayResult.error: se a tentativa de reprodução não for bem-sucedida, o Simulador de política informará o erro no campo replayResult.error. Se um resultado de reprodução contiver esse campo, ele não conterá um campo diff.
  • No campo replayResult.diff.accessDiff.policy-type.errors, em que policy-type é baseline ou simulated. Se a tentativa de reprodução foi bem-sucedida, mas o resultado foi UNKNOWN_INFO_DENIED ou UNKNOWN_CONDITIONAL, o Simulador de política informará o motivo pelo qual o resultado foi desconhecido nesse campo.

O Simulador de política gera estes tipos de erros:

Erro Código do erro Detalhes
GENERIC_INTERNAL_ERROR 13 Ocorreu uma falha na simulação devido a um erro interno. Para resolver isso, tente executar a simulação novamente. Se mesmo assim a simulação falhar, entre em contato com policy-simulator-feedback@google.com.
INVALID_ACCESS_TUPLE 3 O Simulador de política não conseguiu reproduzir a tentativa de acesso porque continha uma permissão inválida, um nome de recurso ou um principal.
OUT_OF_RANGE_GROUP_TOO_LARGE 11 O Simulador de política não conseguiu avaliar a associação do principal ao grupo porque ele tem muitos subgrupos. Esse erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_GROUP_MEMBERSHIP 7 O Simulador de política não conseguiu avaliar o acesso do usuário porque o autor da chamada não tem permissão para visualizar a associação ao grupo. Esse erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_POLICY 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar uma política de permissão. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_IAM_ROLE 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar as permissões em um papel do IAM. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
PERMISSION_DENIED_ON_PARENT_IAM_POLICY 7 O Simulador de política não conseguiu avaliar o acesso de um usuário porque o autor da chamada não tem permissão para recuperar a política de permissão de um recurso ancestral. Esse tipo de erro está associado a alterações de acesso UNKNOWN_INFO_DENIED.
UNIMPLEMENTED_MEMBER_TYPE 12 A tupla de acesso contém um tipo de participante que não é compatível com o Simulador de política.
UNIMPLEMENTED_MEMBER 12 A tupla de acesso contém um participante que não é compatível com o Simulador de política.
UNIMPLEMENTED_CONDITION 12 A tupla de acesso contém uma condição, que não é compatível com o Simulador de política. Esse tipo de erro está associado a alterações de acesso UNKNOWN_CONDITIONAL.
LOG_SIZE_TOO_LARGE 8 O recurso está associado a muitos registros de acesso, por isso o Simulador de política não conseguiu executar a simulação. Consulte Tamanho máximo da repetição de registros na página de conceitos do Simulador de políticas para ver mais detalhes.
UNSUPPORTED_RESOURCE 12

A política de permissão proposta altera as permissões associadas a tipos de recursos incompatíveis. Esse erro aparece no campo replayResult.error e contém uma lista das permissões associadas a tipos de recursos não compatíveis. Exemplo:


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

Para mais informações sobre tipos de recursos não compatíveis, consulte Níveis de compatibilidade para tipos de recursos na página de conceitos do Simulador de política.

Aplicar uma alteração de política simulada

Para aplicar uma alteração simulada a uma política de permissão, siga estas etapas:

Console

  1. Clique em Aplicar alterações propostas.

  2. Na caixa de diálogo de confirmação, clique em Aplicar para confirmar a alteração.

gcloud

Use o comando set-iam-policy e forneça um caminho para o arquivo JSON que contém a política de permissão simulada que você quer aplicar:

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

Forneça os valores a seguir:

  • resource-type: o tipo de recurso cuja política de permissão você quer atualizar. Por exemplo, projects.
  • resource-id: o ID do recurso cuja política de permissão você quer atualizar. Por exemplo, my-project.
  • filepath: o caminho para um arquivo que contém a política de permissão atualizada.

A resposta contém a política de permissão atualizada. Se você tratar as políticas de permissão do IAM como código e armazená-las em um sistema de controle de versões, armazene a política de permissão que a CLI gcloud retorna, não o arquivo JSON que contém a política de permissão simulada.

REST

Defina a política de permissão proposta como a nova política de permissão do recurso.

Para definir a política de permissão na solicitação como a nova política de permissão do projeto, use o método projects.setIamPolicy da API Resource Manager.

Antes de usar qualquer um dos dados da solicitação, faça as seguintes substituições:

  • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
  • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

Método HTTP e URL:

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

Corpo JSON da solicitação:

{
  "policy": {
    POLICY
  }
}

Para enviar a solicitação, expanda uma destas opções:

A resposta contém a política de permissão atualizada.


Salvar resultados da simulação

Se você estiver usando a CLI gcloud, poderá salvar os resultados do Simulador de política como arquivos JSON, YAML ou CSV.

Salvar como JSON ou YAML

Para salvar os resultados de uma simulação como arquivo JSON ou YAML, adicione a seguinte sinalização ao comando replay-recent-access ao executar a simulação:

--output=output-format > filename

Substitua os seguintes valores:

  • output-format: o idioma do arquivo exportado, json ou yaml.
  • filename: um nome para o arquivo exportado.

Salvar como CSV

Para salvar como um arquivo CSV, adicione a seguinte sinalização ao comando replay-recent-access ao executar a simulação:

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

Substitua os seguintes valores:

  • output-fields: uma lista separada por vírgulas dos campos que você quer incluir nos resultados exportados. Por exemplo, diffs.accessTuple.principal, diffs.accessTuple.permission.
  • filename: um nome para o arquivo exportado.

Opcionalmente, é possível adicionar outros campos, como errors[], à sinalização --flatten. Adicionar campos à sinalização --flatten permite que os elementos nesses campos sejam listados em linhas separadas no arquivo CSV.

Veja a seguir um exemplo de um comando replay-recent-access que salva os campos mais importantes dos resultados da simulação como o arquivo 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

Este exemplo simula proposed-policy.json para o projeto my-project e salva os resultados como simulation-results.csv. Esse arquivo CSV contém os seguintes campos: principal, permissão, recurso, alteração de acesso, estado de acesso de referência e estado de acesso simulado.

Para mais informações sobre como formatar com a CLI gcloud consulte formatos.

A seguir