Mise en œuvre de la protection de la confidentialité au niveau de l’entité à l’aide de politiques d’agrégation¶
Le respect de la vie privée au niveau de l’entité renforce les protections de la confidentialité fournies par les politiques d’agrégation. Avec la confidentialité au niveau de l’entité, Snowflake peut s’assurer que chaque groupe contient un nombre minimum d’entités uniques, et pas seulement un nombre minimum de lignes.
La majorité des tâches et des considérations liées aux politiques d’agrégation sont les mêmes, que vous mettiez en œuvre ou non la protection de la confidentialité au niveau de l’entité. Pour obtenir des informations générales sur l’utilisation des politiques d’agrégation, consultez Politiques d’agrégation.
À propos de la protection de la confidentialité au niveau de l’entité¶
Une entité fait référence à un ensemble d’attributs appartenant à un objet logique (par exemple, un profil d’utilisateur ou des informations sur un foyer). Ces attributs peuvent être utilisés pour identifier une entité au sein d’un ensemble de données. La confidentialité au niveau de l’entité est une fonction des technologies améliorant la confidentialité (PET) qui protège la confidentialité d’une entité stockée dans un ensemble de données partagé. Il garantit que les requêtes ne peuvent pas exposer les attributs sensibles d’une entité, même si ces attributs se trouvent dans plusieurs enregistrements.
Pour assurer la confidentialité au niveau de l’entité, Snowflake vous permet de spécifier les colonnes qui identifient une entité (une clé d’entité). Cela permet à Snowflake d’identifier tous les enregistrements qui appartiennent à une entité particulière au sein d’un ensemble de données. Par exemple, si la clé de l’entité est définie comme la colonne email
, Snowflake peut déterminer que tous les enregistrements contenant email=joe.smith@example.com
appartiennent à la même entité.
Lorsque vous définissez plusieurs entités pour une table, la politique d’agrégation est évaluée séparément pour chaque clé d’entité.
La politique est appliquée à une requête même si les colonnes clés n’apparaissent pas dans la requête. Par exemple, compte tenu d’une politique qui s’applique à la clé de l’entité (user_id), la requête SELECT age FROM T1 GROUP BY age;
appliquera toujours la restriction min_group_size
pour user_id
dans chaque groupe, bien que user_id
n’apparaisse pas dans la requête.
Politiques d’agrégation sans confidentialité au niveau de l’entité¶
Par défaut, les politiques d’agrégation obligent les analystes à exécuter des requêtes qui agrègent les données plutôt que d’extraire des lignes individuelles, ce qui permet d’assurer la confidentialité au niveau des lignes. Cependant, la confidentialité au niveau des lignes n’empêche pas une requête d’exposer les attributs d’une entité lorsque ces attributs se trouvent dans plusieurs lignes (par exemple, dans une table contenant des données transactionnelles).
Par exemple, supposons qu’un service de diffusion en continu, ActonViz, dispose d’une table transactionnelle contenant l’adresse e-mail (user_id
) et le foyer (household_id
) de chaque téléspectateur lorsqu’il regarde des émissions.
user_id |
household_id |
program_id |
watch_time |
start_time |
---|---|---|---|---|
dave_sr@example.com |
12345 |
1 |
29 |
2023-09-12 09:00 |
mary@bazco.com |
23485 |
1 |
30 |
2023-09-12 09:00 |
dave_sr@example.com |
12345 |
6 |
18 |
2023-09-11 13:00 |
joe@jupiterlink.com |
85456 |
6 |
25 |
2023-09-15 22:00 |
junior@example.com |
12345 |
5 |
30 |
2023-09-13 11:00 |
ActonViz peut utiliser une politique d’agrégation pour forcer les annonceurs à agréger les données dans des groupes contenant au moins deux enregistrements. Cela empêche les annonceurs de récupérer les données d’un enregistrement individuel (confidentialité au niveau de la ligne). Si chaque téléspectateur et chaque ménage n’apparaissait qu’une seule fois dans la table, cela suffirait à protéger leur confidentialité.
Cependant, la requête d’un annonceur peut toujours obtenir des informations sur les téléspectateurs et leurs foyers. Une requête pourrait créer un groupe composé uniquement d’enregistrements du ménage 12345
ou, pire encore, un groupe composé uniquement d’enregistrements du téléspectateur dave_sr
. Dans les deux cas, le nombre d’enregistrements dans le groupe répondrait aux exigences fixées par ActonViz (minimum de deux enregistrements par groupe).
Politiques d’agrégation avec confidentialité au niveau de l’entité¶
Pour assurer la confidentialité au niveau de l’entité, Snowflake vous permet de spécifier une ou plusieurs clés d’entité lors de l’affectation d’une politique d’agrégation à une table ou à une vue. Une fois la clé d’entité définie, les groupes renvoyés par une requête sur une table ou une vue soumise à des contraintes d’agrégation doivent contenir au moins le nombre spécifié d’entités, et non un nombre spécifié de lignes.
Dans l’exemple précédent, supposons que ActonViz définisse household_id
comme la clé de l’entité parce qu’il identifie chaque ménage de manière unique. La vie privée de chaque ménage est désormais améliorée. Avant la modification, un groupe pouvait être entièrement constitué d’enregistrements où household_id = 12345
, mais il doit désormais contenir au moins deux valeurs distinctes de household_id
.
Notez que la clé d’entité n’est pas toujours la même que la clé primaire d’une table. Dans cet exemple, la table peut utiliser user_id
comme clé primaire, car elle identifie de manière unique un spectateur. Mais dans ce cas, ActonViz veut protéger la confidentialité d’un foyer entier, composé de plusieurs téléspectateurs et a donc choisi household_id
comme clé d’entité.
À propos des tailles de groupe minimales¶
Chaque politique d’agrégation spécifie une taille de groupe minimale. Sans confidentialité au niveau de l’entité, la taille minimale du groupe définit le nombre d’enregistrements qui doivent être inclus dans un groupe d’agrégation. Lorsqu’une clé d’entité est spécifiée, la taille minimale du groupe définit le nombre minimum d’entités uniques qui doivent figurer dans le groupe pour qu’il apparaisse dans les résultats finaux. N’oubliez pas que les fonctions d’agrégation telles que SUM et AVG renvoient un groupe, alors que les colonnes GROUP BY renvoient un groupe par valeur unique dans les colonnes regroupées.
Les politiques de niveau colonne suivantes n’affectent pas la manière dont Snowflake calcule s’il y a suffisamment d’entités dans un groupe d’agrégation :
Les politiques de projection sont appliquées après les politiques d’agrégation.
Les politiques de masquage sont appliquées avant les politiques d’agrégation. Toutes les fonctions ou politiques d’agrégation fonctionnent sur des données masquées.
Dans les cas où les références de noms sont utilisées plusieurs fois (par exemple, dans les opérateurs JOIN ou UNION), Snowflake applique la taille minimale du groupe pour chaque référence de nom de chaque ensemble de données séparément. Cela s’applique même lorsque la référence renvoie plusieurs fois au même ensemble de données.
Renforcer la protection de la confidentialité au niveau de l’entité grâce à des politiques d’agrégation¶
Pour appliquer la confidentialité au niveau de l’entité avec des politiques d’agrégation, procédez comme suit :
Lorsque vous exécutez la commande CREATE AGGREGATION POLICY pour créer la politique d’agrégation, spécifiez le nombre d’entités qui doivent être incluses dans chaque groupe d’agrégation.
Définissez la clé d’entité lorsque vous affectez la politique d’agrégation à une table ou à une vue.
Spécifier le nombre minimum d’entités¶
La syntaxe de création d’une politique d’agrégation avec CREATE AGGREGATION POLICY ne change pas si vous utilisez une clé d’entité pour obtenir une confidentialité au niveau de l’entité. Vous pouvez toujours utiliser l’argument MIN_GROUP_SIZE de la fonction AGGREGATION_CONSTRAINT pour spécifier une taille de groupe minimale. Dès que vous définissez une clé d’entité, la taille minimale du groupe passe d’une exigence sur le nombre d’enregistrements dans un groupe à une exigence sur le nombre d’entités dans un groupe.
Par exemple, la commande suivante crée une politique d’agrégation de taille de groupe minimale égale à 5. Tant que vous définissez une clé d’entité lors de l’affectation de la politique à une table, chaque groupe d’agrégation doit contenir au moins 5 entités.
CREATE AGGREGATION POLICY my_agg_policy
AS () RETURNS AGGREGATION_CONSTRAINT ->
AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
Pour plus de détails sur la création de politiques d’agrégation, y compris un exemple de politique d’agrégation conditionnelle qui applique des restrictions différentes selon les circonstances, voir Création d’une politique d’agrégation.
Définir une clé d’entité¶
Vous définissez une clé d’entité pour une table lorsque vous affectez la politique d’agrégation à la table ou à la vue. Vous pouvez définir la clé d’entité lorsque crée une nouvelle table ou vue, ou lorsque met à jour une table ou une vue existante.
Définir une clé d’entité pour les tables et les vues existantes¶
Lorsque vous exécutez la commande ALTER TABLE … SET AGGREGATION POLICY ou la commande ALTER VIEW … SET AGGREGATION POLICY pour affecter la politique d’agrégation, utilisez la clause ENTITY KEY pour spécifier les colonnes de la table ou de la vue qui contiennent les attributs d’identification d’une entité (c’est-à-dire la clé d’entité).
Par exemple, pour créer une clé d’entité tout en affectant une politique d’agrégation my_agg_policy
à une table viewership_log
, exécutez :
ALTER TABLE viewership_log
SET AGGREGATION POLICY my_agg_policy
ENTITY KEY (first_name,last_name);
Comme les colonnes first_name
et last_name
sont la clé de l’entité, la politique d’agrégation peut déterminer que toutes les lignes où first_name = joe
et last_name = peterbilt
appartiennent à la même entité.
Définir plusieurs clés d’entité pour les tables et les vues existantes¶
Pour définir plusieurs clés d’entité pour une table existante, vous pouvez soit ajouter de nouvelles clés en plusieurs appels, soit ajouter plusieurs clés en un seul appel. La définition d’une clé sur une table est additive ; elle n’écrase ni ne supprime les clés définies précédemment.
Ajoutez deux clés d’entité en deux appels. La première clé comprend deux colonnes.
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id, user_email);
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (vendor_id);
Ajouter deux clés d’entité en un seul appel
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id) ENTITY KEY (vendor_id);
Définissez une clé d’entité pour les nouvelles tables et vues¶
Lorsque vous exécutez la commande CREATE TABLE … WITH AGGREGATION POLICY ou la commande CREATE VIEW … WITH AGGREGATION POLICY pour affecter la politique d’agrégation, utilisez la clause ENTITY KEY pour spécifier les colonnes de la table ou de la vue qui contiennent les attributs d’identification d’une entité.
Par exemple, pour créer une nouvelle table t1
tout en attribuant une politique d’agrégation et en définissant une clé d’entité, exécutez :
CREATE TABLE t1
WITH AGGREGATION POLICY my_agg_policy
ENTITY KEY (first_name,last_name);
Comme les colonnes first_name
et last_name
sont la clé de l’entité, la politique d’agrégation peut déterminer que toutes les lignes où first_name = joe
et last_name = peterbilt
appartiennent à la même entité.
Politiques d’agrégation différée¶
Si une requête comporte des sous-requêtes, Snowflake tentera d’appliquer les politiques d’agrégation d’entités sur la requête la plus interne. Si cette requête comporte une clause GROUP BY et que les colonnes de GROUP BY correspondent à la clé d’entité d’une politique d’agrégation, cette politique d’agrégation ne sera pas appliquée à cette sous-requête mais à la requête parent de cette sous-requête. Ce report se poursuit dans la chaîne jusqu’à ce qu’une requête soit atteinte sans qu’un ensemble de colonnes GROUP BY ne corresponde à la clé d’entité de la politique, ou jusqu’à ce que la requête de niveau supérieur soit atteinte ; dans les deux cas, la politique d’agrégation sera appliquée à cette requête. Une politique d’agrégation n’est appliquée qu’une seule fois dans une chaîne de requêtes.
Par exemple, supposons que vous ayez une politique d’agrégation my_agg_policy
avec la clé d’entité (name, zipcode)
. Dans la pseudo requête suivante, la requête interne a un ensemble GROUP BY qui correspond à la clé d’entité pour my_agg_policy
, et la politique est donc différée à son parent. La politique est appliquée au niveau du parent parce qu’il s’agit d’une requête de niveau supérieur, même si les colonnes GROUP BY correspondent également aux colonnes de la politique.
SELECT age, name, zipcode FROM( -- Outermost query: my_agg_policy enforced.
SELECT name, zipcode FROM T GROUP BY name, zipcode -- Matches my_agg_policy entity key: my_agg_policy deferred
)
GROUP BY age, name, zipcode;
Notez que les colonnes de GROUP BY peuvent être un surensemble des colonnes de la clé de l’entité pour déclencher un report, et que les politiques ne sont reportées que lorsque les colonnes de GROUP BY correspondent ; les fonctions d’agrégation ne déclenchent pas de report.
Chaque politique d’agrégation est appliquée séparément à tous les blocs de la requête. Une requête composée de plusieurs blocs via un opérateur d’ensemble (tel que UNION) évaluera les politiques d’agrégation séparément pour chaque bloc de la requête.
Le report d’agrégation a des effets utiles, comme le montre l’exemple suivant.
Exemple de report¶
Imaginez que vous souhaitiez regrouper les utilisateurs en deux compartiments, les peu dépensiers et les très dépensiers, pour des entités définies comme (zipcode, email)
. Le report permet de réaliser cette opération, comme le montre l’exemple suivant. Sans report, la requête interne renverrait NULL, car chaque groupe serait constitué d’une entité (zipcode, email)
, qui serait supprimée lorsque min_group_size
est paramétré à une valeur supérieure à 1
WITH bucketed AS (
SELECT
CASE
WHEN SUM(transaction_amount) BETWEEN 0 AND 100 THEN 'low'
WHEN SUM(transaction_amount) BETWEEN 101 AND 100000 THEN 'high'
END AS transaction_bucket,
zipcode, -- zipcode and email need not appear in the select list, but this lets us compute entity_count below
email
FROM my_transactions
GROUP BY zipcode, email -- This would not work if it was only GROUP BY zipcode, since the entity key is (zipcode, email)
)
SELECT
transaction_bucket,
COUNT(DISTINCT zipcode, email) AS entity_count
FROM
bucketed
GROUP BY transaction_bucket;
Report de polices multiples¶
Si une table a plusieurs politiques d’agrégation, chaque politique d’agrégation est évaluée, et éventuellement différée, indépendamment. Si vous avez plusieurs politiques d’agrégation sur une table, concevez vos requêtes avec soin, car vous risquez d’obtenir des résultats inattendus lorsque différentes politiques sont appliquées à différents niveaux de la requête.
Par exemple, voici un problème que vous pourriez rencontrer si vous essayez d’utiliser une requête imbriquée pour classer vos utilisateurs dans des catégories de dépenses élevées et faibles sur une table avec deux politiques d’agrégation distinctes :
Table T :
user_id, vendor_id, zipcode, email, transaction_amount 1 1001 90000 a@example.com 100 1 1001 90000 a@example.com 50 2 2001 90001 b@example.com 12 2 2001 90001 b@example.com 5 3 3001 90002 c@example.com 40
Politiques d’agrégation :
user_policy
:min_group_size
= 3, clé de l’entité =(user_id)
vendor_policy
:min_group_size
= 2, clé de l’entité =(vendor_id)
Requête permettant de compartimenter les utilisateurs selon qu’ils dépensent beaucoup ou peu :
WITH amounts AS ( SELECT user_id, IFF(SUM(transaction_amount) > 50, 'high', 'low') AS bucket FROM T GROUP BY user_id -- user_policy is deferred, but vendor_policy is enforced ) SELECT COUNT(*) FROM amounts GROUP BY bucket
Résultats inattendus :
Dans la requête interne, vendor_policy
est appliqué. Chaque ligne est groupée par user_id
, qui n’a qu’un seul correspondant vendor_id
, ce qui viole la taille minimale du groupe vendor_policy
, et la requête interne renverra NULL, même si trois clients distincts appartiennent au compartiment haut.
Suppression des contraintes de clé d’entité¶
Pour supprimer une politique d’agrégation pour une seule clé d’entité :
-- Drop agg policy ap associated with entity key user_id
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
Pour supprimer une politique d’agrégation pour plusieurs clés d’entité, supprimez chaque politique séparément :
-- Drop the agg policies associated with two separate keys
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (vendor_id)
Pour supprimer une politique d’agrégation ainsi que toutes ses entités, omettez ENTITY KEY dans l’instruction DROP:
-- Drop agg policy ap from the table entirely
ALTER TABLE transactions DROP AGGREGATION POLICY ap
Restrictions¶
Les restrictions suivantes s’appliquent lorsque vous travaillez avec des tables pour lesquelles plusieurs clés d’entité ou politiques d’agrégation ont été définies :
Une clé d’entité peut être associée à une politique au maximum. Si vous tentez d’attribuer une autre politique à une clé d’entité déjà mappée à une politique, vous obtiendrez une erreur.
Une politique ne peut être utilisée à la fois pour la confidentialité au niveau des lignes et au niveau des entités.
Une seule politique peut être utilisée pour la confidentialité au niveau des lignes. Toute tentative d’affectation d’une autre politique en tant que politique d’agrégation au niveau de la ligne entraînera une erreur.
Requête sur une table soumise à des contraintes d’agrégation¶
Les conditions requises pour l’interrogation d’une table soumise à des contraintes d’agrégation qui possède une clé d’entité sont les mêmes que celles requises pour l’interrogation d’une table qui n’en possède pas. Pour obtenir des informations sur les types de requêtes conformes à ces exigences, consultez Conditions des requêtes.