Restaurar uma versão anterior de uma política de permissão do IAM

Nesta página, explicamos como restaurar uma versão anterior de uma política de permissão do IAM depois de fazer mudanças inadvertidas ou exclusão acidental.

Para restaurar uma política do IAM anterior, encontre o último setIamPolicy bem-sucedido antes da mudança ou exclusão e use-o para restaurar a política.

Funções exigidas

Para receber as permissões necessárias para restaurar uma política de permissão anterior, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto, na pasta ou na organização:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Ao restaurar políticas de permissão com setIamPolicy, a função de Administrador da organização é necessária para políticas de permissão no nível da organização e da pasta, e a função de Proprietário é necessária para políticas de permissão para envolvidos no projeto.

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

Restaurar uma política de permissão com a última instância setIamPolicy bem-sucedida

Para restaurar uma política de permissão para uma versão anterior, revise os registros de auditoria da última instância bem-sucedida de setIamPolicy antes da mudança ou exclusão e use as informações dessa instância para restaurar a política. Esse processo envolve as seguintes etapas:

  1. Identifique a última instância setIamPolicy bem-sucedida para a política de permissão e recupere o insertId.
  2. Use o insertId da solicitação setIamPolicy para exportar a política de permissão no formato YAML ou JSON.
  3. Modifique o arquivo de saída para corresponder à política de permissão funcional anterior e substitua a política de permissão atual.

Identifique a última instância bem-sucedida de setIamPolicy e recupere o insertId.

Para identificar a última instância bem-sucedida de setIamPolicy e recuperar o isertId, use o console do Cloud de Confiance ou a CLI gcloud para analisar seus registros de auditoria.

Console

  1. No console do Cloud de Confiance , acesse a página Análise de registros.

    Acessar a Análise de registros

  2. No editor de consultas, insira uma das seguintes consultas. Essas consultas pesquisam nos registros de auditoria entradas que têm SetIamPolicy no campo methodName do protoPayload:

    • Para receber os registros de todas as mudanças feitas em uma política de permissão de um recurso, use a seguinte consulta:

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      
    • Para receber os registros de mudanças na política de permissão que envolvem um usuário ou conta de serviço específica, use a seguinte consulta:

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      protoPayload.serviceData.policyDelta.bindingDeltas.member:"EMAIL_ADDRESS"
      

      Substitua:

      • RESOURCE_TYPE: o tipo de recurso para o qual você está listando registros de auditoria. Os valores válidos são projects, folders ou organizations.
      • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, pasta ou organização. Os IDs de projeto são alfanuméricos, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
      • EMAIL_ADDRESS: o endereço de e-mail do usuário ou da conta de serviço, por exemplo, example-service-account@example-project.s3ns.iam.gserviceaccount.com.
  3. Para executar a consulta, clique em Executar consulta.

  4. Use o seletor Linha do tempo para especificar o período adequado para a consulta. Também é possível adicionar uma expressão de marcação de tempo diretamente ao editor de consultas. Para mais informações, consulte Ver registros por período.

  5. Copie o insertId da última instância bem-sucedida de setIamPolicy antes da mudança ou exclusão.

gcloud

O comando gcloud logging read lê entradas de registro.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • RESOURCE_TYPE: o tipo de recurso que está listando os registros de auditoria. Use o valor projects, folders ou organizations.
  • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, organização ou pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
  • TIME_PERIOD: o período em que você está listando os registros de auditoria. As entradas retornadas não são mais antigas que esse valor. Se o valor não for especificado, será usado o padrão 1d. Para informações sobre formatos de tempo, consulte gcloud topic datetimes.
  • RESOURCE_TYPE_SINGULAR: o tipo de recurso que está listando os registros de auditoria. Use o valor project, folder ou organization.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud logging read \
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' \
    --freshness=TIME_PERIOD \
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows (PowerShell)

gcloud logging read `
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' `
    --freshness=TIME_PERIOD `
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Windows (cmd.exe)

gcloud logging read ^
    'logName:RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity
    AND protoPayload.methodName=SetIamPolicy' ^
    --freshness=TIME_PERIOD ^
    --RESOURCE_TYPE_SINGULAR=RESOURCE_ID

Copie o insertId da última instância bem-sucedida de setIamPolicy antes da mudança ou exclusão.

Use o insertId para exportar a política de permissão

Use o insertId recuperado da última instância bem-sucedida de setIamPolicy para executar o comando a seguir na CLI gcloud e exportar a política de permissão no formato JSON ou YAML. É possível exportar políticas de permissão para organizações e projetos.

Nível da organização

O comando gcloud logging read lê entradas de registro.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • ORGANIZATION_ID: a organização para a qual você quer ver e exportar a política de permissão.
  • INSERT_ID: o insertId da solicitação setIamPolicy.
  • FORMAT: o formato da resposta. Use json ou yaml.
  • TIME_PERIOD: o período em que você está listando os registros de auditoria. As entradas retornadas não são mais antigas que esse valor. Se o valor não for especificado, será usado o padrão 1d. Para informações sobre formatos de tempo, consulte gcloud topic datetimes.
  • OUTPUT_FILE: o nome do arquivo e a extensão da saída. Por exemplo, previous_policy.json ou previous_policy.yaml.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows (PowerShell)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Windows (cmd.exe)

gcloud logging read organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com
insertId="INSERT_ID"'
--organization=ORGANIZATION_ID
--format="FORMAT(protoPayload.request.policy)"
--freshness=TIME_PERIOD > OUTPUT_FILE

Nível do projeto

O comando gcloud logging read lê entradas de registro.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • INSERT_ID: o insertId da solicitação setIamPolicy.
  • TIME_PERIOD: o período em que você está listando os registros de auditoria. As entradas retornadas não são mais antigas que esse valor. Se o valor não for especificado, será usado o padrão 1d. Para informações sobre formatos de tempo, consulte gcloud topic datetimes.
  • FORMAT: o formato da resposta. Use json ou yaml.
  • OUTPUT_FILE: o nome do arquivo em que você quer salvar a saída. Por exemplo, previous_policy.json ou previous_policy.yaml.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud logging read \
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' \
--freshness=TIME_PERIOD \
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows (PowerShell)

gcloud logging read `
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' `
--freshness=TIME_PERIOD `
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Windows (cmd.exe)

gcloud logging read ^
'protoPayload.methodName="SetIamPolicy" AND insertId="INSERT_ID"' ^
--freshness=TIME_PERIOD ^
--format="FORMAT(protoPayload.request.policy)" > OUTPUT_FILE

Modificar o arquivo de saída e substituir a política de permissão atual

Modifique o arquivo de saída das seguintes maneiras e substitua a política de permissão atual.

  1. De forma programática ou usando um editor de texto, modifique o arquivo de saída excluindo as seguintes linhas:

     ---
     protoPayload:
        request:
          policy:
    

    O arquivo resultante começa com auditConfigs:.

  2. Acessar a política de permissão atual.

    gcloud

    O comando gcloud get-iam-policy recebe a política de permissão de um projeto, pasta ou organização.

    Antes de usar os dados do comando abaixo, faça estas substituições:

    • RESOURCE_TYPE: o tipo de recurso para o qual você quer conseguir a política de permissão. Os valores válidos são projects, resource-manager folders ou organizations.

    • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, pasta ou organização. Os IDs de projeto são alfanuméricos, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.

    • FORMAT: o formato desejado para a política. Use json ou yaml.

    • PATH: o caminho para um novo arquivo de saída para a política de permissão.

    Execute o seguinte comando:

    Linux, macOS ou Cloud Shell

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows (PowerShell)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    Windows (cmd.exe)

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

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

    gcloud projects get-iam-policy my-project --format json > ~/policy.json

    C#

    Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

    Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

    O exemplo a seguir mostra como receber a política de permissão de um projeto. Para saber como conseguir a política de permissão de uma pasta ou organização, consulte a documentação da biblioteca de cliente do Resource Manager para sua linguagem de programação.

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy GetPolicy(string projectId)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
                projectId).Execute();
            return policy;
        }
    }
    

    Java

    Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

    Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

    O exemplo a seguir mostra como receber a política de permissão de um projeto. Para saber como conseguir a política de permissão de uma pasta ou organização, consulte a documentação da biblioteca de cliente do Resource Manager para sua linguagem de programação.

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.GetIamPolicyRequest;
    import com.google.iam.v1.Policy;
    import java.io.IOException;
    
    public class GetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
    
        getProjectPolicy(projectId);
      }
    
      // Gets a project's policy.
      public static Policy getProjectPolicy(String projectId) throws IOException {
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .build();
          return projectsClient.getIamPolicy(request);
        }
      }
    }

    Python

    Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

    Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

    O exemplo a seguir mostra como receber a política de permissão de um projeto. Para saber como conseguir a política de permissão de uma pasta ou organização, consulte a documentação da biblioteca de cliente do Resource Manager para sua linguagem de programação.

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def get_project_policy(project_id: str) -> policy_pb2.Policy:
        """Get policy for project.
    
        project_id: ID or number of the Google Cloud project you want to use.
        """
    
        client = resourcemanager_v3.ProjectsClient()
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        policy = client.get_iam_policy(request)
        print(f"Policy retrieved: {policy}")
    
        return policy

    REST

    O método get-iam-policy da API Resource Manager recebe a política de permissão de um projeto, pasta ou organização.

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

    • API_VERSION: a versão da API a ser usada. Para projetos e organizações, use v1. Para pastas, use v2.
    • RESOURCE_TYPE: o tipo de recurso com a política que você quer gerenciar. Use o valor projects, folders ou organizations.
    • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, organização ou pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
    • 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/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

    Corpo JSON da solicitação:

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

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

    A resposta contém a política de permissão do projeto. Por exemplo:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/owner",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Salve a resposta em um arquivo do tipo apropriado (json ou yaml).

  3. Copie o valor etag da política de permissão atual.

  4. Substitua o valor etag no arquivo de saída pelo valor etag que você copiou da política de permissão atual. O etag no arquivo de saída precisa corresponder ao etag atual para iniciar uma nova solicitação setIamPolicy. Verifique se o espaçamento da ETag não mudou no arquivo de saída.

  5. Revise o arquivo para garantir que ele corresponda à política de permissão funcional anterior. Considere criar um novo projeto e aplicar a política para garantir que ela funcione como esperado.

  6. Defina a política de permissão para substituir a política de permissão atual com a do arquivo de saída que você criou.

    gcloud

    O comando gcloud set-iam-policy define a política na solicitação como a nova política de permissão para o projeto, pasta ou organização.

    Antes de usar os dados do comando abaixo, faça estas substituições:

    • RESOURCE_TYPE: o tipo de recurso para o qual você quer definir a política de permissão. Os valores válidos são projects, resource-manager folders ou organizations.

    • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, pasta ou organização. Os IDs de projeto são alfanuméricos, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.

    • PATH: o caminho para um arquivo que contém a nova política de permissão.

    Execute o seguinte comando:

    Linux, macOS ou Cloud Shell

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows (PowerShell)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    Windows (cmd.exe)

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

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

    Por exemplo, o comando a seguir define a política de permissão armazenada em policy.json como a política de permissão do projeto my-project:

    gcloud projects set-iam-policy my-project ~/policy.json

    C#

    
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.CloudResourceManager.v1;
    using Google.Apis.CloudResourceManager.v1.Data;
    
    public partial class AccessManager
    {
        public static Policy SetPolicy(string projectId, Policy policy)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
            var service = new CloudResourceManagerService(
                new CloudResourceManagerService.Initializer
                {
                    HttpClientInitializer = credential
                });
    
            return service.Projects.SetIamPolicy(new SetIamPolicyRequest
            {
                Policy = policy
            }, projectId).Execute();
        }
    }
    

    Java

    Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

    Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

    O exemplo a seguir mostra como definir a política de permissão para um projeto. Para saber como definir a política de permissão de uma pasta ou organização, consulte a documentação da biblioteca de cliente do Resource Manager para sua linguagem de programação.

    import com.google.cloud.resourcemanager.v3.ProjectsClient;
    import com.google.iam.admin.v1.ProjectName;
    import com.google.iam.v1.Policy;
    import com.google.iam.v1.SetIamPolicyRequest;
    import com.google.protobuf.FieldMask;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    
    public class SetProjectPolicy {
      public static void main(String[] args) throws IOException {
        // TODO(developer): Replace the variables before running the sample.
        // TODO: Replace with your project ID.
        String projectId = "your-project-id";
        // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
        Policy policy = Policy.newBuilder().build();
    
        setProjectPolicy(policy, projectId);
      }
    
      // Sets a project's policy.
      public static Policy setProjectPolicy(Policy policy, String projectId)
              throws IOException {
    
        // Initialize client that will be used to send requests.
        // This client only needs to be created once, and can be reused for multiple requests.
        try (ProjectsClient projectsClient = ProjectsClient.create()) {
          List<String> paths = Arrays.asList("bindings", "etag");
          SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
                  .setResource(ProjectName.of(projectId).toString())
                  .setPolicy(policy)
                  // A FieldMask specifying which fields of the policy to modify. Only
                  // the fields in the mask will be modified. If no mask is provided, the
                  // following default mask is used:
                  // `paths: "bindings, etag"`
                  .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
                  .build();
    
          return projectsClient.setIamPolicy(request);
        }
      }
    }

    Python

    Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

    Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

    O exemplo a seguir mostra como definir a política de permissão para um projeto. Para saber como definir a política de permissão de uma pasta ou organização, consulte a documentação da biblioteca de cliente do Resource Manager para sua linguagem de programação.

    from google.cloud import resourcemanager_v3
    from google.iam.v1 import iam_policy_pb2, policy_pb2
    
    
    def set_project_policy(
        project_id: str, policy: policy_pb2.Policy, merge: bool = True
    ) -> policy_pb2.Policy:
        """
        Set policy for project. Pay attention that previous state will be completely rewritten.
        If you want to update only part of the policy follow the approach read->modify->write.
        For more details about policies check out https://cloud.google.com/iam/docs/policies
    
        project_id: ID or number of the Google Cloud project you want to use.
        policy: Policy which has to be set.
        merge: The strategy to be used forming the request. CopyFrom is clearing both mutable and immutable fields,
        when MergeFrom is replacing only immutable fields and extending mutable.
        https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.CopyFrom
        """
        client = resourcemanager_v3.ProjectsClient()
    
        request = iam_policy_pb2.GetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
        current_policy = client.get_iam_policy(request)
    
        # Etag should as fresh as possible to lower chance of collisions
        policy.ClearField("etag")
        if merge:
            current_policy.MergeFrom(policy)
        else:
            current_policy.CopyFrom(policy)
    
        request = iam_policy_pb2.SetIamPolicyRequest()
        request.resource = f"projects/{project_id}"
    
        # request.etag field also will be merged which means you are secured from collision,
        # but it means that request may fail and you need to leverage exponential retries approach
        # to be sure policy has been updated.
        request.policy.CopyFrom(current_policy)
    
        policy = client.set_iam_policy(request)
        return policy
    
    

    REST

    O método set-iam-policy da API Resource Manager define a política na solicitação como a nova política de permissão para o projeto, a pasta ou a organização.

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

    • API_VERSION: a versão da API a ser usada. Para projetos e organizações, use v1. Para pastas, use v2.
    • RESOURCE_TYPE: o tipo de recurso com a política que você quer gerenciar. Use o valor projects, folders ou organizations.
    • RESOURCE_ID: o ID do seu Cloud de Confiance projeto, organização ou pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
    • 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/API_VERSION/RESOURCE_TYPE/RESOURCE_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.