Restablece una versión anterior de una política de permisos de IAM

En esta página, se explica cómo restablecer una versión anterior de una política de permiso de IAM después de realizar cambios involuntarios o borrarla accidentalmente.

Para restablecer una política de IAM anterior, busca el último setIamPolicy exitoso antes del cambio o la eliminación, y úsalo para restablecer la política.

También puedes usar Cloud Asset Inventory para encontrar el historial de cambios de IAM y usarlo para restablecer la política.

Roles obligatorios

Para obtener los permisos que necesitas para restablecer una política de permisos anterior, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto, la carpeta o la organización:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Cuando se restablecen las políticas de permisos con setIamPolicy, el rol de administrador de la organización es necesario para las políticas de permisos a nivel de la organización y de la carpeta, y el rol de propietario es necesario para las políticas de permisos a nivel del proyecto.

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Restablece una política de permisos con la última instancia setIamPolicy exitosa

Para restablecer una política de permisos a una versión anterior, puedes revisar tus registros de auditoría para ver la última instancia exitosa de setIamPolicy antes del cambio o la eliminación, y usar la información de esa instancia para restablecer la política. Este proceso implica los siguientes pasos:

  1. Identifica la última instancia setIamPolicy exitosa para la política de permisos y recupera el insertId.
  2. Usa insertId de la solicitud setIamPolicy para exportar la política de permisos en formato YAML o JSON.
  3. Modifica el archivo de salida para que coincida con la política de permisos anterior que funcionaba y anula la política de permisos actual.

Identifica la última instancia exitosa de setIamPolicy y recupera el insertId.

Para identificar la última instancia correcta de setIamPolicy y recuperar el isertId, usa la consola de Google Cloud o la gcloud CLI para revisar tus registros de auditoría.

Console

  1. En la consola de Google Cloud , accede a la página Explorador de registros.

    Ve al Explorador de registros

  2. En el editor de consultas, ingresa una de las siguientes consultas. Estas búsquedas buscan en tus registros de auditoría las entradas que tienen SetIamPolicy en el campo methodName del protoPayload:

    • Para obtener los registros de todos los cambios en la política de permisos realizados en un recurso, usa la siguiente consulta:

      logName="RESOURCE_TYPE/RESOURCE_ID/logs/cloudaudit.googleapis.com%2Factivity"
      protoPayload.methodName:SetIamPolicy
      
    • Para obtener los registros de los cambios en la política de permisos que involucran a un usuario o una cuenta de servicio específicos, usa la siguiente consulta:

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

      Reemplaza lo siguiente:

      • RESOURCE_TYPE: Es el tipo de recurso para el que creas una lista de registros de auditoría. Los valores válidos son projects, folders o organizations.
      • RESOURCE_ID: Tu Google Cloud ID de proyecto, carpeta o organización. Los IDs de proyecto son alfanuméricos, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
      • EMAIL_ADDRESS: Es la dirección de correo electrónico del usuario o la cuenta de servicio (por ejemplo, example-service-account@example-project.iam.gserviceaccount.com).
  3. Para ejecutar la consulta, haz clic en Ejecutar consulta.

  4. Usa el selector Línea de tiempo para especificar el intervalo de tiempo adecuado para la consulta. También puedes agregar una expresión de marca de tiempo directamente al editor de consultas. Para obtener más información, consulta Visualiza registros por período.

  5. Copia el insertId de la última instancia exitosa de setIamPolicy antes del cambio o la eliminación.

gcloud

El comando gcloud logging read lee las entradas de registro.

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

  • RESOURCE_TYPE: El tipo de recurso para el que creas una lista de registros de auditoría. Usa el valor projects, folders o organizations.
  • RESOURCE_ID: Tu ID de proyecto, organización o carpeta de Google Cloud. Los IDs de proyecto son cadenas alfanuméricas, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
  • TIME_PERIOD: Es el período para el que creas una lista de registros de auditoría. Las entradas que se devuelven no son anteriores a este valor. Si no se especifica, el valor predeterminado es 1d. Para obtener información sobre los formatos de hora, consulta gcloud topic datetime.
  • RESOURCE_TYPE_SINGULAR: El tipo de recurso para el que creas una lista de registros de auditoría. Usa el valor project, folder o organization.

Ejecuta el siguiente comando:

Linux, macOS o 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

Copia el insertId de la última instancia exitosa de setIamPolicy antes del cambio o la eliminación.

Usa insertId para exportar la política de permisos.

Usa el insertId que recuperaste de la última instancia exitosa de setIamPolicy para ejecutar el siguiente comando en la gcloud CLI y exportar la política de permisos en formato JSON o YAML. Puedes exportar políticas de permisos para organizaciones y proyectos.

Nivel de la organización

El comando gcloud logging read lee las entradas de registro.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • ORGANIZATION_ID: Es la organización para la que deseas ver y exportar la política de permisos.
  • INSERT_ID: Es el insertId de la solicitud setIamPolicy.
  • FORMAT: Es el formato de la respuesta. Usa json o yaml.
  • TIME_PERIOD: Es el período para el que creas una lista de registros de auditoría. Las entradas que se devuelven no son anteriores a este valor. Si no se especifica, el valor predeterminado es 1d. Para obtener información sobre los formatos de hora, consulta gcloud topic datetime.
  • OUTPUT_FILE: Nombre de archivo y extensión del archivo de salida. Por ejemplo, previous_policy.json o previous_policy.yaml.

Ejecuta el siguiente comando:

Linux, macOS o 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

Nivel de proyecto

El comando gcloud logging read lee las entradas de registro.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • INSERT_ID: Es el insertId de la solicitud setIamPolicy.
  • TIME_PERIOD: Es el período para el que creas una lista de registros de auditoría. Las entradas que se devuelven no son anteriores a este valor. Si no se especifica, el valor predeterminado es 1d. Para obtener información sobre los formatos de hora, consulta gcloud topic datetime.
  • FORMAT: Es el formato de la respuesta. Usa json o yaml.
  • OUTPUT_FILE: Es el nombre del archivo en el que deseas guardar el resultado, por ejemplo, previous_policy.json o previous_policy.yaml.

Ejecuta el siguiente comando:

Linux, macOS o 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

Modifica el archivo de salida y anula la política de permisos actual

Modifica el archivo de salida de las siguientes maneras y anula la política de permisos actual.

  1. De manera programática o con un editor de texto, modifica el archivo de salida borrando las siguientes líneas:

     ---
     protoPayload:
        request:
          policy:
    

    El archivo resultante comienza con auditConfigs:.

  2. Obtén la política de permisos actual.

    gcloud

    El comando gcloud get-iam-policy obtiene la política de permisos de un proyecto, una carpeta o una organización.

    Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

    • RESOURCE_TYPE: Es el tipo de recurso para el que deseas obtener la política de permisos. Los valores válidos son projects, resource-manager folders o organizations.

    • RESOURCE_ID: Tu ID de la organización, carpeta o Google Cloud proyecto. Los IDs de proyecto son alfanuméricos, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.

    • FORMAT: El formato deseado para la política permisos. Usa json o yaml.

    • PATH: Es la ruta a un nuevo archivo de salida de la política de permisos.

    Ejecuta el siguiente comando:

    Linux, macOS o 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 ejemplo, con el siguiente comando, se obtiene la política de permisos para el proyecto my-project y se guarda en tu directorio principal en formato JSON:

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

    C#

    Para autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

    Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

    En el siguiente ejemplo, se muestra cómo obtener la política de permisos para un proyecto. Para obtener información sobre la política de permisos de una carpeta u organización, consulta la documentación de las bibliotecas cliente de Resource Manager de tu lenguaje de programación.

    
    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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

    Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

    En el siguiente ejemplo, se muestra cómo obtener la política de permisos para un proyecto. Para obtener información sobre la política de permisos de una carpeta u organización, consulta la documentación de las bibliotecas cliente de Resource Manager de tu lenguaje de programación.

    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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

    Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

    En el siguiente ejemplo, se muestra cómo obtener la política de permisos para un proyecto. Para obtener información sobre la política de permisos de una carpeta u organización, consulta la documentación de las bibliotecas cliente de Resource Manager de tu lenguaje de programación.

    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

    El método get-iam-policy de la API de Resource Manager obtiene la política de permisos de un proyecto, una carpeta o una organización.

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

    • API_VERSION: La versión de la API que se usará. Para los proyectos y las organizaciones, usa v1. Para las carpetas, usa v2.
    • RESOURCE_TYPE: El tipo de recurso cuya política deseas administrar. Usa el valor projects, folders o organizations.
    • RESOURCE_ID: Tu ID de proyecto, organización o carpeta de Google Cloud. Los IDs de proyecto son cadenas alfanuméricas, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
    • POLICY_VERSION: Es la versión de la política que se mostrará. Las solicitudes deben especificar la versión de política más reciente, que es la versión de política 3. Consulta Especifica una versión de política cuando obtienes una política para obtener más detalles.

    Método HTTP y URL:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene la política de permisos del recurso. Por ejemplo:

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

    Guarda la respuesta en un archivo del tipo adecuado (json o yaml).

  3. Copia el valor de etag de la política de permisos actual.

  4. Reemplaza el valor etag en el archivo de salida por el valor etag que copiaste de la política de permiso actual. El etag del archivo de salida debe coincidir con el etag actual para iniciar una nueva solicitud de setIamPolicy. Asegúrate de que el espaciado de la ETag no haya cambiado en el archivo de salida.

  5. Revisa el archivo para asegurarte de que coincida con la política de permiso anterior que funcionaba. Podrías considerar crear un proyecto nuevo y aplicar la política para asegurarte de que funcione según lo previsto.

  6. Establece la política de permisos para anular la política de permisos actual con la que se encuentra en el archivo de salida que creaste.

    gcloud

    El comando gcloud set-iam-policy establece la política en la solicitud como la nueva política de permisos para el proyecto, la carpeta o la organización.

    Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

    • RESOURCE_TYPE: Es el tipo de recurso para el que deseas establecer la política de permisos. Los valores válidos son projects, resource-manager folders o organizations.

    • RESOURCE_ID: Tu ID de la organización, carpeta o Google Cloud proyecto. Los IDs de proyecto son alfanuméricos, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.

    • PATH: Es la ruta a un archivo que contiene la política de permisos nueva.

    Ejecuta el siguiente comando:

    Linux, macOS o 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

    La respuesta contiene la política de permisos actualizada:

    Por ejemplo, con el siguiente comando, se establece la política de permisos almacenada en policy.json como la política de permisos para el proyecto 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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

    Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

    En el siguiente ejemplo, se muestra cómo configurar la política de permisos de un proyecto. Si deseas obtener información para configurar la política de permisos de una carpeta o una organización, consulta la documentación de la biblioteca cliente de Resource Manager para tu lenguaje de programación.

    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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

    Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

    En el siguiente ejemplo, se muestra cómo configurar la política de permisos de un proyecto. Si deseas obtener información para configurar la política de permisos de una carpeta o una organización, consulta la documentación de la biblioteca cliente de Resource Manager para tu lenguaje de programación.

    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

    El método set-iam-policy de la API de Resource Manager establece la política en la solicitud como la política de permisos nueva para el proyecto, la carpeta o la organización.

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

    • API_VERSION: La versión de la API que se usará. Para los proyectos y las organizaciones, usa v1. Para las carpetas, usa v2.
    • RESOURCE_TYPE: El tipo de recurso cuya política deseas administrar. Usa el valor projects, folders o organizations.
    • RESOURCE_ID: Tu ID de proyecto, organización o carpeta de Google Cloud. Los IDs de proyecto son cadenas alfanuméricas, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
    • POLICY: Una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta la Referencia de políticas.

    Método HTTP y URL:

    POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene la política de permisos actualizada:

Restaurar una política de permisos con Cloud Asset Inventory

Para restablecer una política de permisos a una versión anterior, puedes usar Cloud Asset Inventory para ver el historial de cambios de las políticas de permisos del recurso y usar esa información para restablecer la política. Este proceso implica los siguientes pasos:

  1. Usa Cloud Asset Inventory para revisar el historial de cambios de las políticas de permisos y, luego, identifica la política de permisos que deseas restablecer.
  2. Copia la política de permisos y crea un archivo nuevo en formato JSON.
  3. Anula la política de permisos actual con la del archivo nuevo.

Revisa el historial de cambios de la política de permisos con Cloud Asset Inventory

Console

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

    Ir a Asset Inventory

  2. Haz clic en la pestaña Política de IAM.

  3. Ejecuta la siguiente consulta en el campo Filtro:

    Resource : RESOURCE_ID

    Reemplaza RESOURCE_ID por el ID de tu proyecto, carpeta o organización Google Cloud. Los IDs de proyecto son alfanuméricos, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.

  4. Para ver el historial de cambios de la política de permisos del recurso, haz clic en el nombre del recurso y, luego, selecciona la pestaña Historial de cambios.

  5. Para comparar los cambios en la política de permisos del recurso, selecciona dos registros con marcas de fecha y hora diferentes en el menú Selecciona un registro para comparar.

gcloud

El comando gcloud asset get-history obtiene el historial actualizado de las políticas de permisos en un activo que se superpone con un período.

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

  • RESOURCE_TYPE: El tipo de recurso para el que creas una lista de registros de auditoría. Usa el valor project, folder o organization.
  • RESOURCE_ID: Tu ID de proyecto, organización o carpeta de Google Cloud. Los IDs de proyecto son cadenas alfanuméricas, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
  • ASSET_NAME: Es una lista separada por comas de nombres de recursos con formato para los recursos cuyos historiales de políticas de permisos deseas ver. Por ejemplo, //cloudresourcemanager.googleapis.com/projects/my-project. Estos recursos pueden ser cualquiera de los tipos de recursos que aceptan políticas de permisos.
  • START_TIME: Es el comienzo del intervalo de tiempo. El intervalo máximo es de 7 días. El valor debe ser la hora actual o una hora que no sea más de 35 días anterior. Para obtener información sobre los formatos de hora, consulta gcloud topic datetime.
  • END_TIME: Opcional Es el punto final del intervalo de tiempo. El intervalo máximo es de 7 días. El valor debe ser la hora actual o una hora que no supere los 35 días en el pasado. Cuando no se proporciona, se supone que la hora de finalización es la hora actual. Para obtener información sobre los formatos de hora, consulta gcloud topic datetime.

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

gcloud asset get-history \
    --RESOURCE_TYPE=RESOURCE_ID \
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... \
    --content-type=iam-policy \
    --start-time=START_TIME \
    --end-time=END_TIME

Windows (PowerShell)

gcloud asset get-history `
    --RESOURCE_TYPE=RESOURCE_ID `
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... `
    --content-type=iam-policy `
    --start-time=START_TIME `
    --end-time=END_TIME

Windows (cmd.exe)

gcloud asset get-history ^
    --RESOURCE_TYPE=RESOURCE_ID ^
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... ^
    --content-type=iam-policy ^
    --start-time=START_TIME ^
    --end-time=END_TIME

La respuesta contiene el historial actualizado de las políticas de permisos.

Crea un archivo de política de permisos nuevo

Después de revisar el historial de la política de permisos y de identificar la política de permisos que deseas restablecer, completa los siguientes pasos.

  1. Copia la política de permisos que deseas restablecer a partir de la línea "bindings" hasta la línea "etag".

  2. Pega la política de permiso que copiaste en un archivo nuevo y usa llaves ({}) para encerrar la política. Por ejemplo, la política de permisos podría tener el siguiente aspecto:

     {
      "bindings": [
        {
          "role": "roles/resourcemanager.organizationAdmin",
          "members": [
            "user:mike@example.com",
            "group:admins@example.com",
            "domain:google.com",
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role": "roles/resourcemanager.organizationViewer",
          "members": [
            "user:eve@example.com"
          ],
          "condition": {
            "title": "expirable access",
            "description": "Does not grant access after Sep 2020",
            "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')",
          }
        }
      ],
      "etag": "BwWWja0YfJA=",
     }
    
  3. Guarda el archivo en formato JSON. Por ejemplo, podrías llamar al archivo nuevo previous_iam_policy.json.

Establece la nueva política de permisos

Establece la política de permisos para anular la política de permisos actual con la que se encuentra en el archivo de salida que creaste.

gcloud

El comando gcloud set-iam-policy establece la política en la solicitud como la nueva política de permisos para el proyecto, la carpeta o la organización.

Antes de usar cualquiera de los datos de comando a continuación, haz los siguientes reemplazos:

  • RESOURCE_TYPE: Es el tipo de recurso para el que deseas establecer la política de permisos. Los valores válidos son projects, resource-manager folders o organizations.

  • RESOURCE_ID: Tu ID de la organización, carpeta o Google Cloud proyecto. Los IDs de proyecto son alfanuméricos, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.

  • PATH: Es la ruta a un archivo que contiene la política de permisos nueva.

Ejecuta el siguiente comando:

Linux, macOS o 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

La respuesta contiene la política de permisos actualizada:

Por ejemplo, con el siguiente comando, se establece la política de permisos almacenada en policy.json como la política de permisos para el proyecto 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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

En el siguiente ejemplo, se muestra cómo configurar la política de permisos de un proyecto. Si deseas obtener información para configurar la política de permisos de una carpeta o una organización, consulta la documentación de la biblioteca cliente de Resource Manager para tu lenguaje de programación.

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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

En el siguiente ejemplo, se muestra cómo configurar la política de permisos de un proyecto. Si deseas obtener información para configurar la política de permisos de una carpeta o una organización, consulta la documentación de la biblioteca cliente de Resource Manager para tu lenguaje de programación.

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

El método set-iam-policy de la API de Resource Manager establece la política en la solicitud como la política de permisos nueva para el proyecto, la carpeta o la organización.

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

  • API_VERSION: La versión de la API que se usará. Para los proyectos y las organizaciones, usa v1. Para las carpetas, usa v2.
  • RESOURCE_TYPE: El tipo de recurso cuya política deseas administrar. Usa el valor projects, folders o organizations.
  • RESOURCE_ID: Tu ID de proyecto, organización o carpeta de Google Cloud. Los IDs de proyecto son cadenas alfanuméricas, como my-project. Los IDs de carpeta y organización son numéricos, como 123456789012.
  • POLICY: Una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta la Referencia de políticas.

Método HTTP y URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

Cuerpo JSON de la solicitud:

{
  "policy": POLICY
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene la política de permisos actualizada: