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 configurar los permisos de BigQuery en un nivel superior en la jerarquía de recursos de Cloud IAM. Para obtener más información sobre la jerarquía de recursos de Cloud IAM, consulta cómo usar la jerarquía de recursos para el control de acceso en la documentación de Cloud IAM.

Descripción general

Actualmente, no puedes otorgar permisos en tablas, vistas, columnas o filas. Un conjunto de datos es el recurso de nivel más bajo que admite controles de acceso en BigQuery.

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 Cloud 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 si llamas al método de la API datasets.insert.

Los controles de acceso no se pueden aplicar durante la creación del conjunto de datos en GCP Console, la IU web clásica de BigQuery o la herramienta de línea de comandos.

Pueden aplicarlos a un conjunto de datos después de que se crea a partir de estos métodos:

  • Utilizar GCP Console o la IU web de BigQuery clásica
  • Usa el comando bq update de CLI.
  • Llama 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 del conjunto de datos, debes tener los permisos bigquery.datasets.update y bigquery.datasets.get. Las siguientes funciones predefinidas de Cloud IAM incluyen los permisos bigquery.datasets.update y bigquery.datasets.get:

  • bigquery.dataOwner
  • bigquery.admin

Además, si un usuario tiene permisos de bigquery.datasets.create, cuando crea un conjunto de datos, se le otorga el acceso de bigquery.dataOwner a él. El acceso bigquery.dataOwner otorga a los usuarios la capacidad de actualizar los conjuntos de datos que crean.

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

Controla el acceso a un conjunto de datos

Para asignar los controles de acceso a un conjunto de datos:

Console

  1. Selecciona un conjunto de datos de Recursos y, luego, haz clic en Compartir conjunto de datos (Share dataset) cerca del lado derecho de la ventana.

    Agrega personas a un conjunto de datos

  2. En el panel Compartir conjunto de datos (Share dataset), en la pestaña Permisos del conjunto de datos, haz clic en Agregar miembros.

  3. En el panel Agregar miembros, ingresa la entidad que deseas agregar en el cuadro de texto Nuevos 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 a una cuenta de servicio acceso al conjunto de datos.
    • 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. Haz clic en Listo.

IU clásica

  1. Haz clic en la flecha desplegable a la derecha del conjunto de datos y elige Compartir conjunto de datos.

  2. En el cuadro de diálogo Compartir conjunto de datos, en Agregar personas, haz clic en el menú desplegable a la izquierda del campo y elige la opción adecuada. Cuando aplicas controles de acceso a un conjunto de datos mediante el uso de la IU web clásica, puedes otorgar acceso a los siguientes usuarios y grupos:

    • Usuario por correo electrónico: otorga a una Cuenta de Google individual acceso al conjunto de datos.
    • Grupo por correo electrónico: otorga a todos los miembros de un grupo de Google acceso al conjunto de datos.
    • Dominio: otorga a todos los usuarios y grupos en un dominio de Google acceso al conjunto de datos.
    • Todos los usuarios autenticados: otorga a todos los titulares de la Cuenta de Google acceso al conjunto de datos (hace que el conjunto de datos sea público).
    • Propietarios del proyecto: otorga a todos los propietarios del proyecto acceso al conjunto de datos.
    • Lectores del proyecto: otorga a todos los lectores del proyecto acceso al conjunto de datos.
    • Editores del proyecto: otorga a todos los editores del proyecto acceso al conjunto de datos.
    • Vista autorizada: otorga una vista de acceso al conjunto de datos.

  3. Escribe un valor en el cuadro de texto. Por ejemplo, si eliges Usuario por correo electrónico o Grupo por correo electrónico, escribe la dirección de correo electrónico del usuario o grupo.

  4. A la derecha del campo Agregar personas (Add People), haz clic en Puede ver y elige la función adecuada de la lista.

    Agrega personas a un conjunto de datos

  5. Haz clic en Agregar (Add) y, luego, en Guardar cambios.

CLI

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

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

    Donde:

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

    Ejemplos:

    Ingresa el siguiente comando a fin de escribir los controles de acceso para mydataset en un archivo JSON. mydataset se encuentra en tu proyecto predeterminado.

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

    Ingresa el siguiente comando a fin de escribir los controles de acceso para mydataset en un archivo JSON. mydataset se encuentra 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 o quitar cualquiera de las entradas specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes agregar, quitar o modificar cualquiera de los siguientes: userByEmail, groupByEmail y domain.

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

    {
     "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 y también incluye el archivo JSON con la marca --source. Si el conjunto de datos se encuentra en otro proyecto que no sea el predeterminado, agrega el ID del proyecto al nombre del conjunto de datos con el siguiente formato: project_id:dataset.

    bq update \
    --source path_to_file \
    project_id:dataset
    

    Donde:

    • 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 de tu conjunto de datos.

    Ejemplos:

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

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

    Ingresa el comando siguiente a fin de actualizar los controles de acceso para mydataset. mydataset se encuentra 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

Llama a datasets.insert con un recurso de conjunto de datos definido para aplicar los controles de acceso cuando se crea el conjunto de datos. Llama a datasets.patch y usa la propiedad access en el recurso de conjunto de datos para actualizar tus controles de acceso.

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

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración de Go incluidas en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para 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.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
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
}

Python

Antes de probar este ejemplo, sigue las instrucciones de configuración de Python incluidas en la Guía de inicio rápido de BigQuery con 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

# TODO(developer): 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)

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"])  # API request

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

Próximos pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.