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.
Vous pouvez effectuer les tâches suivantes avec des règles d'accès au niveau des lignes :
- Créer ou mettre à jour une règle d'accès au niveau des lignes dans une table
- Combiner des règles d'accès au niveau des lignes dans une table.
- Répertorier les règles d'accès au niveau des lignes d'une table
- Supprimer une règle d'accès au niveau des lignes dans une table
- Interroger une table avec une règle 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.
Exemples
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
Pour afficher les règles d'accès au niveau des lignes, accédez à la page BigQuery dans la console Google Cloud.
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.
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.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
.
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.
Exemples
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.
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
Pour en savoir plus sur le fonctionnement de la sécurité au niveau des lignes avec les autres fonctionnalités et services BigQuery, consultez la page Utiliser la sécurité au niveau des lignes avec d'autres fonctionnalités BigQuery.
Pour en savoir plus sur les bonnes pratiques à adopter concernant la sécurité au niveau des lignes, consultez la page Bonnes pratiques en matière de sécurité au niveau des lignes dans BigQuery.