Controla el acceso a los conjuntos de datos

En este documento se describe cómo controlar el acceso a los conjuntos de datos en BigQuery.

También puedes hacer lo siguiente:

Descripción general

Los permisos a nivel de conjunto de datos determinan los usuarios, grupos y cuentas de servicio a los que se les permite acceder a las tablas, vistas y datos de tabla de un conjunto de datos específico. Por ejemplo, si otorgas la función bigquery.dataOwner de IAM a un usuario en un conjunto de datos específico, ese usuario puede crear, actualizar y borrar tablas y vistas en el conjunto de datos.

Puedes aplicar controles de acceso durante la creación del conjunto de datos con una llamada al método de la API datasets.insert.

No se pueden aplicar controles de acceso durante la creación del conjunto de datos en Cloud Console o en la herramienta de línea de comandos de bq.

Puedes aplicar los controles de acceso a un conjunto de datos después de crearlo de las siguientes maneras:

  • Usa Cloud Console.
  • Usa el comando bq update en la herramienta de línea de comandos de bq.
  • Mediante una llamada al método de la API datasets.patch
  • Usa las bibliotecas cliente.

Permisos necesarios

Como mínimo, para asignar o actualizar los controles de acceso al conjunto de datos, debes tener los permisos bigquery.datasets.update y bigquery.datasets.get.

Para asignar o actualizar los controles de acceso al conjunto de datos en la consola, también necesitarás los permisos bigquery.datasets.getIamPolicy y bigquery.datasets.setIamPolicy, además de los permisos bigquery.datasets.update y bigquery.datasets.get.

Las siguientes funciones predefinidas de IAM incluyen los permisos bigquery.datasets.update, bigquery.datasets.get, bigquery.datasets.getIamPolicy y bigquery.datasets.setIamPolicy.

  • bigquery.dataOwner
  • bigquery.admin

Además, si un usuario tiene permisos bigquery.datasets.create, cuando ese usuario crea un conjunto de datos, se le otorga acceso bigquery.dataOwner a este, que incluye automáticamente la capacidad para actualizar los permisos del conjunto de datos.

Para obtener más información sobre las funciones y los permisos de IAM en BigQuery, consulta Funciones y permisos predefinidos.

Otorga acceso a un conjunto de datos

Para otorgar acceso a un conjunto de datos, sigue estos pasos:

Console

  1. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.

  2. En el panel de detalles, haz clic en Compartir conjunto de datos.

  3. En el panel Compartir conjunto de datos, en la pestaña Permisos del conjunto de datos, ingresa la entidad que deseas agregar en el campo Agregar miembros. Puedes agregar cualquiera de las siguientes entidades:

    • Correo electrónico de Cuenta de Google: Otorga a una Cuenta de Google individual acceso al conjunto de datos.
    • Grupo de Google: Otorga a todos los miembros de un Grupo de Google acceso al conjunto de datos.
    • Dominio de Google Apps: Otorga a todos los usuarios y grupos de un dominio de Google acceso al conjunto de datos.
    • Cuenta de servicio: Otorga acceso al conjunto de datos a una cuenta de servicio.
    • Cualquiera: Ingresa allUsers para otorgar acceso al público general.
    • Todas las Cuentas de Google: Ingresa allAuthenticatedUsers para otorgar acceso a cualquier usuario que haya accedido a una Cuenta de Google.
  4. En Selecciona una función, selecciona BigQuery y una función de IAM predefinida adecuada para los miembros nuevos. Para obtener más información sobre los permisos asignados a cada función de BigQuery predefinida, consulta la sección Funciones de la página de control de acceso.

  5. Haga clic en Listo.

bq

  1. Escribe la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON mediante el comando show. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: project_id:dataset.

    bq show \
    --format=prettyjson \
    project_id:dataset > path_to_file
    

    Reemplaza lo siguiente:

    • project_id es el ID del proyecto.
    • dataset es el nombre del conjunto de datos.
    • path_to_file es la ruta al archivo JSON en tu máquina local.

    Ejemplos:

    Ingresa el siguiente comando para escribir los controles de acceso de mydataset en un archivo JSON. mydataset está en tu proyecto predeterminado.

      bq show --format=prettyjson mydataset > /tmp/mydataset.json
    

    Ingresa el siguiente comando para escribir los controles de acceso de mydataset en un archivo JSON. mydataset está en myotherproject.

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.json
    
  2. Realiza los cambios a la sección "access" del archivo JSON. Puedes agregar cualquiera de las entradas specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes agregar o modificar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección de acceso del 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"
      }
     ],
     ...
    }
    

  3. Cuando tus ediciones estén completas, usa el comando update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es tu proyecto 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
    

    Reemplaza lo siguiente:

    • path_to_file es la ruta al archivo JSON en tu máquina local.
    • project_id es el ID del proyecto.
    • dataset es el nombre del conjunto de datos.

    Ejemplos:

    Ingresa el siguiente comando a fin de actualizar los controles de acceso para mydataset. mydataset está en tu proyecto predeterminado.

        bq update --source /tmp/mydataset.json mydataset
    

    Ingresa el siguiente comando a fin de actualizar los controles de acceso para mydataset. mydataset está en myotherproject.

        bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. Para verificar los cambios del control de acceso, ingresa otra vez el comando show sin escribir la información en un archivo.

    bq show --format=prettyjson dataset
    

    o

    bq show --format=prettyjson project_id:dataset
    

API

Realiza una llamada a datasets.insert con un recurso de conjunto de datos definido para aplicar los controles de acceso cuando se cree el conjunto de datos. Realiza una llamada a 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 que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de BigQuery.

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran 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.

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
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 java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    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();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

Establece 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

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)  # Make an API request.

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

Revoca el acceso a un conjunto de datos

Para revocar el acceso a un conjunto de datos, haz lo siguiente:

Console

  1. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.

  2. En el panel de detalles, haz clic en Compartir conjunto de datos.

  3. En el panel Compartir conjunto de datos, en la pestaña Permisos del conjunto de datos, expande la función cuya membresía deseas cambiar.

  4. En la cuenta de usuario que deseas quitar, haz clic en Borrar.

  5. En el cuadro de diálogo ¿Quitar miembro?, haz clic en Quitar.

  6. Haga clic en Listo.

bq

  1. Escribe la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON mediante el comando show. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: project_id:dataset.

    bq show \
    --format=prettyjson \
    project_id:dataset > path_to_file
    

    Reemplaza lo siguiente:

    • project_id es el ID del proyecto.
    • dataset es el nombre del conjunto de datos.
    • path_to_file es la ruta al archivo JSON en tu máquina local.

    Ejemplos:

    Ingresa el siguiente comando para escribir los controles de acceso de mydataset en un archivo JSON. mydataset está en tu proyecto predeterminado.

      bq show --format=prettyjson mydataset > /tmp/mydataset.json
    

    Ingresa el siguiente comando para escribir los controles de acceso de mydataset en un archivo JSON. mydataset está en myotherproject.

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.json
    
  2. Realiza los 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 de acceso del 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"
      }
     ],
     ...
    }
    

  3. Cuando tus ediciones estén completas, usa el comando update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es tu proyecto 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
    

    Reemplaza lo siguiente:

    • path_to_file es la ruta al archivo JSON en tu máquina local.
    • project_id es el ID del proyecto.
    • dataset es el nombre del conjunto de datos.

    Ejemplos:

    Ingresa el siguiente comando a fin de actualizar los controles de acceso para mydataset. mydataset está en tu proyecto predeterminado.

        bq update --source /tmp/mydataset.json mydataset
    

    Ingresa el siguiente comando a fin de actualizar los controles de acceso para mydataset. mydataset está en myotherproject.

        bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. Para verificar los cambios del control de acceso, ingresa otra vez el comando show sin escribir la información en un archivo.

    bq show --format=prettyjson dataset
    

    o

    bq show --format=prettyjson project_id:dataset
    

API

Realiza una llamada a 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.

Próximos pasos