Controla el acceso a los recursos con la IAM

En este documento, se describe cómo ver, otorgar y revocar los controles de acceso para los conjuntos de datos de BigQuery y los recursos dentro de los conjuntos de datos: tablas, vistas y rutinas. Si bien los modelos también son recursos a nivel del conjunto de datos, no puedes otorgar acceso a modelos individuales con roles de IAM.

Puedes otorgar acceso a los recursos de Trusted Cloud by S3NS con políticas de permisos, también conocidas como políticas de Identity and Access Management (IAM), que se adjuntan a los recursos. Puedes adjuntar solo una política de permiso a cada recurso. La política de permisos controla el acceso al recurso, así como a todos los subordinados de ese recurso que heredan la política.

Para obtener más información sobre las políticas de permisos, consulta Estructura de la política en la documentación de IAM.

En este documento, se supone que estás familiarizado con Identity and Access Management (IAM) en Trusted Cloud by S3NS.

Limitaciones

  • Las listas de control de acceso (LCA) de rutina no se incluyen en las rutinas replicadas.
  • Las rutinas dentro de conjuntos de datos externos o vinculados no admiten controles de acceso.
  • Las tablas dentro de conjuntos de datos externos o vinculados no admiten controles de acceso.
  • Los controles de acceso rutina no se pueden configurar con Terraform.
  • No se pueden establecer controles de acceso de rutina con el SDK de Google Cloud.
  • Los controles de acceso de rutina no se pueden configurar con el lenguaje de control de datos (DCL) de BigQuery.
  • Data Catalog no admite controles de acceso de rutina. Si un usuario otorgó acceso condicional a nivel de la rutina, no verá sus rutinas en el panel lateral de BigQuery. Como solución alternativa, otorga acceso a nivel del conjunto de datos.
  • La vista INFORMATION_SCHEMA.OBJECT_PRIVILEGES no muestra los controles de acceso para las rutinas.

Antes de comenzar

Otorga funciones de Identity and Access Management (IAM) que les brindan a los usuarios los permisos necesarios para realizar cada tarea de este documento.

Roles requeridos

Para obtener los permisos que necesitas para modificar las políticas de IAM para los recursos, pídele a tu administrador que te otorgue el rol de IAM Propietario de datos de BigQuery (roles/bigquery.dataOwner) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para cambiar las políticas de IAM de los recursos. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para cambiar las políticas de IAM para los recursos:

  • Para configurar la política de acceso de un conjunto de datos: bigquery.datasets.get
  • Para configurar la política de acceso de un conjunto de datos: bigquery.datasets.update
  • Para obtener la política de acceso de un conjunto de datos (solo en la consola deTrusted Cloud ): bigquery.datasets.getIamPolicy
  • Para configurar la política de acceso de un conjunto de datos (solo en la consola): bigquery.datasets.setIamPolicy
  • Para obtener la política de una tabla o vista: bigquery.tables.getIamPolicy
  • Para establecer la política de una tabla o vista: bigquery.tables.setIamPolicy
  • Para obtener la política de acceso de una rutina, haz lo siguiente: bigquery.routines.getIamPolicy
  • Para establecer la política de acceso de una rutina, haz lo siguiente: bigquery.routines.setIamPolicy
  • Para crear la herramienta o los trabajos de BigQuery de SQL bigquery.jobs.create (opcional):

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

Trabaja con los controles de acceso al conjunto de datos

Puedes otorgar acceso a un conjunto de datos otorgando a un principal de IAM un rol predefinido o personalizado que determine lo que el principal puede hacer con el conjunto de datos. Esto también se conoce como adjuntar una política de permiso a un recurso. Después de otorgar acceso, puedes ver los controles de acceso del conjunto de datos y revocar el acceso a él.

Otorga acceso a un conjunto de datos

No puedes otorgar acceso a un conjunto de datos cuando lo creas con la IU web de BigQuery o la herramienta de línea de comandos de bq. Primero debes crear el conjunto de datos y, luego, otorgar acceso a él. La API te permite otorgar acceso durante la creación del conjunto de datos llamando al método datasets.insert con un recurso de conjunto de datos definido.

Un proyecto es el recurso principal de un conjunto de datos, y un conjunto de datos es el recurso principal de las tablas y vistas, las rutinas y los modelos. Cuando otorgas un rol a nivel del proyecto, el rol y sus permisos son heredados por el conjunto de datos y por los recursos del conjunto de datos. Del mismo modo, cuando otorgas un rol a nivel del conjunto de datos, los recursos dentro del conjunto de datos heredan el rol y sus permisos.

Puedes proporcionar acceso a un conjunto de datos otorgando un permiso de rol de IAM para acceder a él o otorgando acceso de forma condicional con una condición de IAM. Para obtener más información sobre cómo otorgar acceso condicional, consulta Controla el acceso con las Condiciones de IAM.

Para otorgar acceso a un rol de IAM a un conjunto de datos sin usar condiciones, selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos para compartir.

  3. Haz clic en Compartir > Permisos.

  4. Haz clic en Agregar principal.

  5. En el campo Principales nuevos, escribe un principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Guardar.

  8. Para volver a la información del conjunto de datos, haz clic en Cerrar.

SQL

Para otorgar a las principales acceso a los conjuntos de datos, usa la declaración DCL GRANT:

  1. En la consola de Trusted Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: Un rol o una lista de roles separados por comas que deseas otorgar
    • RESOURCE_NAME: Es el nombre del conjunto de datos al que otorgas acceso.
    • USER_LIST: una lista separada por comas de los usuarios a los que se otorga el rol

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se otorga el rol de visualizador de datos de BigQuery a myDataset:

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para escribir la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq show:

    bq show \
        --format=prettyjson \
        PROJECT_ID:DATASET > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local
  3. Realiza cambios a la sección access del archivo JSON. Puedes agregar a cualquiera de las entradas specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes agregar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección access de un archivo JSON de un conjunto de datos se vería de la siguiente manera:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
  4. Cuando termines de editar, usa el comando bq update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es el predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: PROJECT_ID:DATASET.

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. Para verificar los cambios del control de acceso, usa otra vez el comando bq show sin escribir la información en un archivo.

    bq show --format=prettyjson PROJECT_ID:DATASET
  6. Terraform

    Usa los recursos google_bigquery_dataset_iam para actualizar el acceso a una conjunto de datos.

    Configura la política de control de acceso de un recurso

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_policy para establecer la política de IAM para el conjunto de datos mydataset. Esto reemplaza cualquier política existente ya adjunta al conjunto de datos:

    # This file sets the IAM policy for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    data "google_iam_policy" "iam_policy" {
      binding {
        role = "roles/bigquery.admin"
        members = [
          "user:user@example.com",
        ]
      }
      binding {
        role = "roles/bigquery.dataOwner"
        members = [
          "group:data.admin@example.com",
        ]
      }
      binding {
        role = "roles/bigquery.dataEditor"
        members = [
          "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.s3ns-system.iam.gserviceaccount.com",
        ]
      }
    }
    
    resource "google_bigquery_dataset_iam_policy" "dataset_iam_policy" {
      dataset_id  = google_bigquery_dataset.default.dataset_id
      policy_data = data.google_iam_policy.iam_policy.policy_data
    }

    Establece la membresía de roles para un conjunto de datos

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_binding para establecer la membresía en un rol determinado para el conjunto de datos mydataset. Esto reemplaza cualquier membresía existente en ese rol. Se conservan otros roles dentro de la política de IAM para el conjunto de datos:

    # This file sets membership in an IAM role for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    resource "google_bigquery_dataset_iam_binding" "dataset_iam_binding" {
      dataset_id = google_bigquery_dataset.default.dataset_id
      role       = "roles/bigquery.jobUser"
    
      members = [
        "user:user@example.com",
        "group:group@example.com"
      ]
    }

    Establece la membresía de roles para una sola principal

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_member para actualizar la política de IAM del conjunto de datos mydataset para otorgar un rol a un principal. La actualización de esta política de IAM no afecta el acceso de ningún otro principal al que se le haya otorgado ese rol para el conjunto de datos.

    # This file adds a member to an IAM role for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    resource "google_bigquery_dataset_iam_member" "dataset_iam_member" {
      dataset_id = google_bigquery_dataset.default.dataset_id
      role       = "roles/bigquery.user"
      member     = "user:user@example.com"
    }

    Para aplicar tu configuración de Terraform en un proyecto Trusted Cloud , completa los pasos de las siguientes secciones.

    Prepara Cloud Shell

    1. Inicia Cloud Shell
    2. Establece el proyecto Trusted Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

      Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

    Prepara el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

      Copia el código de muestra en el main.tf recién creado.

      De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

    3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
    4. Guarda los cambios.
    5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
      terraform init

      De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

      terraform init -upgrade

    Aplica los cambios

    1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
      terraform plan

      Corrige la configuración según sea necesario.

    2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
      terraform apply

      Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

    3. Abre tu proyecto Trusted Cloud para ver los resultados. En la consola de Trusted Cloud , navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

    API

    Para aplicar los controles de acceso cuando se crea el conjunto de datos, llama al método datasets.insert con un recurso de conjunto de datos definido. Para actualizar tus controles de acceso, llama al método datasets.patch y usa la propiedad access en el recurso Dataset.

    Debido a que el método datasets.update reemplaza todo el recurso de conjunto de datos, es preferible usar el método datasets.patch para actualizar los controles de acceso.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Establece la nueva lista de acceso agregando la nueva entrada a la lista existente con el tipo DatasetMetadataToUpdate . Luego, llama a la función dataset.Update() para actualizar la propiedad.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // grantAccessToDataset creates a new ACL conceding the READER role to the group "example-analyst-group@google.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func grantAccessToDataset(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create BigQuery handler.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Create dataset handler
    	dataset := client.Dataset(datasetID)
    
    	// Get metadata
    	meta, err := dataset.Metadata(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Metadata: %w", err)
    	}
    
    	// Find more details about BigQuery Entity Types here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#EntityType
    	//
    	// Find more details about BigQuery Access Roles here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#AccessRole
    
    	entityType := bigquery.GroupEmailEntity
    	entityID := "example-analyst-group@google.com"
    	roleType := bigquery.ReaderRole
    
    	// Append a new access control entry to the existing access list.
    	update := bigquery.DatasetMetadataToUpdate{
    		Access: append(meta.Access, &bigquery.AccessEntry{
    			Role:       roleType,
    			EntityType: entityType,
    			Entity:     entityID,
    		}),
    	}
    
    	// Leverage the ETag for the update to assert there's been no modifications to the
    	// dataset since the metadata was originally read.
    	meta, err = dataset.Update(ctx, update, meta.ETag)
    	if err != nil {
    		return err
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
    	for _, access := range meta.Access {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", access.Role)
    		fmt.Fprintf(w, "Entities: %v\n", access.Entity)
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.Acl.Entity;
    import com.google.cloud.bigquery.Acl.Group;
    import com.google.cloud.bigquery.Acl.Role;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import com.google.cloud.bigquery.DatasetId;
    import java.util.ArrayList;
    import java.util.List;
    
    public class GrantAccessToDataset {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project and dataset from which to get the access policy
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        // Group to add to the ACL
        String entityEmail = "group-to-add@example.com";
    
        grantAccessToDataset(projectId, datasetName, entityEmail);
      }
    
      public static void grantAccessToDataset(
          String projectId, String datasetName, String entityEmail) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create datasetId with the projectId and the datasetName.
          DatasetId datasetId = DatasetId.of(projectId, datasetName);
          Dataset dataset = bigquery.getDataset(datasetId);
    
          // Create a new Entity with the corresponding type and email
          // "user-or-group-to-add@example.com"
          // For more information on the types of Entities available see:
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
          // and
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
          Entity entity = new Group(entityEmail);
    
          // Create a new ACL granting the READER role to the group with the entity email
          // "user-or-group-to-add@example.com"
          // For more information on the types of ACLs available see:
          // https://cloud.google.com/storage/docs/access-control/lists
          Acl newEntry = Acl.of(entity, Role.READER);
    
          // Get a copy of the ACLs list from the dataset and append the new entry.
          List<Acl> acls = new ArrayList<>(dataset.getAcl());
          acls.add(newEntry);
    
          // Update the ACLs by setting the new list.
          Dataset updatedDataset = bigquery.update(dataset.toBuilder().setAcl(acls).build());
          System.out.println(
              "ACLs of dataset \""
                  + updatedDataset.getDatasetId().getDataset()
                  + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("ACLs were not updated \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Configura la nueva lista de acceso agregando la nueva entrada a la lista existente con el método Dataset#metadata. Luego, llama a la función Dataset#setMetadata() para actualizar la propiedad.
    
    /**
     * TODO(developer): Update and un-comment below lines.
     */
    
    // const datasetId = "my_project_id.my_dataset_name";
    
    // ID of the user or group from whom you are adding access.
    // const entityId = "user-or-group-to-add@example.com";
    
    // One of the "Basic roles for datasets" described here:
    // https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    // const role = "READER";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    // Type of entity you are granting access to.
    // Find allowed allowed entity type names here:
    // https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource:-dataset
    const entityType = 'groupByEmail';
    
    async function grantAccessToDataset() {
      const [dataset] = await client.dataset(datasetId).get();
    
      // The 'access entries' array is immutable. Create a copy for modifications.
      const entries = [...dataset.metadata.access];
    
      // Append an AccessEntry to grant the role to a dataset.
      // Find more details about the AccessEntry object in the BigQuery documentation:
      // https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
      entries.push({
        role,
        [entityType]: entityId,
      });
    
      // Assign the array of AccessEntries back to the dataset.
      const metadata = {
        access: entries,
      };
    
      // Update will only succeed if the dataset
      // has not been modified externally since retrieval.
      //
      // See the BigQuery client library documentation for more details on metadata updates:
      // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
    
      // Update just the 'access entries' property of the dataset.
      await client.dataset(datasetId).setMetadata(metadata);
    
      console.log(
        `Role '${role}' granted for entity '${entityId}' in '${datasetId}'.`
      );
    }

    Python

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Configura la propiedad dataset.access_entries con los controles de acceso para un conjunto de datos. Luego, llama a la función client.update_dataset() para actualizar la propiedad.
    from google.api_core.exceptions import PreconditionFailed
    from google.cloud import bigquery
    from google.cloud.bigquery.enums import EntityTypes
    
    # TODO(developer): Update and uncomment the lines below.
    
    # ID of the dataset to grant access to.
    # dataset_id = "my_project_id.my_dataset"
    
    # ID of the user or group receiving access to the dataset.
    # Alternatively, the JSON REST API representation of the entity,
    # such as the view's table reference.
    # entity_id = "user-or-group-to-add@example.com"
    
    # One of the "Basic roles for datasets" described here:
    # https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    # role = "READER"
    
    # Type of entity you are granting access to.
    # Find allowed allowed entity type names here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/enums#class-googlecloudbigqueryenumsentitytypesvalue
    entity_type = EntityTypes.GROUP_BY_EMAIL
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # Get a reference to the dataset.
    dataset = client.get_dataset(dataset_id)
    
    # The `access_entries` list is immutable. Create a copy for modifications.
    entries = list(dataset.access_entries)
    
    # Append an AccessEntry to grant the role to a dataset.
    # Find more details about the AccessEntry object here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
    entries.append(
        bigquery.AccessEntry(
            role=role,
            entity_type=entity_type,
            entity_id=entity_id,
        )
    )
    
    # Assign the list of AccessEntries back to the dataset.
    dataset.access_entries = entries
    
    # Update will only succeed if the dataset
    # has not been modified externally since retrieval.
    #
    # See the BigQuery client library documentation for more details on `update_dataset`:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
    try:
        # Update just the `access_entries` property of the dataset.
        dataset = client.update_dataset(
            dataset,
            ["access_entries"],
        )
    
        # Show a success message.
        full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
        print(
            f"Role '{role}' granted for entity '{entity_id}'"
            f" in dataset '{full_dataset_id}'."
        )
    except PreconditionFailed:  # A read-modify-write error
        print(
            f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
            "Fetch the latest version and retry."
        )

Roles predefinidos que otorgan acceso a conjuntos de datos

Puedes otorgar acceso a un conjunto de datos con los siguientes roles predefinidos de IAM.

Rol Descripción
Propietario de datos de BigQuery (roles/bigquery.dataOwner) Cuando se otorga en un conjunto de datos, este rol otorga los siguientes permisos:
  • Todos los permisos para el conjunto de datos y para todos los recursos dentro del conjunto de datos: tablas y vistas, modelos y rutinas.
Editor de datos de BigQuery (roles/bigquery.dataEditor) Cuando se otorga en un conjunto de datos, este rol otorga los siguientes permisos:
  • Obtén los metadatos y los permisos del conjunto de datos.
  • Para tablas y vistas, haz lo siguiente:
    • Crear, actualizar, obtener, enumerar y borrar las tablas y las vistas del conjunto de datos
    • Leer (consultar), exportar, replicar y actualizar datos de tablas
    • Crear, actualizar y borrar índices
    • Crear y restablecer instantáneas
  • Son todos los permisos para las rutinas y los modelos del conjunto de datos.
Visualizador de datos de BigQuery (roles/bigquery.dataViewer) Cuando se otorga en un conjunto de datos, este rol otorga los siguientes permisos:
  • Obtén los metadatos y los permisos del conjunto de datos.
  • Enumera las tablas, las vistas y los modelos de un conjunto de datos.
  • Obtener los metadatos y los controles de acceso para las tablas y vistas del conjunto de datos
  • Leer (consultar), replicar y exportar datos de tablas, y crear instantáneas
  • Enumera e invoca las rutinas del conjunto de datos.
Visualizador de metadatos de BigQuery (roles/bigquery.metadataViewer) Cuando se otorga en un conjunto de datos, este rol otorga los siguientes permisos:
  • Obtén los metadatos y los controles de acceso del conjunto de datos.
  • Obtén metadatos y controles de acceso para tablas y vistas.
  • Obtener metadatos de los modelos y las rutinas del conjunto de datos
  • Enumera las tablas, las vistas, los modelos y las rutinas del conjunto de datos.

Permisos del conjunto de datos

La mayoría de los permisos que comienzan con bigquery.datasets se aplican a nivel del conjunto de datos. bigquery.datasets.create no lo hace. Para crear conjuntos de datos, se debe otorgar el permiso bigquery.datasets.create a un rol en el contenedor principal, es decir, el proyecto.

En la siguiente tabla, se enumeran todos los permisos para los conjuntos de datos y el recurso de nivel más bajo al que se puede aplicar el permiso.

Permiso Recurso Acción
bigquery.datasets.create Proyecto Crear conjuntos de datos nuevos en el proyecto
bigquery.datasets.get Conjunto de datos Obtén los metadatos y los controles de acceso del conjunto de datos. Visualizar permisos en la consola también requiere el permiso bigquery.datasets.getIamPolicy.
bigquery.datasets.getIamPolicy Conjunto de datos La consola lo requiere para otorgar al usuario permiso para obtener los controles de acceso de un conjunto de datos. Esto permitirá abrir la falla. La consola también requiere el permiso bigquery.datasets.get para ver el conjunto de datos.
bigquery.datasets.update Conjunto de datos Actualiza los metadatos y los controles de acceso del conjunto de datos. La actualización de los controles de acceso en la consola también requiere el permiso bigquery.datasets.setIamPolicy.
bigquery.datasets.setIamPolicy Conjunto de datos La consola lo requiere para otorgar al usuario permiso para establecer los controles de acceso de un conjunto de datos. Esto permitirá abrir la falla. La consola también requiere el permiso bigquery.datasets.update para actualizar el conjunto de datos.
bigquery.datasets.delete Conjunto de datos Borra un conjunto de datos.
bigquery.datasets.createTagBinding Conjunto de datos Adjunta etiquetas al conjunto de datos.
bigquery.datasets.deleteTagBinding Conjunto de datos Desvincula etiquetas del conjunto de datos.
bigquery.datasets.listTagBindings Conjunto de datos Enumera las etiquetas del conjunto de datos.
bigquery.datasets.listEffectiveTags Conjunto de datos Enumera las etiquetas eficaces (aplicadas y heredadas) para el conjunto de datos.
bigquery.datasets.link Conjunto de datos Crea un conjunto de datos vinculado.
bigquery.datasets.listSharedDatasetUsage Proyecto Enumera las estadísticas de uso de los conjuntos de datos compartidos a los que tienes acceso en el proyecto. Este permiso es obligatorio para consultar la vista INFORMATION_SCHEMA.SHARED_DATASET_USAGE.

Cómo ver los controles de acceso de un conjunto de datos

Para ver los controles de acceso establecidos de forma explícita para un conjunto de datos, elige una de las siguientes opciones. Para ver los roles heredados de un conjunto de datos, usa la IU web de BigQuery.

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. Haz clic en Compartir > Permisos.

    Los controles de acceso del conjunto de datos aparecen en el panel Permisos del conjunto de datos.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para obtener una política existente y enviarla a un archivo local en JSON, usa el comando bq show en Cloud Shell:

    bq show \
       --format=prettyjson \
       PROJECT_ID:DATASET > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local
  3. SQL

    Consulta la vista INFORMATION_SCHEMA.OBJECT_PRIVILEGES. Las consultas para recuperar los controles de acceso de un conjunto de datos deben especificar el object_name.

    1. En la consola de Trusted Cloud , ve a la página BigQuery.

      Ir a BigQuery

    2. En el editor de consultas, escribe la siguiente oración:

      SELECT
      COLUMN_LIST
      FROM
        PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
      WHERE
      object_name = "DATASET";

      Reemplaza lo siguiente:

    3. Haz clic en Ejecutar.

    Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

    Ejemplo:

    Esta consulta obtiene los controles de acceso para mydataset.

    SELECT
    object_name, privilege_type, grantee
    FROM
    my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_name = "mydataset";

    El resultado debe verse de la siguiente manera:

    +------------------+-----------------------------+-------------------------+
    |   object_name    |  privilege_type             | grantee                 |
    +------------------+-----------------------------+-------------------------+
    | mydataset        | roles/bigquery.dataOwner    | projectOwner:myproject  |
    | mydataset        | roles/bigquery.dataViwer    | user:user@example.com   |
    +------------------+-----------------------------+-------------------------+
    

    API

    Para ver los controles de acceso de un conjunto de datos, llama al método datasets.get con un recurso dataset definido.

    Los controles de acceso aparecen en la propiedad access del recurso dataset.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la funciónclient.Dataset().Metadata(). La política de acceso está disponible en la propiedad Access.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // viewDatasetAccessPolicies retrieves the ACL for the given dataset
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func viewDatasetAccessPolicies(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create new client.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get dataset's metadata.
    	meta, err := client.Dataset(datasetID).Metadata(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Client.Dataset.Metadata: %w", err)
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
    
    	// Iterate over access permissions.
    	for _, access := range meta.Access {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", access.Role)
    		fmt.Fprintf(w, "Entity: %v\n", access.Entity)
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    
    import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import com.google.cloud.bigquery.DatasetId;
    import java.util.List;
    
    public class GetDatasetAccessPolicy {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project and dataset from which to get the access policy.
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        getDatasetAccessPolicy(projectId, datasetName);
      }
    
      public static void getDatasetAccessPolicy(String projectId, String datasetName) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create datasetId with the projectId and the datasetName.
          DatasetId datasetId = DatasetId.of(projectId, datasetName);
          Dataset dataset = bigquery.getDataset(datasetId);
    
          // Show ACL details.
          // Find more information about ACL and the Acl Class here:
          // https://cloud.google.com/storage/docs/access-control/lists
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl
          List<Acl> acls = dataset.getAcl();
          System.out.println("ACLs in dataset \"" + dataset.getDatasetId().getDataset() + "\":");
          System.out.println(acls.toString());
          for (Acl acl : acls) {
            System.out.println();
            System.out.println("Role: " + acl.getRole());
            System.out.println("Entity: " + acl.getEntity());
          }
        } catch (BigQueryException e) {
          System.out.println("ACLs info not retrieved. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Recupera los metadatos del conjunto de datos con la función Dataset#getMetadata(). La política de acceso está disponible en la propiedad de acceso del objeto de metadatos resultante.
    
    /**
     * TODO(developer): Update and un-comment below lines
     */
    // const datasetId = "my_project_id.my_dataset";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const bigquery = new BigQuery();
    
    async function viewDatasetAccessPolicy() {
      const dataset = bigquery.dataset(datasetId);
    
      const [metadata] = await dataset.getMetadata();
      const accessEntries = metadata.access || [];
    
      // Show the list of AccessEntry objects.
      // More details about the AccessEntry object in the BigQuery documentation:
      // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
      console.log(
        `${accessEntries.length} Access entries in dataset '${datasetId}':`
      );
      for (const accessEntry of accessEntries) {
        console.log(`Role: ${accessEntry.role || 'null'}`);
        console.log(`Special group: ${accessEntry.specialGroup || 'null'}`);
        console.log(`User by Email: ${accessEntry.userByEmail || 'null'}`);
      }
    }

    Python

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función client.get_dataset(). La política de acceso está disponible en la propiedad dataset.access_entries.
    from google.cloud import bigquery
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # TODO(developer): Update and uncomment the lines below.
    
    # Dataset from which to get the access policy.
    # dataset_id = "my_dataset"
    
    # Get a reference to the dataset.
    dataset = client.get_dataset(dataset_id)
    
    # Show the list of AccessEntry objects.
    # More details about the AccessEntry object here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
    print(
        f"{len(dataset.access_entries)} Access entries found "
        f"in dataset '{dataset_id}':"
    )
    
    for access_entry in dataset.access_entries:
        print()
        print(f"Role: {access_entry.role}")
        print(f"Special group: {access_entry.special_group}")
        print(f"User by Email: {access_entry.user_by_email}")

Revoca el acceso a un conjunto de datos

Para revocar el acceso a un conjunto de datos, selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. En el panel de detalles, haz clic en Compartir > Permisos.

  4. En el cuadro de diálogo Permisos del conjunto de datos, expande la principal cuyo acceso deseas revocar.

  5. Haz clic en Quitar principal.

  6. En el cuadro de diálogo ¿Quieres quitar el rol del principal?, haz clic en Quitar.

  7. Para volver a los detalles del conjunto de datos, haz clic en Cerrar.

SQL

Para quitar el acceso de una principal a un conjunto de datos, usa la declaración DCL REVOKE:

  1. En la consola de Trusted Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    REVOKE `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    FROM "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: Un rol o una lista de roles separados por comas que deseas revocar
    • RESOURCE_NAME: el nombre del recurso en el que deseas revocar el permiso
    • USER_LIST: una lista separada por comas de usuarios a los que se les revocarán los roles

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se revoca el rol de propietario de datos de BigQuery de myDataset:

REVOKE `roles/bigquery.dataOwner`
ON SCHEMA `myProject`.myDataset
FROM "group:group@example.com", "serviceAccount:user@test-project.s3ns-system.iam.gserviceaccount.com"

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para escribir la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq show:

    bq show \
        --format=prettyjson \
        PROJECT_ID:DATASET > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local
  3. Realiza cambios a la sección access del archivo JSON. Puedes quitar cualquiera de las entradas de specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes quitar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección access de un archivo JSON de un conjunto de datos se vería de la siguiente manera:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
  4. Cuando termines de editar, usa el comando bq update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es el predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: PROJECT_ID:DATASET.

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. Para verificar los cambios del control de acceso, usa el comando show sin escribir la información en un archivo:

    bq show --format=prettyjson PROJECT_ID:DATASET
  6. API

    Llama al método datasets.patch y usa la propiedad access en el recurso Dataset para actualizar tus controles de acceso.

    Debido a que el método datasets.update reemplaza todo el recurso de conjunto de datos, es preferible usar el método datasets.patch para actualizar los controles de acceso.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Establece la nueva lista de acceso quitando la entrada de la lista existente con el tipoDatasetMetadataToUpdate . Luego, llama a la función dataset.Update() para actualizar la propiedad.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // revokeAccessToDataset creates a new ACL removing the dataset access to "example-analyst-group@google.com" entity
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func revokeAccessToDataset(w io.Writer, projectID, datasetID, entity string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// entity := "user@mydomain.com"
    
    	ctx := context.Background()
    
    	// Create BigQuery client.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get dataset handler
    	dataset := client.Dataset(datasetID)
    
    	// Get dataset metadata
    	meta, err := dataset.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    
    	// Create new access entry list by copying the existing and omiting the access entry entity value
    	var newAccessList []*bigquery.AccessEntry
    	for _, entry := range meta.Access {
    		if entry.Entity != entity {
    			newAccessList = append(newAccessList, entry)
    		}
    	}
    
    	// Only proceed with update if something in the access list was removed.
    	// Additionally, we use the ETag from the initial metadata to ensure no
    	// other changes were made to the access list in the interim.
    	if len(newAccessList) < len(meta.Access) {
    		update := bigquery.DatasetMetadataToUpdate{
    			Access: newAccessList,
    		}
    		meta, err = dataset.Update(ctx, update, meta.ETag)
    		if err != nil {
    			return err
    		}
    	} else {
    		return fmt.Errorf("any access entry was revoked")
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
    
    	for _, access := range meta.Access {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", access.Role)
    		fmt.Fprintf(w, "Entity: %v\n", access.Entity)
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    
    import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.Acl.Entity;
    import com.google.cloud.bigquery.Acl.Group;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import com.google.cloud.bigquery.DatasetId;
    import java.util.List;
    
    public class RevokeDatasetAccess {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project and dataset from which to get the access policy.
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        // Group to remove from the ACL
        String entityEmail = "group-to-remove@example.com";
    
        revokeDatasetAccess(projectId, datasetName, entityEmail);
      }
    
      public static void revokeDatasetAccess(String projectId, String datasetName, String entityEmail) {
        try {
          // Initialize client that will be used to send requests. This client only needs
          // to be created once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create datasetId with the projectId and the datasetName.
          DatasetId datasetId = DatasetId.of(projectId, datasetName);
          Dataset dataset = bigquery.getDataset(datasetId);
    
          // Create a new Entity with the corresponding type and email
          // "user-or-group-to-remove@example.com"
          // For more information on the types of Entities available see:
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
          // and
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
          Entity entity = new Group(entityEmail);
    
          // To revoke access to a dataset, remove elements from the Acl list.
          // Find more information about ACL and the Acl Class here:
          // https://cloud.google.com/storage/docs/access-control/lists
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl
          // Remove the entity from the ACLs list.
          List<Acl> acls =
              dataset.getAcl().stream().filter(acl -> !acl.getEntity().equals(entity)).toList();
    
          // Update the ACLs by setting the new list.
          bigquery.update(dataset.toBuilder().setAcl(acls).build());
          System.out.println("ACLs of \"" + datasetName + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("ACLs were not updated \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Actualiza la lista de acceso al conjunto de datos quitando la entrada especificada de la lista existente con el método Dataset#get() para recuperar los metadatos actuales. Modifica la propiedad de acceso para excluir la entidad deseada y, luego, llama a la función Dataset#setMetadata() para aplicar la lista de acceso actualizada.
    
    /**
     * TODO(developer): Update and un-comment below lines
     */
    
    // const datasetId = "my_project_id.my_dataset"
    
    // ID of the user or group from whom you are revoking access.
    // const entityId = "user-or-group-to-remove@example.com"
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const bigquery = new BigQuery();
    
    async function revokeDatasetAccess() {
      const [dataset] = await bigquery.dataset(datasetId).get();
    
      // To revoke access to a dataset, remove elements from the access list.
      //
      // See the BigQuery client library documentation for more details on access entries:
      // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
    
      // Filter access entries to exclude entries matching the specified entity_id
      // and assign a new list back to the access list.
      dataset.metadata.access = dataset.metadata.access.filter(entry => {
        return !(
          entry.entity_id === entityId ||
          entry.userByEmail === entityId ||
          entry.groupByEmail === entityId
        );
      });
    
      // Update will only succeed if the dataset
      // has not been modified externally since retrieval.
      //
      // See the BigQuery client library documentation for more details on metadata updates:
      // https://cloud.google.com/bigquery/docs/updating-datasets
    
      // Update just the 'access entries' property of the dataset.
      await dataset.setMetadata(dataset.metadata);
    
      console.log(`Revoked access to '${entityId}' from '${datasetId}'.`);
    }

    Python

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Configura la propiedad dataset.access_entries con los controles de acceso para un conjunto de datos. Luego, llama a la función client.update_dataset() para actualizar la propiedad.
    from google.cloud import bigquery
    from google.api_core.exceptions import PreconditionFailed
    
    # TODO(developer): Update and uncomment the lines below.
    
    # ID of the dataset to revoke access to.
    # dataset_id = "my-project.my_dataset"
    
    # ID of the user or group from whom you are revoking access.
    # Alternatively, the JSON REST API representation of the entity,
    # such as a view's table reference.
    # entity_id = "user-or-group-to-remove@example.com"
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # Get a reference to the dataset.
    dataset = client.get_dataset(dataset_id)
    
    # To revoke access to a dataset, remove elements from the AccessEntry list.
    #
    # See the BigQuery client library documentation for more details on `access_entries`:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.Dataset#google_cloud_bigquery_dataset_Dataset_access_entries
    
    # Filter `access_entries` to exclude entries matching the specified entity_id
    # and assign a new list back to the AccessEntry list.
    dataset.access_entries = [
        entry for entry in dataset.access_entries
        if entry.entity_id != entity_id
    ]
    
    # Update will only succeed if the dataset
    # has not been modified externally since retrieval.
    #
    # See the BigQuery client library documentation for more details on `update_dataset`:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
    try:
        # Update just the `access_entries` property of the dataset.
        dataset = client.update_dataset(
            dataset,
            ["access_entries"],
        )
    
        # Notify user that the API call was successful.
        full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
        print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")
    except PreconditionFailed:  # A read-modify-write error.
        print(
            f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
            "Fetch the latest version and retry."
        )

Trabaja con controles de acceso a tablas y vistas

Las vistas se tratan como recursos de tabla en BigQuery. Puedes proporcionar acceso a una tabla o vista otorgando a un principal de IAM un rol predefinido o personalizado que determine lo que el principal puede hacer con la tabla o vista. Esto también se conoce como adjuntar una política de permiso a un recurso. Después de otorgar acceso, puedes ver los controles de acceso de la tabla o la vista, y puedes revocar el acceso a la tabla o la vista.

Otorga acceso a una tabla o vista

Para obtener un control de acceso detallado, puedes otorgar un rol de IAM predefinido o personalizado en una tabla o vista específica. La tabla o vista también hereda los controles de acceso especificados a nivel del conjunto de datos y superiores. Por ejemplo, si le otorgas a una principal el rol de propietario de datos de BigQuery en un conjunto de datos, esa principal también tendrá permisos de propietario de datos de BigQuery en las tablas y vistas del conjunto de datos.

Para otorgar acceso a una tabla o vista, selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige una tabla o vista para compartir.

  3. Haz clic en Compartir

  4. Haz clic en Agregar principal.

  5. En el campo Principales nuevos, escribe un principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Guardar.

  8. Para volver a la tabla o ver los detalles, haz clic en Cerrar.

SQL

Para otorgar a las principales acceso a tablas o vistas, usa la declaración DCL GRANT:

  1. En la consola de Trusted Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    GRANT `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: Un rol o lista de roles separados por comas que deseas otorgar
    • RESOURCE_TYPE: El tipo de recurso al que se aplica el rol

      Los valores admitidos son TABLE, VIEW, MATERIALIZED VIEW y EXTERNAL TABLE.

    • RESOURCE_NAME: el nombre del recurso en el que deseas otorgar el permiso.
    • USER_LIST: una lista separada por comas de los usuarios a los que se otorga el rol.

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se otorga el rol de visualizador de datos de BigQuery en myTable:

GRANT `roles/bigquery.dataViewer`
ON TABLE `myProject`.myDataset.myTable
TO "user:user@example.com", "user:user2@example.com"

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para otorgar acceso a una tabla o vista, usa el comando bq add-iam-policy-binding:

    bq add-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
      --table=true RESOURCE

    Reemplaza lo siguiente:

    • MEMBER_TYPE: Es el tipo de miembro, como user, group, serviceAccount o domain.
    • MEMBER: La dirección de correo electrónico o el nombre de dominio del miembro.
    • ROLE: Es el rol que deseas otorgar al miembro.
    • RESOURCE: El nombre de la tabla o vista cuya política deseas actualizar.
  3. Terraform

    Usa los recursos google_bigquery_table_iam para actualizar el acceso a una tabla.

    Configura la política de acceso para una tabla

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_policy para establecer la política de IAM para la tabla mytable. Esto reemplaza cualquier política existente ya adjunta a la tabla:

    # This file sets the IAM policy for the table created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" table resource with a table_id of "mytable".
    
    data "google_iam_policy" "iam_policy" {
      binding {
        role = "roles/bigquery.dataOwner"
        members = [
          "user:user@example.com",
        ]
      }
    }
    
    resource "google_bigquery_table_iam_policy" "table_iam_policy" {
      dataset_id  = google_bigquery_table.default.dataset_id
      table_id    = google_bigquery_table.default.table_id
      policy_data = data.google_iam_policy.iam_policy.policy_data
    }

    Establece la membresía de roles para una tabla

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_binding para establecer la membresía en un rol determinado para la tabla mytable. Esto reemplaza cualquier membresía existente en ese rol. Se conservan otros roles dentro de la política de IAM para la tabla.

    # This file sets membership in an IAM role for the table created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" table resource with a table_id of "mytable".
    
    resource "google_bigquery_table_iam_binding" "table_iam_binding" {
      dataset_id = google_bigquery_table.default.dataset_id
      table_id   = google_bigquery_table.default.table_id
      role       = "roles/bigquery.dataOwner"
    
      members = [
        "group:group@example.com",
      ]
    }

    Establece la membresía de roles para una sola principal

    En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_member para actualizar la política de IAM de la tabla mytable para otorgar un rol a una principal. La actualización de esta política de IAM no afecta el acceso de ningún otro principal al que se le haya otorgado ese rol para el conjunto de datos.

    # This file adds a member to an IAM role for the table created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" table resource with a table_id of "mytable".
    
    resource "google_bigquery_table_iam_member" "table_iam_member" {
      dataset_id = google_bigquery_table.default.dataset_id
      table_id   = google_bigquery_table.default.table_id
      role       = "roles/bigquery.dataEditor"
      member     = "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.s3ns-system.iam.gserviceaccount.com"
    }

    Para aplicar tu configuración de Terraform en un proyecto Trusted Cloud , completa los pasos de las siguientes secciones.

    Prepara Cloud Shell

    1. Inicia Cloud Shell
    2. Establece el proyecto Trusted Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

      Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

    Prepara el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

      Copia el código de muestra en el main.tf recién creado.

      De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

    3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
    4. Guarda los cambios.
    5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
      terraform init

      De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

      terraform init -upgrade

    Aplica los cambios

    1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
      terraform plan

      Corrige la configuración según sea necesario.

    2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
      terraform apply

      Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

    3. Abre tu proyecto Trusted Cloud para ver los resultados. En la consola de Trusted Cloud , navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

    API

    1. Para recuperar la política actual, llama al método tables.getIamPolicy.

    2. Edita la política para agregar miembros o controles de acceso, o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

    3. Llama a tables.setIamPolicy para escribir la política actualizada.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función IAM().SetPolicy() del recurso para guardar los cambios en la política de acceso de una tabla o vista.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"cloud.google.com/go/iam"
    )
    
    // grantAccessToResource creates a new ACL conceding the VIEWER role to the group "example-analyst-group@google.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func grantAccessToResource(w io.Writer, projectID, datasetID, resourceID string) error {
    	// Resource can be a table or a view
    	//
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// resourceID := "myresource"
    
    	ctx := context.Background()
    
    	// Create new client
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get resource policy.
    	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	// Find more details about IAM Roles here:
    	// https://pkg.go.dev/cloud.google.com/go/iam#RoleName
    	entityID := "example-analyst-group@google.com"
    	roleType := iam.Viewer
    
    	// Add new policy.
    	policy.Add(fmt.Sprintf("group:%s", entityID), roleType)
    
    	// Update resource's policy.
    	err = client.Dataset(datasetID).Table(resourceID).IAM().SetPolicy(ctx, policy)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	// Get resource policy again expecting the update.
    	policy, err = client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)
    
    	for _, role := range policy.Roles() {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", role)
    		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    import com.google.cloud.Identity;
    import com.google.cloud.Policy;
    import com.google.cloud.Role;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.TableId;
    
    public class GrantAccessToTableOrView {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project, dataset and resource (table or view) from which to get the access policy.
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        String resourceName = "MY_TABLE_NAME";
        // Role to add to the policy access
        Role role = Role.of("roles/bigquery.dataViewer");
        // Identity to add to the policy access
        Identity identity = Identity.user("user-add@example.com");
        grantAccessToTableOrView(projectId, datasetName, resourceName, role, identity);
      }
    
      public static void grantAccessToTableOrView(
          String projectId, String datasetName, String resourceName, Role role, Identity identity) {
        try {
          // Initialize client that will be used to send requests. This client only needs
          // to be created once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create table identity given the projectId, the datasetName and the resourceName.
          TableId tableId = TableId.of(projectId, datasetName, resourceName);
    
          // Add new user identity to current IAM policy.
          Policy policy = bigquery.getIamPolicy(tableId);
          policy = policy.toBuilder().addIdentity(role, identity).build();
    
          // Update the IAM policy by setting the new one.
          bigquery.setIamPolicy(tableId, policy);
    
          System.out.println("IAM policy of resource \"" + resourceName + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("IAM policy was not updated. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función Table#getIamPolicy() para recuperar la política de IAM actual de una tabla o vista, modifica la política agregando vinculaciones nuevas y, luego, usa la función Table#setIamPolicy() para guardar los cambios en la política de acceso.
    
    /**
     * TODO(developer): Update and un-comment below lines
     */
    // const projectId = "YOUR_PROJECT_ID";
    // const datasetId = "YOUR_DATASET_ID";
    // const tableId = "YOUR_TABLE_ID";
    // const principalId = "YOUR_PRINCIPAL_ID";
    // const role = "YOUR_ROLE";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    async function grantAccessToTableOrView() {
      const dataset = client.dataset(datasetId);
      const table = dataset.table(tableId);
    
      // Get the IAM access policy for the table or view.
      const [policy] = await table.getIamPolicy();
    
      // Initialize bindings array.
      if (!policy.bindings) {
        policy.bindings = [];
      }
    
      // To grant access to a table or view
      // add bindings to the Table or View policy.
      //
      // Find more details about Policy and Binding objects here:
      // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
      // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Binding
      const binding = {
        role,
        members: [principalId],
      };
      policy.bindings.push(binding);
    
      // Set the IAM access policy with updated bindings.
      await table.setIamPolicy(policy);
    
      // Show a success message.
      console.log(
        `Role '${role}' granted for principal '${principalId}' on resource '${datasetId}.${tableId}'.`
      );
    }
    
    await grantAccessToTableOrView();

    Python

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función client.set_iam_policy() para guardar los cambios en la política de acceso de una tabla o vista.
    from google.cloud import bigquery
    
    # TODO(developer): Update and uncomment the lines below.
    
    # Google Cloud Platform project.
    # project_id = "my_project_id"
    
    # Dataset where the table or view is.
    # dataset_id = "my_dataset"
    
    # Table or view name to get the access policy.
    # resource_name = "my_table"
    
    # Principal to grant access to a table or view.
    # For more information about principal identifiers see:
    # https://cloud.google.com/iam/docs/principal-identifiers
    # principal_id = "user:bob@example.com"
    
    # Role to grant to the principal.
    # For more information about BigQuery roles see:
    # https://cloud.google.com/bigquery/docs/access-control
    # role = "roles/bigquery.dataViewer"
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # Get the full table or view name.
    full_resource_name = f"{project_id}.{dataset_id}.{resource_name}"
    
    # Get the IAM access policy for the table or view.
    policy = client.get_iam_policy(full_resource_name)
    
    # To grant access to a table or view, add bindings to the IAM policy.
    #
    # Find more details about Policy and Binding objects here:
    # https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
    # https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Binding
    binding = {
        "role": role,
        "members": [principal_id, ],
    }
    policy.bindings.append(binding)
    
    # Set the IAM access policy with updated bindings.
    updated_policy = client.set_iam_policy(full_resource_name, policy)
    
    # Show a success message.
    print(
        f"Role '{role}' granted for principal '{principal_id}'"
        f" on resource '{full_resource_name}'."
    )

Roles predefinidos que otorgan acceso a tablas y vistas

Las vistas se tratan como recursos de tabla en BigQuery. Para un control de acceso detallado, puedes otorgar un rol de IAM predefinido o personalizado en una tabla o vista específica. La tabla o vista también hereda los controles de acceso especificados a nivel del conjunto de datos y superiores. Por ejemplo, si le otorgas a una principal el rol de propietario de datos de BigQuery en un conjunto de datos, esa principal también tendrá permisos de propietario de datos en las tablas y las vistas del conjunto de datos.

Los siguientes roles predefinidos de IAM tienen permisos en tablas o vistas.

Rol Descripción
Propietario de datos de BigQuery (roles/bigquery.dataOwner) Cuando se otorga en una tabla o vista, este rol otorga los siguientes permisos:
  • Son todos los permisos para la tabla o la vista.
  • Todos los permisos para las políticas de acceso a filas, excepto el permiso para anular las restricciones de viaje en el tiempo.
  • Establece categorías y políticas de datos a nivel de la columna.
Editor de datos de BigQuery (roles/bigquery.dataEditor) Cuando se otorga en una tabla o vista, este rol otorga los siguientes permisos:
  • Obtener metadatos, actualizar metadatos, obtener controles de acceso y borrar la tabla o la vista
  • Obtener (consultar), exportar, replicar y actualizar datos de tablas
  • Crear, actualizar y borrar índices
  • Crear y restablecer instantáneas
Visualizador de datos de BigQuery (roles/bigquery.dataViewer) Cuando se otorga en una tabla o vista, este rol otorga los siguientes permisos:
  • Obtiene los metadatos y los controles de acceso de la tabla o la vista.
  • Obtener (consultar), exportar y replicar datos de tablas
  • Crear instantáneas
Visualizador de metadatos de BigQuery (roles/bigquery.metadataViewer) Cuando se otorga en una tabla o vista, este rol otorga los siguientes permisos:
  • Obtiene los metadatos y los controles de acceso de la tabla o la vista.

Permisos para tablas y vistas

Las vistas se tratan como recursos de tabla en BigQuery. Todos los permisos a nivel de la tabla se aplican a las vistas.

La mayoría de los permisos que comienzan con bigquery.tables se aplican a nivel de la tabla. bigquery.tables.create y bigquery.tables.list no lo hacen. Para crear y enumerar tablas o vistas, se deben otorgar los permisos bigquery.tables.create y bigquery.tables.list a un rol en un contenedor principal: el conjunto de datos o el proyecto.

En la siguiente tabla, se enumeran todos los permisos para tablas y vistas, y el recurso de nivel más bajo al que se pueden otorgar.

Permiso Recurso Acción
bigquery.tables.create Conjunto de datos Crea tablas nuevas en el conjunto de datos.
bigquery.tables.createIndex Tabla Crea un índice de búsqueda en la tabla.
bigquery.tables.deleteIndex Tabla Borra un índice de búsqueda en la tabla.
bigquery.tables.createSnapshot Tabla Crea una instantánea de la tabla. Crear una instantánea requiere varios permisos adicionales a nivel de la tabla y del conjunto de datos. Para obtener más detalles, consulta Permisos y roles para crear instantáneas de tablas.
bigquery.tables.deleteSnapshot Tabla Borra una instantánea de la tabla.
bigquery.tables.delete Tabla Borrar una tabla
bigquery.tables.createTagBinding Tabla Crea vinculaciones de etiquetas de recursos en una tabla.
bigquery.tables.deleteTagBinding Tabla Borra vinculaciones de etiquetas de recursos en una tabla.
bigquery.tables.listTagBindings Tabla Enumera las vinculaciones de etiquetas de recursos en una tabla.
bigquery.tables.listEffectiveTags Tabla Enumera las etiquetas efectivas (aplicadas y heredadas) de la tabla.
bigquery.tables.export Tabla Exporta los datos de la tabla. La ejecución de un trabajo de exportación también requiere permisos bigquery.jobs.create.
bigquery.tables.get Tabla Obtiene los metadatos de una tabla.
bigquery.tables.getData Tabla Consulta los datos de la tabla. La ejecución de un trabajo de consulta también requiere permisos bigquery.jobs.create.
bigquery.tables.getIamPolicy Tabla Obtiene los controles de acceso para la tabla.
bigquery.tables.list Conjunto de datos Enumera todas las tablas y los metadatos de las tablas en el conjunto de datos.
bigquery.tables.replicateData Tabla Replica los datos de la tabla. Este permiso es necesario para crear vistas materializadas de réplica.
bigquery.tables.restoreSnapshot Tabla Restablece una instantánea de tabla.
bigquery.tables.setCategory Tabla Establece etiquetas de política en el esquema de la tabla.
bigquery.tables.setColumnDataPolicy Tabla Establece políticas de acceso a nivel de la columna en una tabla.
bigquery.tables.setIamPolicy Tabla Establece controles de acceso en una tabla.
bigquery.tables.update Tabla Actualiza la tabla. metadata. bigquery.tables.get también es necesario para actualizar los metadatos de la tabla en la consola.
bigquery.tables.updateData Tabla Actualiza los datos de las tablas.
bigquery.tables.updateIndex Tabla Actualiza un índice de búsqueda en la tabla.

Visualiza los controles de acceso para una tabla o vista

Para ver los controles de acceso de una tabla o vista, elige una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y un conjunto de datos, y selecciona una tabla o vista.

  3. Haz clic en Compartir

    Los controles de acceso a la tabla o la vista aparecen en el panel Compartir.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para obtener una política de acceso existente y enviarla a un archivo local en JSON, usa el comando bq get-iam-policy en Cloud Shell:

    bq get-iam-policy \
        --table=true \
        PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • RESOURCE: el nombre de la tabla o vista cuya política deseas ver
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local
  3. SQL

    Consulta la vista INFORMATION_SCHEMA.OBJECT_PRIVILEGES. Las consultas para recuperar los controles de acceso de una tabla o vista deben especificar object_schema y object_name.

    1. En la consola de Trusted Cloud , ve a la página BigQuery.

      Ir a BigQuery

    2. En el editor de consultas, escribe la siguiente oración:

      SELECT
      COLUMN_LIST
      FROM
        PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
      WHERE
      object_schema = "DATASET" AND object_name = "TABLE";

      Reemplaza lo siguiente:

    3. Haz clic en Ejecutar.

    Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

    Ejemplo:

    SELECT
    object_name, privilege_type, grantee
    FROM
    my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_schema = "mydataset" AND object_name = "mytable";
    +------------------+-----------------------------+--------------------------+
    |   object_name    |  privilege_type             | grantee                  |
    +------------------+-----------------------------+--------------------------+
    | mytable          | roles/bigquery.dataEditor   | group:group@example.com|
    | mytable          | roles/bigquery.dataOwner    | user:user@example.com|
    +------------------+-----------------------------+--------------------------+
    

    API

    Para recuperar la política actual, llama al método tables.getIamPolicy.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función IAM().Policy() del recurso. Luego, llama a la función Roles() para obtener la política de acceso de una tabla o vista.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // viewTableOrViewAccessPolicies retrieves the ACL for the given resource
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func viewTableOrViewAccessPolicies(w io.Writer, projectID, datasetID, resourceID string) error {
    	// Resource can be a table or a view
    	//
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "my-dataset-id"
    	// resourceID := "my-resource-id"
    
    	ctx := context.Background()
    
    	// Create new client.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get resource's policy access.
    	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)
    
    	for _, role := range policy.Roles() {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", role)
    		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    
    import com.google.cloud.Policy;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.TableId;
    
    public class GetTableOrViewAccessPolicy {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project, dataset and resource (table or view) from which to get the access policy.
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        String resourceName = "MY_RESOURCE_NAME";
        getTableOrViewAccessPolicy(projectId, datasetName, resourceName);
      }
    
      public static void getTableOrViewAccessPolicy(
          String projectId, String datasetName, String resourceName) {
        try {
          // Initialize client that will be used to send requests. This client only needs
          // to be created once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create table identity given the projectId, the datasetName and the resourceName.
          TableId tableId = TableId.of(projectId, datasetName, resourceName);
    
          // Get the table IAM policy.
          Policy policy = bigquery.getIamPolicy(tableId);
    
          // Show policy details.
          // Find more information about the Policy Class here:
          // https://cloud.google.com/java/docs/reference/google-cloud-core/latest/com.google.cloud.Policy
          System.out.println(
              "IAM policy info of resource \"" + resourceName + "\" retrieved succesfully");
          System.out.println();
          System.out.println("IAM policy info: " + policy.toString());
        } catch (BigQueryException e) {
          System.out.println("IAM policy info not retrieved. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Recupera la política de IAM para una tabla o vista con la función Table#getIamPolicy(). Los detalles de la política de acceso están disponibles en el objeto de política devuelto.
    
    /**
     * TODO(developer): Update and un-comment below lines
     */
    // const projectId = "YOUR_PROJECT_ID"
    // const datasetId = "YOUR_DATASET_ID"
    // const resourceName = "YOUR_RESOURCE_NAME";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    async function viewTableOrViewAccessPolicy() {
      const dataset = client.dataset(datasetId);
      const table = dataset.table(resourceName);
    
      // Get the IAM access policy for the table or view.
      const [policy] = await table.getIamPolicy();
    
      // Initialize bindings if they don't exist
      if (!policy.bindings) {
        policy.bindings = [];
      }
    
      // Show policy details.
      // Find more details for the Policy object here:
      // https://cloud.google.com/bigquery/docs/reference/rest/v2/Policy
      console.log(`Access Policy details for table or view '${resourceName}'.`);
      console.log(`Bindings: ${JSON.stringify(policy.bindings, null, 2)}`);
      console.log(`etag: ${policy.etag}`);
      console.log(`Version: ${policy.version}`);
    }

Revoca el acceso a una tabla o vista

Para revocar el acceso a una tabla o vista, selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y un conjunto de datos, y selecciona una tabla o vista.

  3. En el panel de detalles, haz clic en Compartir.

  4. En el cuadro de diálogo Compartir, expande la principal cuyo acceso deseas revocar.

  5. Haz clic en Borrar.

  6. En el cuadro de diálogo ¿Quieres quitar el rol del principal?, haz clic en Quitar.

  7. Para volver a la tabla o ver los detalles, haz clic en Cerrar.

SQL

Para quitar el acceso a las tablas o vistas de las principales, usa la declaración DCL REVOKE:

  1. En la consola de Trusted Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    REVOKE `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    FROM "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: un rol o una lista de roles separados por comas que deseas revocar
    • RESOURCE_TYPE: el tipo de recurso del que se revoca el rol

      Los valores admitidos son TABLE, VIEW, MATERIALIZED VIEW y EXTERNAL TABLE.

    • RESOURCE_NAME: el nombre del recurso en el que deseas revocar el permiso
    • USER_LIST: una lista separada por comas de usuarios a los que se les revocarán los roles

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se revoca el rol de propietario de datos de BigQuery en myTable:

REVOKE `roles/bigquery.dataOwner`
ON TABLE `myProject`.myDataset.myTable
FROM "group:group@example.com", "serviceAccount:user@myproject.s3ns-system.iam.gserviceaccount.com"

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para revocar el acceso a una tabla o vista, usa el comando bq remove-iam-policy-binding:

    bq remove-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
    --table=true RESOURCE

    Reemplaza lo siguiente:

    • MEMBER_TYPE: Es el tipo de miembro, como user, group, serviceAccount o domain.
    • MEMBER: La dirección de correo electrónico o el nombre de dominio del miembro
    • ROLE: Es el rol que deseas revocar del miembro.
    • RESOURCE: el nombre de la tabla o vista cuya política deseas actualizar
  3. API

    1. Para recuperar la política actual, llama al método tables.getIamPolicy.

    2. Edita la política para quitar miembros o vinculaciones, o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

    3. Llama a tables.setIamPolicy para escribir la política actualizada.

    Go

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Llama a la función policy.Remove() para quitar el acceso. Luego, llama a la función IAM().SetPolicy() para guardar los cambios en la política de acceso de una tabla o vista.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"cloud.google.com/go/iam"
    )
    
    // revokeTableOrViewAccessPolicies creates a new ACL removing the VIEWER role to group "example-analyst-group@google.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func revokeTableOrViewAccessPolicies(w io.Writer, projectID, datasetID, resourceID string) error {
    	// Resource can be a table or a view
    	//
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// resourceID := "myresource"
    
    	ctx := context.Background()
    
    	// Create new client
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get resource policy.
    	policy, err := client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	// Find more details about IAM Roles here:
    	// https://pkg.go.dev/cloud.google.com/go/iam#RoleName
    	entityID := "example-analyst-group@google.com"
    	roleType := iam.Viewer
    
    	// Revoke policy access.
    	policy.Remove(fmt.Sprintf("group:%s", entityID), roleType)
    
    	// Update resource's policy.
    	err = client.Dataset(datasetID).Table(resourceID).IAM().SetPolicy(ctx, policy)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	// Get resource policy again expecting the update.
    	policy, err = client.Dataset(datasetID).Table(resourceID).IAM().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Table.IAM.Policy: %w", err)
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in table or view %v.\n", resourceID)
    
    	for _, role := range policy.Roles() {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", role)
    		fmt.Fprintf(w, "Entities: %v\n", policy.Members(role))
    	}
    
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    import com.google.cloud.Identity;
    import com.google.cloud.Policy;
    import com.google.cloud.Role;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.TableId;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    public class RevokeAccessToTableOrView {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project, dataset and resource (table or view) from which to get the access policy
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        String resourceName = "MY_RESOURCE_NAME";
        // Role to remove from the access policy
        Role role = Role.of("roles/bigquery.dataViewer");
        // Identity to remove from the access policy
        Identity user = Identity.user("user-add@example.com");
        revokeAccessToTableOrView(projectId, datasetName, resourceName, role, user);
      }
    
      public static void revokeAccessToTableOrView(
          String projectId, String datasetName, String resourceName, Role role, Identity identity) {
        try {
          // Initialize client that will be used to send requests. This client only needs
          // to be created once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create table identity given the projectId, the datasetName and the resourceName.
          TableId tableId = TableId.of(projectId, datasetName, resourceName);
    
          // Remove either identities or roles, or both from bindings and replace it in
          // the current IAM policy.
          Policy policy = bigquery.getIamPolicy(tableId);
          // Create a copy of an immutable map.
          Map<Role, Set<Identity>> bindings = new HashMap<>(policy.getBindings());
    
          // Remove all identities with a specific role.
          bindings.remove(role);
          // Update bindings.
          policy = policy.toBuilder().setBindings(bindings).build();
    
          // Remove one identity in all the existing roles.
          for (Role roleKey : bindings.keySet()) {
            if (bindings.get(roleKey).contains(identity)) {
              // Create a copy of an immutable set if the identity is present in the role.
              Set<Identity> identities = new HashSet<>(bindings.get(roleKey));
              // Remove identity.
              identities.remove(identity);
              bindings.put(roleKey, identities);
              if (bindings.get(roleKey).isEmpty()) {
                // Remove the role if it has no identities.
                bindings.remove(roleKey);
              }
            }
          }
          // Update bindings.
          policy = policy.toBuilder().setBindings(bindings).build();
    
          // Update the IAM policy by setting the new one.
          bigquery.setIamPolicy(tableId, policy);
    
          System.out.println("IAM policy of resource \"" + resourceName + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("IAM policy was not updated. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

    Antes de ejecutar muestras de código, configura la variable de entorno GOOGLE_CLOUD_UNIVERSE_DOMAIN como s3nsapis.fr.

    Recupera la política de IAM actual para una tabla o vista con el método Table#getIamPolicy(). Modifica la política para quitar el rol o la principal deseados y, luego, aplica la política actualizada con el método Table#setIamPolicy().
    
    /**
     * TODO(developer): Update and un-comment below lines
     */
    // const projectId = "YOUR_PROJECT_ID"
    // const datasetId = "YOUR_DATASET_ID"
    // const tableId = "YOUR_TABLE_ID"
    // const roleToRemove = "YOUR_ROLE"
    // const principalToRemove = "YOUR_PRINCIPAL_ID"
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    async function revokeAccessToTableOrView() {
      const dataset = client.dataset(datasetId);
      const table = dataset.table(tableId);
    
      // Get the IAM access policy for the table or view.
      const [policy] = await table.getIamPolicy();
    
      // Initialize bindings array.
      if (!policy.bindings) {
        policy.bindings = [];
      }
    
      // To revoke access to a table or view,
      // remove bindings from the Table or View policy.
      //
      // Find more details about Policy objects here:
      // https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
    
      if (principalToRemove) {
        // Create a copy of bindings for modifications.
        const bindings = [...policy.bindings];
    
        // Filter out the principal from each binding.
        for (const binding of bindings) {
          if (binding.members) {
            binding.members = binding.members.filter(
              m => m !== principalToRemove
            );
          }
        }
    
        // Filter out bindings with empty members.
        policy.bindings = bindings.filter(
          binding => binding.members && binding.members.length > 0
        );
      }
    
      if (roleToRemove) {
        // Filter out all bindings with the roleToRemove
        // and assign a new list back to the policy bindings.
        policy.bindings = policy.bindings.filter(b => b.role !== roleToRemove);
      }
    
      // Set the IAM access policy with updated bindings.
      await table.setIamPolicy(policy);
    
      // Both role and principal are removed
      if (roleToRemove !== null && principalToRemove !== null) {
        console.log(
          `Role '${roleToRemove}' revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
        );
      }
    
      // Only role is removed
      if (roleToRemove !== null && principalToRemove === null) {
        console.log(
          `Role '${roleToRemove}' revoked for all principals on resource '${datasetId}.${tableId}'.`
        );
      }
    
      // Only principal is removed
      if (roleToRemove === null && principalToRemove !== null) {
        console.log(
          `Access revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
        );
      }
    
      // No changes were made
      if (roleToRemove === null && principalToRemove === null) {
        console.log(
          `No changes made to access policy for '${datasetId}.${tableId}'.`
        );
      }
    }

Trabaja con los controles de acceso para las rutinas

Para enviar comentarios o solicitar asistencia para esta función, envía un correo electrónico a bq-govsec-eng@google.com.

Puedes otorgar acceso a una rutina otorgándole a una principal de IAM](/iam/docs/principal-identifiers#allow) un rol predefinido o personalizado que determine lo que la principal puede hacer con la rutina. Esto también se conoce como adjuntar una política de permisos a un recurso. Después de otorgar acceso, puedes ver los controles de acceso de la rutina y revocar el acceso a ella.

Cómo otorgar acceso a una rutina

Para obtener un control de acceso detallado, puedes otorgar un rol de IAM predefinido o personalizado en una rutina específica. La rutina también hereda los controles de acceso especificados a nivel del conjunto de datos y en niveles superiores. Por ejemplo, si le otorgas a una principal el rol de propietario de datos de BigQuery en un conjunto de datos, esa principal también tendrá permisos de propietario de datos en las rutinas del conjunto de datos.

Selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande tu conjunto de datos, expande Rutinas y, luego, selecciona una rutina.

  3. Haz clic en Compartir

  4. Haz clic en Agregar miembros.

  5. En el campo Miembros nuevos, ingresa una principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Guardar.

  8. Para volver a la información de la rutina, haz clic en Listo.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para escribir la información de la rutina existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq get-iam-policy:

    bq get-iam-policy \
        PROJECT_ID:DATASET.ROUTINE \
        > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: el nombre del conjunto de datos que contiene la rutina que deseas actualizar
    • ROUTINE: el nombre del recurso que se actualizará
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local
  3. Realiza cambios a la sección bindings del archivo JSON. Una vinculación une uno o más principales a un solo role. Los principales pueden ser cuentas de usuario, cuentas de servicio, grupos de Google y dominios. Por ejemplo, la sección bindings del archivo JSON de una rutina se vería de la siguiente manera:

    {
      "bindings": [
        {
          "role": "roles/bigquery.dataViewer",
          "members": [
            "user:user@example.com",
            "group:group@example.com",
            "domain:example.com",
          ]
        },
      ],
      "etag": "BwWWja0YfJA=",
      "version": 1
    }
  4. Para actualizar tu política de acceso, usa el comando bq set-iam-policy.

    bq set-iam-policy PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
  5. Para verificar los cambios del control de acceso, ingresa otra vez el comando bq get-iam-policy sin escribir la información en un archivo:

    bq get-iam-policy --format=prettyjson \\
        PROJECT_ID:DATASET.ROUTINE
  6. API

    1. Para recuperar la política actual, llama al método routines.getIamPolicy.

    2. Edita la política para agregar principales, vinculaciones o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

    3. Llama a routines.setIamPolicy para escribir la política actualizada.

Roles predefinidos que otorgan acceso a rutinas

Para obtener un control de acceso detallado, puedes otorgar un rol de IAM predefinido o personalizado en una rutina específica. La rutina también hereda los controles de acceso especificados a nivel del conjunto de datos y en niveles superiores. Por ejemplo, si le otorgas a una principal el rol de propietario de datos en un conjunto de datos, esa principal también tendrá permisos de propietario de datos en las rutinas del conjunto de datos a través de la herencia.

Los siguientes roles predefinidos de IAM tienen permisos sobre las rutinas.

Rol Descripción
Propietario de datos de BigQuery (roles/bigquery.dataOwner) Cuando se otorga en una rutina, este rol otorga los siguientes permisos:
  • Son todos los permisos de la rutina.

No debes otorgar el rol de propietario de datos a nivel de la rutina. El rol de editor de datos también otorga todos los permisos para la rutina y es un rol con menos privilegios.

Editor de datos de BigQuery (roles/bigquery.dataEditor) Cuando se otorga en una rutina, este rol otorga los siguientes permisos:
  • Son todos los permisos de la rutina.
Visualizador de datos de BigQuery (roles/bigquery.dataViewer) Cuando se otorga en una rutina, este rol otorga los siguientes permisos:
  • En una consulta, haz referencia a una rutina creada por otra persona.
Visualizador de metadatos de BigQuery (roles/bigquery.metadataViewer) Cuando se otorga en una rutina, este rol otorga los siguientes permisos:
  • En una consulta, haz referencia a una rutina creada por otra persona.

Permisos para rutinas

La mayoría de los permisos que comienzan con bigquery.routines se aplican a nivel de la rutina. bigquery.routines.create y bigquery.routines.list no lo hacen. Para crear y enumerar rutinas, se deben otorgar los permisos bigquery.routines.create y bigquery.routines.list a un rol en el contenedor principal, es decir, el conjunto de datos.

En la siguiente tabla, se enumeran todos los permisos para las rutinas y el recurso de nivel más bajo al que se pueden otorgar.

Permiso Recurso Descripción
bigquery.routines.create Conjunto de datos Crea una rutina en el conjunto de datos. Este permiso también requiere bigquery.jobs.create para ejecutar un trabajo de consulta que contenga una instrucción CREATE FUNCTION.
bigquery.routines.delete Rutina Borra una rutina.
bigquery.routines.get Rutina Hacer referencia a una rutina creada por otra persona Este permiso también requiere bigquery.jobs.create para ejecutar un trabajo de consulta que haga referencia a la rutina, y también necesitas permiso para acceder a cualquier recurso al que haga referencia la rutina, como tablas o vistas.
bigquery.routines.list Conjunto de datos Enumera las rutinas del conjunto de datos y muestra los metadatos de las rutinas.
bigquery.routines.update Rutina Actualiza metadatos y definiciones de rutinas.
bigquery.routines.getIamPolicy Rutina Obtén los controles de acceso para la rutina.
bigquery.routines.setIamPolicy Rutina Configura los controles de acceso para la rutina.

Cómo ver los controles de acceso de una rutina

Para ver los controles de acceso de una rutina, elige una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande el conjunto de datos, expande Rutinas y, luego, selecciona una rutina.

  3. Haz clic en Compartir

    Los controles de acceso de la rutina aparecen en el panel Compartir.

bq

El comando bq get-iam-policy no permite ver los controles de acceso de una rutina.

SQL

La vista INFORMATION_SCHEMA.OBJECT_PRIVILEGES no muestra los controles de acceso para las rutinas.

API

Para recuperar la política actual, llama al método routines.getIamPolicy.

Cómo revocar el acceso a una rutina

Para revocar el acceso a una rutina, selecciona una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande un conjunto de datos, expande Rutinas y, luego, selecciona una rutina.

  3. En el panel de detalles, haz clic en Compartir > Permisos.

  4. En el cuadro de diálogo Permisos de rutinas, expande la principal cuyo acceso deseas revocar.

  5. Haz clic en Quitar principal.

  6. En el cuadro de diálogo ¿Quieres quitar el rol del principal?, haz clic en Quitar.

  7. Haz clic en Cerrar.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para escribir la información de la rutina existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq get-iam-policy:

    bq get-iam-policy --routine PROJECT_ID:DATASET.ROUTINE > PATH_TO_FILE

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: Es el nombre del conjunto de datos que contiene la rutina que deseas actualizar.
    • ROUTINE: el nombre del recurso que se actualizará
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local

    En el archivo de políticas, el valor de version sigue siendo 1. Este número hace referencia a la versión de esquema de la política de IAM, no a la versión de la política. El valor etag es el número de versión de la política.

  3. Realiza cambios a la sección access del archivo JSON. Puedes quitar cualquiera de las entradas specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes quitar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección access del archivo JSON de una rutina se vería de la siguiente manera:

    {
     "bindings": [
       {
         "role": "roles/bigquery.dataViewer",
         "members": [
           "user:user@example.com",
           "group:group@example.com",
           "domain:google.com",
         ]
       },
     ],
     "etag": "BwWWja0YfJA=",
     "version": 1
    }
  4. Para actualizar tu política de acceso, usa el comando bq set-iam-policy.

    bq set-iam-policy --routine PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
  5. Para verificar los cambios del control de acceso, usa otra vez el comando get-iam-policy sin escribir la información en un archivo:

    bq get-iam-policy --routine --format=prettyjson PROJECT_ID:DATASET.ROUTINE
  6. API

    1. Para recuperar la política actual, llama al método routines.getIamPolicy.

    2. Edita la política para agregar principales o vinculaciones, o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

Cómo ver los controles de acceso heredados para un recurso

Puedes examinar los roles de IAM heredados de un recurso con la IU web de BigQuery. Necesitarás los permisos adecuados para ver la herencia en la consola. Para examinar la herencia de un conjunto de datos, una tabla, una vista o una rutina, haz lo siguiente:

  1. En la consola de Trusted Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, selecciona el conjunto de datos o expándelo y, luego, selecciona una tabla, una vista o una rutina.

  3. En el caso de un conjunto de datos, haz clic en Uso compartido. En el caso de una tabla, una vista o una rutina, haz clic en Compartir.

  4. Verifica que la opción Mostrar roles heredados en la tabla esté habilitada.

    La opción Mostrar roles heredados en la tabla en la consola

  5. Expande un rol en la tabla.

  6. En la columna Herencia, el ícono hexagonal indica si el rol se heredó de un recurso principal.

    El ícono de Heredado de un recurso superior

Deniega el acceso a un recurso

Las políticas de denegación de IAM te permiten establecer límites en el acceso a los recursos de BigQuery. Puedes definir reglas de denegación que impidan a determinados principales usar ciertos permisos, sin importar los roles que tengan concedidos.

Para obtener información sobre cómo crear, actualizar y borrar políticas de denegación, consulta Deniega el acceso a los recursos.

Casos especiales

Ten en cuenta las siguientes situaciones cuando crees políticas de denegación de IAM en algunos permisos de BigQuery:

  • El acceso a recursos autorizados (vistas, rutinas, conjuntos de datos o procedimientos almacenados) te permite crear, descartar o manipular una tabla, además de leer y modificar los datos de la tabla, incluso si no tienes permiso directo para realizar esas operaciones. También puede obtener datos o metadatos del modelo y invocar otros procedimientos almacenados en la tabla subyacente. Esta capacidad implica que los recursos autorizados tienen los siguientes permisos:

    • bigquery.tables.get
    • bigquery.tables.list
    • bigquery.tables.getData
    • bigquery.tables.updateData
    • bigquery.tables.create
    • bigquery.tables.delete
    • bigquery.routines.get
    • bigquery.routines.list
    • bigquery.datasets.get
    • bigquery.models.getData
    • bigquery.models.getMetadata

    Para denegar el acceso a estos recursos autorizados, agrega uno de los siguientes valores al campo deniedPrincipal cuando crees la política de denegación:

    Valor Caso de uso
    principalSet://goog/public:all Bloquea a todas las principales, incluidos los recursos autorizados.
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* Bloquea todos los recursos autorizados de BigQuery en el proyecto especificado. PROJECT_NUMBER es un identificador único generado automáticamente para tu proyecto de tipo INT64.
  • Para eximir a ciertas principales de la política de denegación, especifica esas principales en el campo exceptionPrincipals de tu política de denegación. Por ejemplo, exceptionPrincipals: "principalSet://bigquery.googleapis.com/projects/1234/*".

  • BigQuery almacena en caché los resultados de las consultas del propietario de un trabajo durante 24 horas, a los que el propietario del trabajo puede acceder sin necesidad del permiso bigquery.tables.getData en la tabla que contiene los datos. Por lo tanto, agregar una política de denegación de IAM al permiso bigquery.tables.getData no bloquea el acceso a los resultados almacenados en caché para el propietario del trabajo hasta que venza la caché. Para bloquear el acceso del propietario del trabajo a los resultados almacenados en caché, crea una política de denegación independiente en el permiso bigquery.jobs.create.

  • Para evitar el acceso no deseado a los datos cuando se usan políticas de denegación para bloquear las operaciones de lectura de datos, te recomendamos que también revises y revoques las suscripciones existentes en el conjunto de datos.

  • Para crear una política de rechazo de IAM para ver los controles de acceso del conjunto de datos, rechaza los siguientes permisos:

    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
  • Para crear una política de rechazo de IAM para actualizar los controles de acceso del conjunto de datos, rechaza los siguientes permisos:

    • bigquery.datasets.update
    • bigquery.datasets.setIamPolicy

¿Qué sigue?

Aprende a usar el método projects.testIamPermissions para probar el acceso de los usuarios a un recurso.