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)
  • 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)
  • 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 les commandes suivantes dans votre instruction LDD :

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

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

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

Exemples

Consultez la documentation de référence LDD pour connaître la syntaxe complète et les options afin de créer une règle d'accès au niveau des lignes.

SQL

Vous pouvez exécuter ces instructions LDD sur la page Cloud Console.

Sur la page BigQuery, saisissez l'instruction dans l'éditeur de requête.

Accéder à BigQuery

Créer une règle d'accès aux lignes, puis modifier les bénéficiaires ultérieurement

CREATE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:abc@example.com")
FILTER USING (region = "apac");
CREATE OR REPLACE ROW ACCESS POLICY My_apac_filter
ON project.dataset.My_table
GRANT TO ("user:xyz@example.com")
FILTER USING (region = "apac");

Créer une règle d'accès aux lignes avec plusieurs bénéficiaires

CREATE ROW ACCESS POLICY My_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éer une règle d'accès aux lignes avec allAuthenticatedUsers comme bénéficiaires

CREATE ROW ACCESS POLICY My_us_filter
ON project.dataset.My_table
GRANT TO ("allAuthenticatedUsers")
FILTER USING (region = "us");

Créer 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éer 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));

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 dans Cloud Console ou à l'aide de l'outil de ligne de commande bq, si vous disposez des autorisations appropriées.

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 Cloud Console.

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

Utilisez les commandes suivantes dans votre instruction LDD pour supprimer une règle d'accès aux lignes d'une table.

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

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

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

Exemples

Consultez la documentation de référence LDD pour connaître la syntaxe complète et les options afin de supprimer une règle d'accès au niveau des lignes.

SQL

Vous pouvez exécuter ces instructions LDD sur la page Cloud Console.

Sur la page BigQuery, saisissez l'instruction dans l'éditeur de requête.

Accéder à BigQuery

Supprimer une règle d'accès au niveau des lignes d'une table

DROP ROW ACCESS POLICY My_row_filter ON project.dataset.My_table;

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

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

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.

Le rôle IAM prédéfini roles/bigquery.filteredDataViewer inclut les autorisations dont vous avez besoin pour interroger une table BigQuery dotée de règles d'accès au niveau des lignes.

Afficher les résultats de la requête

Console

Dans Cloud Console, lorsque vous interrogez une table avec une règle d'accès au niveau des lignes, BigQuery affiche une notification sous forme de bannière indiquant que vos résultats peuvent être filtrés par une règle d'accès au niveau des lignes. 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