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 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 de l'ensemble de données dans la console GCP, l'interface utilisateur Web classique de BigQuery 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 selon les méthodes suivantes :

  • Utilisation de l'UI Web classique de BigQuery

    • Actuellement, vous ne pouvez pas attribuer de contrôles d'accès à l'aide de la console GCP.
  • Utilisation de la commande CLI bq update

  • Appel de la méthode API datasets.patch

Présentation

Vous partagez l'accès aux tables et vues BigQuery à l'aide des rôles IAM au niveau du projet et des contrôles d'accès au niveau des ensembles de données. Actuellement, vous ne pouvez pas appliquer de contrôles d'accès directement aux tables ou aux vues.

Les contrôles d'accès au niveau du projet déterminent les utilisateurs, les groupes et les comptes de service autorisés à accéder à tous les ensembles de données, tables, vues et données de table dans un projet. Les contrôles d'accès 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 dans un ensemble de données spécifique.

Par exemple, si vous attribuez le rôle bigquery.dataOwner à un utilisateur au niveau du projet, cet utilisateur est autorisé à créer, mettre à jour et supprimer des tables et des vues dans tous les ensembles de données du projet. Si vous attribuez le rôle OWNER au niveau de l'ensemble de données, l'utilisateur n'est autorisé à créer, mettre à jour et supprimer des tables et des vues que dans cet ensemble de données. Le rôle primitif OWNER au niveau de l'ensemble de données équivaut au rôle bigquery.dataOwner de l'ensemble de données.

Si vous affectez des rôles plus restrictifs aux utilisateurs ou aux groupes au niveau du projet, vous devez également accorder l'accès aux ensembles de données individuels. Par exemple, si vous accordez à un utilisateur ou à un groupe d'utilisateurs le rôle bigquery.user au niveau du projet, l'utilisateur concerné pourra créer des ensembles de données et exécuter des tâches de requête sur les tables de ces ensembles de données. Pour interroger des tables dans des ensembles de données que l'utilisateur n'a pas créés, vous devez attribuer à l'utilisateur un accès READER minimal au niveau de l'ensemble de données pour chaque ensemble de données à interroger. Le rôle primitif READER au niveau de l'ensemble de données équivaut au rôle bigquery.dataViewer de l'ensemble de données.

Pour en savoir plus sur les rôles IAM prédéfinis au niveau du projet et les contrôles d'accès au niveau des ensembles de données, consultez la page Contrôle des accès.

Autorisations requises

Pour attribuer des contrôles d'accès à un ensemble de données ou les mettre à jour, vous devez disposer d'un accès OWNER au niveau de l'ensemble de données ou détenir au niveau du projet un rôle IAM qui comprend les autorisations bigquery.datasets.update. Voici les rôles IAM prédéfinis au niveau du projet qui incluent les autorisations bigquery.datasets.update :

En outre, comme le rôle bigquery.user dispose des autorisations bigquery.datasets.create, un utilisateur ayant le rôle bigquery.user peut mettre à jour les ensembles de données qu'il crée. Lorsqu'un utilisateur détenant le rôle bigquery.user crée un ensemble de données, il bénéficie d'un accès OWNER à celui-ci. L'accès OWNER donne à l'utilisateur un contrôle total sur l'ensemble de données.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la section Contrôle des accès. Pour en savoir plus sur les rôles au niveau de l'ensemble de données, consultez la section Rôles primitifs pour les ensembles de données.

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 les adresses e-mail des personnes ou des groupes que vous souhaitez ajouter dans la zone de texte Nouveaux membres

  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 Enregistrer, puis sur OK.

Interface utilisateur 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 User by e-mail (Utilisateur par e-mail) ou Group by e-mail (Groupe par e-mail), renseignez l'adresse e-mail de l'utilisateur.

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

    Ajouter des personnes à un ensemble de données

  5. Cliquez sur Add (Ajouter), puis sur Save changes (Enregistrer les modifications).

Ligne de commande

  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 de ce 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] correspond à 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 afin d'é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 afin d'é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 n'importe lequel des éléments suivants : userByEmail, groupByEmail et domain.

    Par exemple, la section d'accès du fichier JSON d'un ensemble de données peut se présenter sous la forme suivante :

    {
     "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 les modifications effectuées, utilisez la commande update avec l'indicateur --source pour inclure le fichier JSON. Si l'ensemble de données se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID de ce 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] correspond à 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 de nouveau la commande show, mais cette fois sans demander l'écriture des 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 afin d'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 d'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, il est préférable d'utiliser la méthode datasets.patch pour mettre à jour les contrôles d'accès.

Pour en savoir plus, consultez la section Ensembles de données.

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 l'exemple ci-dessous, suivez la procédure de configuration pour 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 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

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