Como simular alterações de políticas

Nesta página, descrevemos como simular uma alteração na política de gerenciamento de identidade e acesso (IAM, na sigla em inglês) usando o Simulador de política. Ela também explica como interpretar os resultados da simulação e como aplicar a política simulada se escolher fazer isso.

Antes de começar

Como receber permissões

Antes de simular uma alteração de política, 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 papéis do 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 que você está simulando.

Você precisa dos papéis de Administrador do simulador (roles/policysimulator.admin) e de Revisor de segurança (roles/iam.securityReviewer) no recurso de destino ou de outro papel que inclua as seguintes permissões:

  • policysimulator.replays.run
  • cloudassets.assets.searchAllResources
  • 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.

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.

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

Você precisa do papel Administrador do simulador (roles/policysimulator.admin) no recurso host ou de outro papel que inclua as seguintes permissões:

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

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 você está simulando.
  • service.resource.getIamPolicy, em que resource é o nome de um tipo de recurso que pode ter uma política do IAM 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ê queira simular uma política para um projeto. Se os registros de acesso incluírem uma tentativa de acesso a um bucket do Cloud Storage no projeto, você precisará da permissão storage.buckets.getIamPolicy nesse bucket. Se o projeto tiver uma pasta pai com uma política do IAM, 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 original e na política 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 visualizar a associação de todos os grupos do seu domínio e simular, de forma mais eficaz, as alterações de política.

Como simular uma alteração de política

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

Console

O exemplo a seguir demonstra como simular uma alteração de política para um projeto. No entanto, é possível simular uma alteração de política para qualquer recurso que tenha uma política do IAM.

Edite as permissões de um membro e, em vez de clicar em Salvar, clique em Simular:

  1. No Console do Cloud, acesse a página IAM.

    Acessar a página IAM

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

    1. Localize o membro cujo acesso você quer editar e clique no botão Editar à direita.
    2. Para editar o acesso do membro, adicione um novo papel ou revogue ou altere um papel existente.
  3. Para simular a alteração proposta, clique em Simular.

  4. Após alguns minutos, o Console do Cloud exibirá os resultados da política simulada como uma lista de alterações 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 atual e a política simulada, o Console do Cloud não exibirá nenhuma alteração de acesso.

gcloud

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

  1. Leia a política 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. Por exemplo, projects.
    • resource-id: o ID do recurso cuja política 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.

    Por exemplo, o comando a seguir recebe a política 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 JSON ou YAML retornada pelo comando get-iam-policy para refletir as alterações de política que você quer simular.

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

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

    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 a política que 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 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 de formatos de nome de recurso completos, consulte Nomes de recursos completos.

    • filepath: o caminho para o arquivo que contém a política 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 membro alteraria se a política 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 uma resposta de amostra para uma simulação de política envolvendo o usuário my-user@example.com. Nesse caso, se a alteração proposta fosse aplicada, my-user@example.com possivelmente 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 atual e a política simulada, o comando exibirá No access changes found in the replay.

REST

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

  1. Leia a política do IAM para o recurso:

    O método projects.getIamPolicy da API Resource Manager recebe a política do IAM de um projeto.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • 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 retornada para refletir as alterações que você quer simular.

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

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

    O método replays.create da API Policy Simulator cria uma reprodução para um projeto, pasta ou organização.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

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

    Para simular várias políticas,

    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 esperando 10 segundos até que a resposta inclua os campos "done": true e name com o nome da reprodução concluída.

    O método operations.get da API Policy Simulator recebe o estado de uma reprodução.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

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

    O método replays.results.list da API Policy Simulator recebe os resultados de uma reprodução.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • 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 membro 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 atual e a política simulada, a solicitação retornará uma lista vazia ({}).

Noções básicas sobre os resultados do Simulador de política

O simulador de política informa o impacto de uma alteração de política proposta como uma lista de alterações de acesso. Uma alteração de acesso representa uma tentativa de acesso nos últimos 90 dias que teria um resultado diferente na política proposta em relação à política 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:

  • Visão geral da política: esta seção lista o papel original que o membro tinha no recurso, bem como o papel que ele terá na política proposta. O papel original está listado em Política atual e o papel proposto está listado em Política proposta.

  • Resumo das alterações de acesso: esta seção exibe o número de tentativas de acesso nos últimos 90 dias que teriam sido diferentes se a política proposta tivesse sido aplicada. Nesse resumo, incluímos possíveis alterações de acesso ou alterações desconhecidas, bem como todos os erros que ocorreram durante a simulação.

  • Alterações de acesso nos últimos 90 dias: esta seção lista todas as tentativas de acesso nos últimos 90 dias que teriam sido diferentes se a política proposta tivesse sido aplicada. Cada entrada, ou alteração de acesso, inclui o tipo da alteração de acesso, junto com o recurso, o membro e a permissão envolvidos na tentativa de acesso.

    Existem vários tipos diferentes de acesso:

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

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro tinha acesso na política atual, mas o acesso dele na política proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas não terá acesso após a alteração proposta.
    Acesso recebido O membro não tinha acesso à política atual, mas terá acesso após a alteração proposta.
    Acesso potencialmente recebido

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro não tinha acesso à política atual, mas seu acesso após a alteração proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas terá acesso após a alteração proposta.
    Acesso desconhecido O acesso do membro tanto na política atual quanto na política proposta é desconhecido, e as alterações propostas podem afetar o acesso do membro.
    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 membro, o acesso proposto do membro e detalhes adicionais sobre o resultado da alteração de acesso.

gcloud

Ao usar o comando replay-recent-access, a resposta da ferramenta 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 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 proposta estivesse em vigor, o acesso a eles 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 principal, ou membro, que estavam 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 na política atual e na política 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 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 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 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 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 membro tinha acesso à política atual, mas não terá mais acesso após a alteração proposta.
    ACCESS_MAYBE_REVOKED

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro tinha acesso na política atual, mas o acesso dele na política proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas não terá acesso após a alteração proposta.
    ACCESS_GAINED O membro não tinha acesso à política atual, mas terá acesso após a alteração proposta.
    ACCESS_MAYBE_GAINED

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro não tinha acesso à política atual, mas seu acesso após a alteração proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas terá acesso após a alteração proposta.
    UNKNOWN_CHANGE O acesso do membro tanto na política atual quanto na política proposta é desconhecido, e as alterações propostas podem afetar o acesso do membro.

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 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 proposta estivesse em vigor, o acesso a eles 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 principal, ou membro, que estavam 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 na política atual e na política 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 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 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 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 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 membro tinha acesso à política atual, mas não terá mais acesso após a alteração proposta.
    ACCESS_MAYBE_REVOKED

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro tinha acesso na política atual, mas o acesso dele na política proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas não terá acesso após a alteração proposta.
    ACCESS_GAINED O membro não tinha acesso à política atual, mas terá acesso após a alteração proposta.
    ACCESS_MAYBE_GAINED

    Este problema pode ocorrer pelos seguintes motivos:

    • O membro não tinha acesso à política atual, mas seu acesso após a alteração proposta é desconhecido.
    • O acesso do membro sob a política atual é desconhecido, mas terá acesso após a alteração proposta.
    UNKNOWN_CHANGE O acesso do membro tanto na política atual quanto na política proposta é desconhecido, e as alterações propostas podem afetar o acesso do membro.

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 desconhecido, além dos papéis, políticas, associações a grupos e condições específicas que não conseguiu acessar.

Um resultado pode ser desconhecido por vários motivos:

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

gcloud

Na ferramenta 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 que está sendo simulada ou não tem permissão para recuperar políticas de 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 que está sendo testada. O simulador de políticas não é compatível com condições, por isso a vinculação não foi avaliada.

Se o resultado for desconhecido, o campo accessDiff da política (baseline ou simulated) conterá um campo errors descrevendo por que as informações eram desconhecidas e um policies listando as políticas 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 que está sendo simulada ou não tem permissão para recuperar políticas de 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 que está sendo testada. O simulador de políticas não é compatível com condições, por isso a vinculação não foi avaliada.

Se o resultado for desconhecido, o campo accessDiff da política (baseline ou simulated) conterá um campo errors descrevendo por que as informações eram desconhecidas e um policies listando as políticas 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íticas não conseguiu determinar se o resultado da tentativa de acesso seria alterado na política proposta.

    O Console do Cloud lista os erros de reproduçã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 proposta afeta as permissões associadas a um tipo de recurso não compatível, que o Simulador de políticas 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 ferramenta gcloud, os erros podem aparecer em dois locais:

  • O 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 do IAM. 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 IAM 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 membro que não é compatível com o Simulador de política.
UNIMPLEMENTED_MEMBER 12 A tupla de acesso contém um membro 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 reprodução de registro na página de conceitos do Simulador de política para ver mais detalhes.
UNSUPPORTED_RESOURCE 12

A política proposta altera as permissões associadas a tipos de recursos não compatí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:

  • O 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 do IAM. 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 IAM 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 membro que não é compatível com o Simulador de política.
UNIMPLEMENTED_MEMBER 12 A tupla de acesso contém um membro 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 reprodução de registro na página de conceitos do Simulador de política para ver mais detalhes.
UNSUPPORTED_RESOURCE 12

A política proposta altera as permissões associadas a tipos de recursos não compatí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.

Como aplicar uma alteração de política simulada

Para aplicar uma alteração de política simulada, 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 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 você quer gerenciar. Por exemplo, projects.
  • resource-id: o ID do recurso com a política que você quer atualizar. Por exemplo, my-project.
  • filepath: o caminho para um arquivo que contém a política atualizada.

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

REST

Defina a política proposta como a nova política do recurso.

O método projects.setIamPolicy da API Resource Manager define a política na solicitação como a nova política do IAM do projeto.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • 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 atualizada.


Como salvar resultados de simulação

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

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

Como 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 ferramenta gcloud, consulte formatos.

A seguir