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 configurer les autorisations BigQuery à un niveau supérieur au sein de la hiérarchie des ressources Cloud IAM. Pour en savoir plus sur la hiérarchie des ressources Cloud IAM, consultez la section Utiliser la hiérarchie des ressources pour le contrôle des accès dans la documentation Cloud IAM.

Présentation

À l'heure actuelle, vous ne pouvez pas accorder d'autorisations sur des tables, des vues, des colonnes ou des lignes. Un ensemble de données constitue le niveau de ressource le plus bas compatible avec le contrôle des accès dans BigQuery.

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 le rôle Cloud IAM bigquery.dataOwner à un utilisateur d'un ensemble de données spécifique, celui-ci 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.

Les contrôles d'accès ne peuvent pas être appliqués lors de la création d'un ensemble de données dans Cloud Console, l'interface utilisateur Web BigQuery classique ou l'outil de ligne de commande.

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

  • En utilisant la console GCP ou l'interface utilisateur Web classique de BigQuery
  • En utilisant la commande CLI bq update
  • En appelant la méthode API datasets.patch
  • Utiliser les bibliothèques clientes

Autorisations requises

Pour attribuer des contrôles d'accès à un ensemble de données ou les mettre à jour, vous devez disposer au minimum des autorisations bigquery.datasets.update et bigquery.datasets.get. Les rôles Cloud IAM prédéfinis suivants incluent les autorisations bigquery.datasets.update et bigquery.datasets.get :

  • bigquery.dataOwner
  • bigquery.admin

En outre, si un utilisateur possède des autorisations bigquery.datasets.create, lorsqu'il crée un ensemble de données, il obtient également le rôle bigquery.dataOwner qui lui permet d'y accéder. L'accès bigquery.dataOwner permet aux utilisateurs de mettre à jour les ensembles de données qu'ils créent.

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

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

Pour affecter des contrôles d'accès à un ensemble de données, procédez comme suit :

Console

  1. Sélectionnez un ensemble de données dans Ressources, puis cliquez sur Share dataset (Partager l'ensemble de données) dans la partie droite de la fenêtre.

    Ajouter des personnes à un ensemble de données

  2. Dans le panneau Partager l'ensemble de données de l'onglet Autorisations d'ensemble de données, cliquez sur Ajouter des membres.

  3. Dans le panneau Ajouter des membres, saisissez l'entité que vous souhaitez ajouter dans la zone de texte Nouveaux 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 autoriser 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.

UI classique

  1. Cliquez sur la flèche du menu déroulant à droite de l'ensemble de données et sélectionnez Partager l'ensemble de données.

  2. Dans la boîte de dialogue Partager l'ensemble de données, pour Ajouter des personnes, cliquez sur le menu déroulant situé à gauche du champ, puis sélectionnez l'option appropriée. Lorsque vous appliquez des contrôles d'accès à un ensemble de données à l'aide de l'interface utilisateur Web classique, vous pouvez accorder l'accès aux utilisateurs et groupes suivants :

    • Utilisateur par e-mail : permet à un compte Google individuel d'accéder à l'ensemble de données.
    • Groupe par e-mail : permet à tous les membres d'un groupe Google d'accéder à l'ensemble de données.
    • Domaine : permet à tous les utilisateurs et groupes d'un domaine Google d'accéder à l'ensemble de données.
    • Tous les utilisateurs authentifiés : permet à tous les titulaires d'un compte Google d'accéder à l'ensemble de données (l'ensemble de données devient public).
    • Propriétaires du projet : permet à tous les propriétaires du projet d'accéder à l'ensemble de données.
    • Lecteurs du projet : permet à tous les lecteurs du projet d'accéder à l'ensemble de données.
    • Éditeurs du projet : permet à tous les éditeurs du projet d'accéder à l'ensemble de données.
    • Vue autorisée : permet à une vue d'accéder à l'ensemble de données.

  3. Saisissez une valeur dans la zone de texte. Par exemple, si vous avez choisi Utilisateur par e-mail ou Groupe par e-mail, renseignez l'adresse e-mail de l'utilisateur ou du groupe.

  4. À droite du champ Add People (Ajouter des personnes), cliquez sur Consultation autorisée et choisissez le rôle approprié dans la liste.

    Ajouter des personnes à un ensemble de données

  5. Cliquez sur Ajouter, puis sur Enregistrer les modifications.

CLI

  1. Écrivez les informations de 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 au format suivant : project_id:dataset.

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

    Où :

    • project_id est l'ID du 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 ou supprimer n'importe quelle entrée specialGroup : projectOwners, projectWriters, projectReaders et allAuthenticatedUsers. Vous pouvez également ajouter, supprimer 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, utilisez la commande update et incluez le fichier JSON à l'aide de l'indicateur --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 au format suivant : project_id:dataset.

    bq update \
    --source path_to_file \
    project_id:dataset
    

    Où :

    • path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.
    • project_id est l'ID du 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 au contrôle 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 de l'ensemble de données 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 sur l'API BigQuery 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é.

// 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites 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 sur 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

# 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)
)

Étapes suivantes

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.