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.

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

No se pueden aplicar controles de acceso durante la creación del conjunto de datos en GCP Console, en la IU web de BigQuery o en 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:

  • Usa la IU web clásica de BigQuery.

    • En la actualidad, no puedes asignar los controles de acceso con GCP Console.
  • Usa el comando de la CLI bq update.

  • Llama al método de la API datasets.patch.

Descripción general

Debes compartir el acceso a las tablas y vistas de BigQuery con las funciones de IAM a nivel de proyecto y los controles de acceso a nivel de conjunto de datos. En la actualidad, no puedes aplicar los controles de acceso directo en las tablas o vistas.

Los controles de acceso a nivel de proyecto determinan los usuarios, grupos y cuentas de servicio a los que se les permite acceder a todos los conjuntos de datos, tablas, vistas y tablas de datos en un proyecto. Los controles de acceso 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 asignas la función bigquery.dataOwner en el nivel del proyecto a un usuario, este puede crear, actualizar y borrar las tablas y las vistas en todos los conjuntos de datos del proyecto. Si asignas la función OWNER en el nivel de conjunto de datos, el usuario puede crear, actualizar y borrar las tablas y las vistas solo en ese conjunto de datos. La función básica OWNER a nivel de conjunto de datos es equivalente a otorgar la función bigquery.dataOwner al conjunto de datos.

Si asignas una función más restringida a nivel de proyecto a los usuarios o los grupos, también debes otorgar acceso a los conjuntos de datos individuales. Por ejemplo, si otorgas a un usuario o grupo la función bigquery.user a nivel del proyecto, el usuario puede crear conjuntos de datos y puede ejecutar trabajos de consulta en las tablas de esos conjuntos de datos. Para consultar tablas en los conjuntos de datos que el usuario no creó, debes asignar un acceso mínimo de READER de nivel de conjunto de datos al usuario para cada conjunto de datos que necesite consultar. La función básica READER a nivel de conjunto de datos equivale a otorgar la función bigquery.dataViewer al conjunto de datos.

Para obtener más información sobre las funciones de IAM predeterminadas a nivel de proyecto y los controles de acceso a nivel de conjunto de datos, consulta Control de acceso.

Permisos necesarios

Para asignar o actualizar los controles de acceso al conjunto de datos, debes tener el acceso OWNER a nivel de conjunto de datos o debes tener asignada la función de IAM a nivel de proyecto que incluye los permisos bigquery.datasets.update. En las funciones de IAM a nivel de proyecto predefinidas que se encuentran a continuación, se incluyen los permisos bigquery.datasets.update:

Además, debido a que la función bigquery.user tiene los permisos bigquery.datasets.create, un usuario asignado a la función bigquery.user puede actualizar cualquier conjunto de datos que cree el usuario. Cuando un usuario asignado a la función bigquery.user crea un conjunto de datos, se le otorga acceso de OWNER al conjunto de datos. El acceso OWNER a un conjunto de datos otorga al usuario un control total sobre este.

Para obtener más información sobre las funciones de IAM y los permisos en BigQuery, consulta Control de acceso. A fin de obtener más información sobre las funciones a nivel de conjunto de datos, consulta Funciones básicas para conjuntos de datos.

Controla el acceso a un conjunto de datos

Cuando aplicas controles de acceso a un conjunto de datos, puedes otorgar acceso a los usuarios y grupos siguientes:

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

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

IU clásica

En estos pasos, se demuestra la asignación de controles de acceso a un conjunto de datos mediante el uso de la IU web clásica de BigQuery. En la actualidad, no puedes asignar controles de acceso con GCP Console.
  1. Haz clic en la flecha desplegable a la derecha del conjunto de datos y elige Share Dataset (Compartir conjunto de datos).

  2. En el cuadro de diálogo Share Dataset (Compartir conjunto de datos), para Add People (Agregar personas), haz clic en el menú desplegable a la izquierda del campo y elige la opción adecuada.

  3. Escribe un valor en el cuadro de texto. Por ejemplo, si eliges el User by e-mail (Usuario por correo electrónico)o Group by e-mail (Grupo por correo electrónico), escribe la dirección de correo electrónico del usuario o grupo.

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

    Agrega personas a un conjunto de datos

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

Línea de comandos

  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 en el formato siguiente: [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 comando siguiente 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 comando siguiente 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 puede 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 en el formato siguiente: [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.

Para obtener más información, consulta Conjuntos de datos.

Go

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 esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. A fin de obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset = client.get_dataset(client.dataset('my_dataset'))

entry = bigquery.AccessEntry(
    role='READER',
    entity_type='userByEmail',
    entity_id='sample.bigquery.dev@gmail.com')
assert entry not in dataset.access_entries
entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ['access_entries'])  # API request

assert entry in dataset.access_entries

Pasos siguientes

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

Enviar comentarios sobre...

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