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 :
- Créer ou mettre à jour une règle 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)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.
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
Pour afficher les règles d'accès au niveau des lignes, accédez à la page BigQuery dans Cloud Console.
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.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.
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.
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.