Utiliser la sécurité au niveau des lignes

Ce document explique comment utiliser la sécurité au niveau des lignes dans BigQuery pour restreindre l'accès aux données au niveau des lignes de la table. Avant de lire ce document, consultez la page Présentation de la sécurité au niveau des lignes de BigQuery pour vous familiariser avec ce concept.

Présentation

Vous pouvez effectuer les tâches suivantes avec des règles d'accès au niveau des lignes :

Avant de commencer

Attribuez aux utilisateurs des rôles IAM (Identity and Access Management) incluant les autorisations nécessaires pour effectuer l'ensemble des tâches du présent document. Les autorisations requises pour effectuer une tâche (le cas échéant) sont répertoriées dans la section "Autorisations requises" de la tâche.

Créer ou mettre à jour une règle d'accès au niveau des lignes

Vous pouvez créer ou mettre à jour une règle d'accès au niveau des lignes sur une table dans BigQuery à l'aide d'une instruction LDD (langage de définition de données).

Autorisations requises

Pour créer une règle d'accès au niveau de la ligne sur une table BigQuery, vous devez disposer des autorisations IAM suivantes :

  • bigquery.rowAccessPolicies.create
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (sur la table cible et toutes les tables référencées dans les règles d'accès au niveau des lignes de sous-requête accordées)
  • bigquery.jobs.create (pour exécuter la tâche de requête LDD)

Pour mettre à jour une règle d'accès au niveau des lignes dans une table BigQuery, vous devez disposer des autorisations IAM suivantes :

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (sur la table cible et toutes les tables référencées dans les règles d'accès au niveau des lignes de sous-requête accordées)
  • bigquery.jobs.create (pour exécuter la tâche de requête LDD)

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour créer et mettre à jour une règle d'accès au niveau des lignes :

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

Le rôle bigquery.filteredDataViewer

Lorsque vous créez une règle d'accès au niveau des lignes, vous attribuez automatiquement le rôle bigquery.filteredDataViewer aux membres de la liste des bénéficiaires. Le rôle bigquery.filteredDataViewer permet d'afficher les lignes définies par l'expression de filtre de la règle. Lorsque vous répertoriez les règles d'accès au niveau de la ligne d'une table dans Google Cloud Console, ce rôle est affiché en association avec les membres de la liste des bénéficiaires.

Consultez les bonnes pratiques en matière de sécurité au niveau des lignes lorsque vous utilisez le rôle bigquery.filteredDataViewer avec IAM.

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

Créer ou mettre à jour des règles d'accès au niveau des lignes

Pour créer ou mettre à jour une règle d'accès au niveau des lignes, utilisez l'une des instructions LDD suivantes :

  • L'instruction CREATE ROW ACCESS POLICY crée une règle d'accès au niveau des lignes.

  • L'instruction CREATE ROW ACCESS POLICY IF NOT EXISTS crée une règle d'accès au niveau des lignes si une règle d'accès portant le même nom n'existe pas déjà dans la table spécifiée.

  • L'instruction CREATE OR REPLACE ROW ACCESS POLICY met à jour une règle d'accès existante au niveau des lignes portant le même nom sur la table spécifiée.

Examples

Créez une règle d'accès au niveau des lignes. L'accès à la table est limité à l'utilisateur abc@example.com. Seules les lignes où region = 'APAC' est visible.

CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');

Mettez à jour la règle d'accès à appliquer au compte de service example@exampleproject.iam.gserviceaccount.com à la place :

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('serviceAccount:example@exampleproject.iam.gserviceaccount.com')
FILTER USING (region = 'APAC');

Créez une règle d'accès aux lignes permettant d'autoriser l'accès à un utilisateur et à deux groupes :

CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('user:john@example.com',
          'group:sales-us@example.com',
          'group:sales-managers@example.com')
FILTER USING (region = 'US');

Créez une règle d'accès aux lignes avec allAuthenticatedUsers comme bénéficiaires :

CREATE ROW ACCESS POLICY us_filter
ON project.dataset.my_table
GRANT TO ('allAuthenticatedUsers')
FILTER USING (region = 'US');

Créez une règle d'accès aux lignes avec un filtre basé sur l'utilisateur actuel :

CREATE ROW ACCESS POLICY my_row_filter
ON dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (email = SESSION_USER());

Créez une règle d'accès aux lignes avec un filtre sur une colonne de type ARRAY :

CREATE ROW ACCESS POLICY my_reports_filter
ON project.dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));

Créez une règle d'accès aux lignes avec une sous-requête pour remplacer plusieurs règles par une simple comparaison de régions configurée par utilisateur :

Pour envoyer des commentaires ou demander de l'aide concernant cette fonctionnalité, envoyez un e-mail à l'adresse bigquery-row-level-security-support@google.com.

Prenons l'exemple de table suivant, lookup_table :

+-----------------+--------------+
|      email      |    region    |
+-----------------+--------------+
| xyz@example.com | europe-west1 |
| abc@example.com | us-west1     |
| abc@example.com | us-west2     |
+-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (region IN (
    SELECT
      region
    FROM
      lookup_table
    WHERE
      email = SESSION_USER()));

L'utilisation de la sous-requête sur lookup_table vous permet d'éviter de créer plusieurs règles d'accès aux lignes. Par exemple, l'instruction précédente donne le même résultat que celui ci-dessous, avec moins de requêtes :

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'us-west1');

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region IN 'us-west1', 'us-west2');

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:xyz@example.com')
FILTER USING (region = 'europe-west1');

Pour en savoir plus sur la syntaxe et les options disponibles, consultez la documentation de référence sur l'instruction LDD CREATE ROW ACCESS POLICY.

Combiner des règles d'accès au niveau des lignes

Si au moins deux règles d'accès au niveau des lignes accordent à un utilisateur ou à un groupe d'utilisateurs l'accès à la même table, l'utilisateur ou le groupe a accès à toutes les données couvertes par chacune des règles. Par exemple, les règles suivantes accordent à l'utilisateur abc@example.com l'accès à des lignes spécifiées dans la table my_table :

CREATE ROW ACCESS POLICY shoes
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (color = 'blue');

Dans l'exemple précédent, l'utilisateur abc@example.com a accès aux lignes de la table my_table dont le champ product_category est défini sur shoes, et abc@example.com a également accès aux lignes dont le champ color est défini sur blue. Par exemple, abc@example.com pourrait accéder aux lignes contenant des informations sur des chaussures rouges et des voitures bleues.

Cet accès est équivalent à celui fourni par la règle d'accès au niveau des lignes unique suivante :

CREATE ROW ACCESS POLICY shoes_and_blue_products
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes' OR color = 'blue');

En revanche, pour spécifier un accès dépendant de plusieurs conditions vraies, utilisez un filtre avec un opérateur AND. Par exemple, la règle d'accès au niveau des lignes suivante autorise abc@example.com à accéder uniquement aux lignes pour lesquelles le champ product_category est défini sur shoes et le champ color est défini sur blue :

CREATE ROW ACCESS POLICY blue_shoes
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (product_category = 'shoes' AND color = 'blue');

Avec la règle d'accès au niveau des lignes précédente, abc@example.com serait en mesure d'accéder aux informations sur des chaussures bleues, mais pas sur des chaussures rouges ni des voitures bleues.

Répertorier les règles d'accès au niveau des lignes d'une table

Vous pouvez répertorier et afficher toutes les règles d'accès au niveau des lignes d'une table à l'aide de la console Google Cloud, de l'outil de ligne de commande bq ou de la méthode API RowAccessPolicies.List.

Autorisations requises

Pour répertorier les règles d'accès au niveau des lignes d'une table BigQuery, vous devez disposer de l'autorisation IAM bigquery.rowAccessPolicies.list.

Pour afficher les membres d'une règle d'accès au niveau des lignes dans une table BigQuery, vous devez disposer de l'autorisation IAM bigquery.rowAccessPolicies.getIamPolicy.

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour répertorier et afficher les règles d'accès au niveau des lignes :

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

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

Répertorier les règles d'accès au niveau des lignes d'une table

Pour répertorier les règles d'accès au niveau des lignes, procédez comme suit :

Console

  1. Pour afficher les règles d'accès au niveau des lignes, accédez à la page BigQuery dans la console Google Cloud.

    Accéder à BigQuery

  2. Cliquez sur le nom de la table pour en afficher les détails, puis cliquez sur Afficher les règles d'accès aux lignes.

    Afficher les règles d'accès aux lignes

  3. Lorsque le panneau Règles d'accès aux lignes s'affiche, la liste de toutes les règles d'accès au niveau des lignes apparaît, par nom et par filter_expression pour chaque règle.

    Détails des règles d'accès aux lignes

  4. Pour afficher tous les rôles et utilisateurs concernés par une règle d'accès au niveau des lignes, cliquez sur AFFICHER à côté de la règle. Par exemple, dans l'image ci-dessous, vous pouvez voir dans le panneau View permissions (Afficher les autorisations) que les membres de la liste des adresses autorisées disposent du rôle bigquery.filteredDataViewer.

    Détails des règles d'accès aux lignes

bq

Saisissez la commande bq ls, puis spécifiez l'option --row_access_policies. Veuillez indiquer les noms de l'ensemble de données et de la table.

    bq ls --row_access_policies dataset.table

Par exemple, la commande suivante répertorie les informations sur les règles d'accès au niveau des lignes d'une table nommée my_table dans un ensemble de données associé à l'ID my_dataset :

    bq ls --row_access_policies my_dataset.my_table

API

Utilisez la méthode RowAccessPolicies.List dans la documentation de référence de l'API REST.

Supprimer des règles d'accès au niveau des lignes

Vous pouvez supprimer une ou toutes les règles d'accès au niveau des lignes d'une table à l'aide d'une instruction LDD, si vous disposez des autorisations appropriées.

Autorisations requises

Pour supprimer une règle d'accès au niveau des lignes, vous avez besoin des autorisations IAM suivantes :

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.jobs.create (pour exécuter la tâche de requête LDD)

Pour supprimer simultanément toutes les règles d'accès au niveau des lignes dans une table, vous devez disposer des autorisations IAM suivantes :

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.rowAccessPolicies.list
  • bigquery.jobs.create (pour exécuter la tâche de requête LDD)

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour supprimer les règles d'accès au niveau des lignes :

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

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

Supprimer des règles d'accès au niveau des lignes

Pour supprimer une règle d'accès aux lignes d'une table, utilisez les instructions LDD suivantes :

  • L'instruction DROP ROW ACCESS POLICY supprime une règle d'accès au niveau des lignes sur la table spécifiée.

  • L'instruction DROP ROW ACCESS POLICY IF EXISTS supprime une règle d'accès au niveau des lignes s'il en existe une dans la table spécifiée.

  • L'instruction DROP ALL ROW ACCESS POLICIES supprime toutes les règles d'accès au niveau des lignes de la table spécifiée.

Examples

Supprimez une règle d'accès au niveau des lignes dans une table :

DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;

Supprimez toutes les règles d'accès au niveau des lignes d'une table :

DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;

Pour en savoir plus sur la suppression d'une règle d'accès au niveau des lignes, consultez la documentation de référence sur l'instruction LDD DROP ROW ACCESS POLICY.

Interroger des tables avec des règles d'accès aux lignes

Un utilisateur doit d'abord avoir accès à une table BigQuery pour pouvoir l'interroger, même s'il se trouve sur la règle grantee_list d'accès aux lignes de cette table. Sans cette autorisation, la requête échoue et renvoie une erreur access denied.

Autorisations requises

Pour interroger une table BigQuery dotée de règles d'accès au niveau des lignes, vous devez disposer de l'autorisation IAM bigquery.tables.getData et de l'autorisation IAM bigquery.rowAccessPolicies.getFilteredData. Vous devez disposer de l'autorisation IAM bigquery.tables.getData sur toutes les tables concernées.

Pour obtenir ces autorisations avec des rôles prédéfinis, vous devez disposer des rôles IAM roles/bigquery.dataViewer et roles/bigquery.filteredDataViewer.

Vous devez disposer de l'autorisation datacatalog.categories.fineGrainedGet sur toutes les colonnes avec sécurité au niveau des colonnes concernées. Pour obtenir cette autorisation avec des rôles prédéfinis, vous devez disposer du rôle datacatalog.categoryFineGrainedReader.

Afficher les résultats de la requête

Dans la console Google Cloud, lorsque vous interrogez une table avec une règle d'accès au niveau de la ligne, BigQuery affiche une notification indiquant que vos résultats peuvent être filtrés par une règle d'accès au niveau de la ligne. Cette notification s'affiche même si vous êtes membre de la liste des bénéficiaires de la règle.

Résultat de la requête sur la table avec une règle d'accès au niveau des lignes

Statistiques de tâche

Lorsque vous interrogez une table avec une règle d'accès au niveau des lignes à l'aide de l'API Job, BigQuery indique si la requête lit des tables dotées de règles d'accès aux lignes dans l'objet de réponse Job :

Exemple

Pour des raisons de simplicité, cette réponse d'objet Job a été tronquée :

{
  "configuration": {
    "jobType": "QUERY",
    "query": {
      "priority": "INTERACTIVE",
      "query": "SELECT * FROM dataset.table",
      "useLegacySql": false
    }
  },
  ...
  "statistics": {
    ...
    rowLevelSecurityStatistics: {
      rowLevelSecurityApplied: true
    },
    ...
  },
  "status": {
    "state": "DONE"
  },
  ...
}

Étape suivante