Contrôler l'accès aux ensembles de données

Ce document explique comment contrôler l'accès aux ensembles de données dans BigQuery.

Vous pouvez également effectuer les opérations suivantes :

Présentation

Les autorisations au niveau des ensembles de données déterminent les utilisateurs, les groupes et les comptes de service autorisés à accéder aux tables, aux vues et aux données de table d'un ensemble de données spécifique. Par exemple, si vous accordez à un utilisateur le rôle IAM bigquery.dataOwner sur un ensemble de données spécifique, cet utilisateur pourra créer, mettre à jour et supprimer des tables et des vues dans cet ensemble de données.

Vous pouvez appliquer des contrôles d'accès lors de la création d'un ensemble de données en appelant la méthode API datasets.insert.

Il n'est pas possible d'appliquer des contrôles d'accès lors de la création d'un ensemble de données dans Cloud Console, dans l'outil de ligne de commande bq ou via des instructions LDD (langage de définition de données).

Vous pouvez appliquer des contrôles d'accès à un ensemble de données après sa création de plusieurs façons :

  • Utiliser Cloud Console
  • Utiliser les instructions LCD GRANT et REVOKE
  • Utiliser la commande bq update de l'outil de ligne de commande bq
  • En appelant la méthode API datasets.patch
  • Utiliser les bibliothèques clientes

Autorisations et rôles requis

Cette section décrit les autorisations IAM (Identity and Access Management) dont vous avez besoin pour contrôler les accès aux ensembles de données, ainsi que les rôles IAM prédéfinis qui accordent ces autorisations.

Autorisations

Pour contrôler l'accès à un ensemble de données, vous devez disposer de toutes les autorisations suivantes :

Autorisation Ressource
bigquery.datasets.update Ensemble de données dont vous souhaitez contrôler l'accès.
bigquery.datasets.get Ensemble de données dont vous souhaitez contrôler l'accès.

Pour contrôler l'accès à un ensemble de données à l'aide de Google Cloud Console, vous devez également disposer des autorisations suivantes :

Autorisation Ressource
bigquery.datasets.getIamPolicy Ensemble de données dont vous souhaitez contrôler l'accès.
bigquery.datasets.setIamPolicy Ensemble de données dont vous souhaitez contrôler l'accès.

Rôles

Pour contrôler l'accès à un ensemble de données, vous devez disposer au minimum du rôle suivant :

Rôle Ressource
roles/bigquery.dataOwner Ensemble de données dont vous souhaitez contrôler l'accès.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Accorder l'accès à un ensemble de données

Pour accorder l'accès à un ensemble de données, procédez comme suit :

Console

  1. Dans le panneau Explorateur, développez votre projet et sélectionnez un ensemble de données.

  2. Dans le panneau de détails, cliquez sur Partager l'ensemble de données.

  3. Dans le panneau Partager l'ensemble de données de l'onglet Autorisations de l'ensemble de données, saisissez l'entité que vous souhaitez ajouter dans le champ Ajouter des membres. Vous pouvez ajouter l'une des entités suivantes :

    • Adresse e-mail du compte Google : permet à un compte Google individuel d'accéder à l'ensemble de données
    • Groupe Google : permet à tous les membres d'un groupe Google d'accéder à l'ensemble de données
    • Domaine Google Apps : permet à tous les utilisateurs et groupes d'un domaine Google d'accéder à l'ensemble de données
    • Compte de service : permet à un compte de service d'accéder à l'ensemble de données
    • Tous les utilisateurs : saisissez allUsers pour accorder l'accès au grand public
    • Tous les comptes Google : saisissez allAuthenticatedUsers pour autoriser l'accès à tous les utilisateurs connectés à un compte Google
  4. Pour Rôle, sélectionnez BigQuery et choisissez un rôle IAM prédéfini approprié pour les nouveaux membres. Pour en savoir plus sur les autorisations affectées à chaque rôle BigQuery prédéfini, reportez-vous à la section Rôles de la page "Contrôle des accès".

  5. Cliquez sur OK.

SQL

Utilisez l'instruction GRANT suivante pour accorder le rôle Lecteur de données (roles/bigquery.dataViewer) à l'utilisateur joe@example.com sur votre ensemble de données.

     GRANT `roles/bigquery.dataViewer`
     ON SCHEMA DATASET
     TO "user:joe@example.com"
 

Remplacez DATASET par le nom de l'ensemble de données dans lequel se trouve la ressource.

Pour plus d'informations sur l'instruction LCD GRANT, consultez la section Instructions de langage de contrôle de données en SQL standard.

bq

  1. Écrivez les informations sur l'ensemble de données existant (y compris les contrôles d'accès) dans un fichier JSON à l'aide de la commande show. Si l'ensemble de données se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

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

    Remplacez l'élément suivant :

    • project_id est l'ID de votre projet.
    • dataset est le nom de votre ensemble de données ;
    • path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.

    Exemples :

    Saisissez la commande suivante pour écrire les contrôles d'accès pour mydataset dans un fichier JSON. mydataset se trouve dans votre projet par défaut.

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

    Saisissez la commande suivante pour écrire les contrôles d'accès pour mydataset dans un fichier JSON. mydataset se trouve dans myotherproject.

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.json
    
  2. Apportez vos modifications à la section "access" du fichier JSON. Vous pouvez ajouter n'importe quelle entrée specialGroup : projectOwners, projectWriters, projectReaders et allAuthenticatedUsers. Vous pouvez également ajouter ou modifier l'un des éléments suivants : userByEmail, groupByEmail et domain.

    Par exemple, la section d'accès du fichier JSON d'un ensemble de données ressemblerait à ceci :

    {
     "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. Une fois vos modifications terminées, exécutez la commande update et incluez le fichier JSON à l'aide de l'option --source. Si l'ensemble de données se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

    bq update \
    --source path_to_file \
    project_id:dataset
    

    Remplacez l'élément suivant :

    • path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.
    • project_id est l'ID de votre projet ;
    • dataset est le nom de votre ensemble de données.

    Exemples :

    Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour mydataset. mydataset se trouve dans votre projet par défaut.

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

    Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour mydataset. mydataset se trouve dans myotherproject.

        bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande show sans écrire les informations dans un fichier.

    bq show --format=prettyjson dataset
    

    ou

    bq show --format=prettyjson project_id:dataset
    

API

Appelez datasets.insert avec une ressource d'ensemble de données définie pour appliquer les contrôles d'accès lors de la création de l'ensemble de données. Appelez datasets.patch et utilisez la propriété access de la ressource Dataset pour mettre à jour les contrôles d'accès.

Comme la méthode datasets.update remplace la ressource d'ensemble de données dans son intégralité, il est préférable d'utiliser la méthode datasets.patch.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

Définissez la propriété dataset.access_entries avec les contrôles d'accès pour un ensemble de données. Appelez ensuite la fonction client.update_dataset() pour mettre à jour la propriété.

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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage 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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Python.

Définissez la propriété dataset.access_entries avec les contrôles d'accès pour un ensemble de données. Appelez ensuite la fonction client.update_dataset() pour mettre à jour la propriété.
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)
)

Révoquer l'accès à un ensemble de données

Pour révoquer l'accès à un ensemble de données, procédez comme suit :

Console

  1. Dans le panneau Explorateur, développez votre projet et sélectionnez un ensemble de données.

  2. Dans le panneau de détails, cliquez sur Partager l'ensemble de données.

  3. Dans le panneau Partager l'ensemble de données de l'onglet Autorisations d'ensemble de données, développez le rôle dont vous souhaitez modifier l'appartenance.

  4. Pour le compte utilisateur que vous souhaitez supprimer, cliquez sur Supprimer.

  5. Dans la boîte de dialogue Supprimer le membre ?, cliquez sur Supprimer.

  6. Cliquez sur OK.

SQL

Utilisez l'instruction REVOKE suivante pour supprimer le rôle Lecteur de données (roles/bigquery.dataViewer) de l'utilisateur joe@example.com sur votre ensemble de données.

  REVOKE `roles/bigquery.dataViewer`
  ON SCHEMA DATASET
  FROM "user:joe@example.com"
 

Remplacez DATASET par le nom de l'ensemble de données dans lequel se trouve la ressource.

Pour plus d'informations sur l'instruction LCD REVOKE, consultez la section Instructions de langage de contrôle de données en SQL standard.

bq

  1. Écrivez les informations sur l'ensemble de données existant (y compris les contrôles d'accès) dans un fichier JSON à l'aide de la commande show. Si l'ensemble de données se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

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

    Remplacez l'élément suivant :

    • project_id est l'ID de votre projet.
    • dataset est le nom de votre ensemble de données ;
    • path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.

    Exemples :

    Saisissez la commande suivante pour écrire les contrôles d'accès pour mydataset dans un fichier JSON. mydataset se trouve dans votre projet par défaut.

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

    Saisissez la commande suivante pour écrire les contrôles d'accès pour mydataset dans un fichier JSON. mydataset se trouve dans myotherproject.

      bq show --format=prettyjson \
      myotherproject:mydataset > /tmp/mydataset.json
    
  2. Apportez vos modifications à la section "access" du fichier JSON. Vous pouvez supprimer n'importe quelle entrée specialGroup : projectOwners, projectWriters, projectReaders et allAuthenticatedUsers. Vous pouvez également supprimer l'un des éléments suivants : userByEmail, groupByEmail et domain.

    Par exemple, la section d'accès du fichier JSON d'un ensemble de données ressemblerait à ceci :

    {
     "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. Une fois vos modifications terminées, exécutez la commande update et incluez le fichier JSON à l'aide de l'option --source. Si l'ensemble de données se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

    bq update \
    --source path_to_file \
    project_id:dataset
    

    Remplacez l'élément suivant :

    • path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.
    • project_id est l'ID de votre projet ;
    • dataset est le nom de votre ensemble de données.

    Exemples :

    Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour mydataset. mydataset se trouve dans votre projet par défaut.

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

    Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour mydataset. mydataset se trouve dans myotherproject.

        bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande show sans écrire les informations dans un fichier.

    bq show --format=prettyjson dataset
    

    ou

    bq show --format=prettyjson project_id:dataset
    

API

Appelez datasets.patch et utilisez la propriété access de la ressource Dataset pour mettre à jour les contrôles d'accès.

Comme la méthode datasets.update remplace la ressource d'ensemble de données dans son intégralité, il est préférable d'utiliser la méthode datasets.patch.

Étapes suivantes