Contrôler l'accès aux ressources avec IAM

Ce document explique comment afficher la stratégie d'accès actuelle d'une ressource, comment accorder l'accès à une ressource et comment révoquer l'accès à une ressource.

Dans ce document, nous partons du principe que vous connaissez le système de gestion de l'authentification et des accès (IAM pour Identity and Access Management) dans Google Cloud.

Rôles requis

Pour obtenir les autorisations nécessaires pour modifier les stratégies IAM associées aux ressources, demandez à votre administrateur de vous accorder le rôle IAM Propriétaire de données BigQuery (roles/bigquery.dataOwner) sur le projet. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Ce rôle prédéfini contient les autorisations requises pour modifier les stratégies IAM des ressources. Pour afficher les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

  • Pour obtenir la stratégie d'accès d'un ensemble de données : bigquery.datasets.get
  • Pour définir la stratégie d'accès d'un ensemble de données : bigquery.datasets.update
  • Pour obtenir la stratégie d'accès d'un ensemble de données (la console Google Cloud uniquement), procédez comme suit : bigquery.datasets.getIamPolicy
  • Pour définir la règle d'accès d'un ensemble de données (console uniquement), procédez comme suit : bigquery.datasets.setIamPolicy
  • Pour obtenir la stratégie d'une table ou d'une vue : bigquery.tables.getIamPolicy
  • Pour définir la stratégie d'une table ou d'une vue : bigquery.tables.setIamPolicy
  • Pour créer l'outil bq ou des tâches SQL BigQuery (facultatif), procédez comme suit : bigquery.jobs.create

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Afficher la stratégie d'accès d'une ressource

Les sections suivantes expliquent comment afficher les stratégies d'accès de différentes ressources.

Afficher la stratégie d'accès d'un ensemble de données

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

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

  3. Cliquez sur Partage > Autorisations.

    Les règles d'accès aux ensembles de données s'affichent dans le volet Autorisations d'ensemble de données.

bq

Pour obtenir une stratégie existante et l'exporter dans un fichier local au format JSON, utilisez la commande bq show dans Cloud Shell :

bq show \
    --format=prettyjson \
    PROJECT_ID:DATASET > PATH_TO_FILE

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET : nom de votre ensemble de données.
  • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.

API

Pour appliquer des contrôles d'accès lors de la création de l'ensemble de données, appelez datasets.insert avec un élément dataset resource défini. Pour mettre à jour vos contrôles d'accès, appelez la méthode datasets.patch et utilisez la propriété access de la ressource Dataset.

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 pour mettre à jour les contrôles d'accès.

Afficher la stratégie d'accès d'une table ou d'une vue

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, développez votre projet et sélectionnez une table ou une vue.

  3. Cliquez sur  Partager.

    Les stratégies d'accès aux tables ou aux vues s'affichent dans le volet Partager.

bq

Pour obtenir une règle d'accès existante et l'exporter dans un fichier local au format JSON, utilisez la commande bq get-iam-policy dans Cloud Shell :

bq get-iam-policy \
    --table=true \
    PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • DATASET : nom de votre ensemble de données.
  • RESOURCE : nom de la table ou de la vue dont vous souhaitez afficher la stratégie.
  • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.

API

Pour récupérer la stratégie actuelle, appelez la méthode tables.getIamPolicy.

Accorder l'accès à une ressource

Dans les sections suivantes, nous allons voir comment accorder l'accès à différentes ressources.

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

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, développez votre projet et sélectionnez un ensemble de données à partager.

  3. Cliquez sur Partage > Autorisations.

  4. Cliquez sur Ajouter un compte principal.

  5. Dans le champ Nouveaux comptes principaux, saisissez un compte principal.

  6. Dans la liste Sélectionner un rôle, sélectionnez un rôle prédéfini ou personnalisé.

  7. Cliquez sur Enregistrer.

  8. Pour revenir aux informations sur l'ensemble de données, cliquez sur Fermer.

SQL

Pour autoriser les comptes principaux à accéder aux ensembles de données, utilisez l'instruction LDC GRANT :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    Remplacez les éléments suivants :

    • ROLE_LIST : rôle ou liste de rôles (séparés par des virgules) que vous souhaitez attribuer.
    • RESOURCE_TYPE : type de ressource auquel le rôle est appliqué.

      Les valeurs acceptées incluent SCHEMA (équivalent à l'ensemble de données), TABLE, VIEW et EXTERNAL TABLE.

    • RESOURCE_NAME : nom de la ressource sur laquelle vous souhaitez accorder l'autorisation
    • USER_LIST : liste d'utilisateurs (séparés par une virgule) auxquels le rôle est attribué.

      Pour obtenir la liste des formats valides, consultez la page user_list.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez la page Exécuter des requêtes interactives.

bq

  1. Pour écrire les informations existantes sur l'ensemble de données (y compris les contrôles d'accès) dans un fichier JSON, utilisez la commande bq show :

    bq show \
       --format=prettyjson \
       PROJECT_ID:DATASET > PATH_TO_FILE
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET : nom de votre ensemble de données.
    • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.
  2. Apportez vos modifications à la section access du fichier JSON. Vous pouvez ajouter l'une des entrées specialGroup : projectOwners, projectWriters, projectReaders et allAuthenticatedUsers. Vous pouvez également ajouter l'un des éléments suivants : userByEmail, groupByEmail et domain.

    Par exemple, la section access 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 bq 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
    
  4. Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande bq show sans écrire les informations dans un fichier :

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

Pour appliquer des contrôles d'accès lors de la création d'un ensemble de données, appelez la méthode datasets.insert en spécifiant une ressource d'ensemble de données. Pour mettre à jour vos contrôles d'accès, appelez la méthode datasets.patch et utilisez la propriété access de la ressource Dataset.

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 cet exemple, suivez les instructions de configuration pour Go du 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 pour Go.

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 cet exemple, suivez les instructions de configuration pour Java du 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 pour 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 cet exemple, suivez les instructions de configuration pour Python du 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 pour 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é.

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom
# you are adding access. Alternatively, to the JSON REST API representation
# of the entity, such as a view's table reference.
entity_id = "user-or-group-to-add@example.com"

from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Set entity_type to the type of entity you are granting access to.
# Common types include:
#
# * "userByEmail" -- A single user or service account. For example "fred@example.com"
# * "groupByEmail" -- A group of users. For example "example@googlegroups.com"
# * "view" -- An authorized view. For example
#       {"projectId": "p", "datasetId": "d", "tableId": "v"}
#
# For a complete reference, see the REST API reference documentation:
# https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#Dataset.FIELDS.access
entity_type = EntityTypes.GROUP_BY_EMAIL

# TODO(developer): Set role to a one of the "Basic roles for datasets"
# described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
role = "READER"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)
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)
)

Autoriser l'accès à une table ou à une vue

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, développez votre projet et sélectionnez une table ou une vue à partager.

  3. Cliquez sur  Partager.

  4. Cliquez sur Ajouter un compte principal.

  5. Dans le champ Nouveaux comptes principaux, saisissez un compte principal.

  6. Dans la liste Sélectionner un rôle, sélectionnez un rôle prédéfini ou personnalisé.

  7. Cliquez sur Enregistrer.

  8. Pour revenir aux détails de la table ou de la vue, cliquez sur Fermer.

SQL

Pour accorder aux comptes principaux l'accès aux tables ou aux vues, utilisez l'instruction LCD GRANT :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    Remplacez les éléments suivants :

    • ROLE_LIST : rôle ou liste de rôles (séparés par des virgules) que vous souhaitez attribuer.
    • RESOURCE_TYPE : type de ressource auquel le rôle est appliqué.

      Les valeurs acceptées incluent SCHEMA (équivalent à l'ensemble de données), TABLE, VIEW et EXTERNAL TABLE.

    • RESOURCE_NAME : nom de la ressource sur laquelle vous souhaitez accorder l'autorisation
    • USER_LIST : liste d'utilisateurs (séparés par une virgule) auxquels le rôle est attribué.

      Pour obtenir la liste des formats valides, consultez la page user_list.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez la page Exécuter des requêtes interactives.

bq

  1. Pour écrire les informations existantes dans la table ou la vue (y compris les contrôles d'accès) dans un fichier JSON, utilisez la commande bq get-iam-policy :

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET : nom de l'ensemble de données contenant la table ou la vue que vous souhaitez mettre à jour.
    • TABLE_OR_VIEW : nom de la ressource à mettre à jour.
    • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.
  2. Apportez vos modifications à la section access du fichier JSON. Vous pouvez ajouter l'une des entrées specialGroup : projectOwners, projectWriters, projectReaders et allAuthenticatedUsers. Vous pouvez également ajouter l'un des éléments suivants : userByEmail, groupByEmail et domain. Par exemple, la section access du fichier JSON d'une table ou d'une vue 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. Exécutez la commande set-iam-policy pour mettre à jour la stratégie :

    bq set-iam-policy \
        PROJECT_ID:DATASET.TABLE_OR_VIEW \
        > PATH_TO_FILE
    

  4. Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande bq get-iam-policy sans écrire les informations dans un fichier :

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. Pour récupérer la stratégie actuelle, appelez la méthode tables.getIamPolicy.
  2. Modifiez la stratégie pour ajouter des membres et/ou des liaisons. Pour connaître le format requis pour la stratégie, consultez la page de référence Stratégie.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du 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 pour Java.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

Révoquer l'accès à une ressource

Dans les sections suivantes, nous allons voir comment révoquer l'accès à différentes ressources.

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

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

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

  3. Dans le panneau des détails, cliquez sur Partage > Autorisations.

  4. Dans la boîte de dialogue Autorisations pour les ensembles de données, développez le compte principal dont vous souhaitez révoquer l'accès.

  5. Cliquez sur Supprimer le compte principal.

  6. Dans la boîte de dialogue Supprimer le rôle pour le compte principal ?, cliquez sur Supprimer.

  7. Pour revenir aux détails de l'ensemble de données, cliquez sur Fermer.

SQL

Pour supprimer l'accès aux ensembles de données des comptes principaux, utilisez l'instruction LCD REVOKE :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    Remplacez les éléments suivants :

    • ROLE_LIST : rôle ou liste de rôles (séparés par une virgule) que vous souhaitez révoquer.
    • RESOURCE_TYPE : type de ressource à partir duquel le rôle est révoqué

      Les valeurs acceptées incluent SCHEMA (équivalent à l'ensemble de données), TABLE, VIEW et EXTERNAL TABLE.

    • RESOURCE_NAME : nom de la ressource sur laquelle vous souhaitez révoquer l'autorisation.
    • USER_LIST : liste des utilisateurs (séparés par une virgule) dont les rôles seront révoqués.

      Pour obtenir la liste des formats valides, consultez la page user_list.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez la page Exécuter des requêtes interactives.

bq

  1. Pour écrire les informations existantes sur l'ensemble de données (y compris les contrôles d'accès) dans un fichier JSON, utilisez la commande bq show :

    bq show \
      --format=prettyjson \
      PROJECT_ID:DATASET > PATH_TO_FILE
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET : nom de votre ensemble de données.
    • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.
  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 access 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 bq 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
    
  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 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.

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du 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 pour Go.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// revokeDatasetAccess updates the access control on a dataset to remove all
// access entries that reference a specific entity.
func revokeDatasetAccess(projectID, datasetID, entity string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"
	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
	}

	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {

		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
			return err
		}
	}
	return nil
}

Python

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

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom you are revoking access.
entity_id = "user-or-group-to-remove@example.com"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
dataset.access_entries = [
    entry for entry in entries if entry.entity_id != entity_id
]

dataset = client.update_dataset(
    dataset,
    # Update just the `access_entries` property of the dataset.
    ["access_entries"],
)  # Make an API request.

full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")

Révoquer l'accès à une table ou à une vue

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le panneau Explorateur, développez votre projet et sélectionnez une table ou une vue.

  3. Dans le panneau des détails, cliquez sur Partager.

  4. Dans la boîte de dialogue Partager, développez le compte principal dont vous souhaitez révoquer l'accès.

  5. Cliquez sur Supprimer.

  6. Dans la boîte de dialogue Supprimer le rôle pour le compte principal ?, cliquez sur Supprimer.

  7. Pour revenir aux détails de la table ou de la vue, cliquez sur Fermer.

SQL

Pour supprimer l'accès aux tables ou aux vues des comptes principaux, utilisez l'instruction LCD REVOKE :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    Remplacez les éléments suivants :

    • ROLE_LIST : rôle ou liste de rôles (séparés par une virgule) que vous souhaitez révoquer.
    • RESOURCE_TYPE : type de ressource à partir duquel le rôle est révoqué

      Les valeurs acceptées incluent SCHEMA (équivalent à l'ensemble de données), TABLE, VIEW et EXTERNAL TABLE.

    • RESOURCE_NAME : nom de la ressource sur laquelle vous souhaitez révoquer l'autorisation.
    • USER_LIST : liste des utilisateurs (séparés par une virgule) dont les rôles seront révoqués.

      Pour obtenir la liste des formats valides, consultez la page user_list.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez la page Exécuter des requêtes interactives.

bq

  1. Pour écrire les informations existantes dans la table ou la vue (y compris les contrôles d'accès) dans un fichier JSON, utilisez la commande bq get-iam-policy :

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • DATASET : nom de l'ensemble de données contenant la table ou la vue que vous souhaitez mettre à jour.
    • TABLE_OR_VIEW : nom de la ressource à mettre à jour.
    • PATH_TO_FILE : chemin d'accès au fichier JSON sur votre ordinateur local.

  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 access du fichier JSON d'une table ou d'une vue 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. Exécutez la commande bq set-iam-policy pour mettre à jour la stratégie :

     bq set-iam-policy \
         PROJECT_ID:DATASET.TABLE_OR_VIEW \
         > PATH_TO_FILE
    

  4. Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande get-iam-policy sans écrire les informations dans un fichier :

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. Pour récupérer la stratégie actuelle, appelez la méthode tables.getIamPolicy.
  2. Modifiez la stratégie pour supprimer des membres et/ou des liaisons. Pour connaître le format requis pour la stratégie, consultez la page de référence Stratégie.

  3. Appelez tables.setIamPolicy pour écrire la stratégie mise à jour. Attention : Les liaisons vides sans membre ne sont pas autorisées et entraînent une erreur.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du 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 pour Java.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}