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 :

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

  2. 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);
Copy

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);
Copy

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);
Copy

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);
Copy

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);
Copy

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;
Copy

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;
Copy

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
Copy

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)
Copy

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)
Copy

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
Copy

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.