Implementieren von Datenschutz auf Entitätsebene mit Aggregationsrichtlinien¶
Der Datenschutz auf Entitätsebene stärkt den Schutz der Privatsphäre, der durch die Aggregationsrichtlinien sichergestellt wird. Mit Datenschutz auf Entitätsebene kann Snowflake sicherstellen, dass jede Gruppe eine Mindestanzahl eindeutiger Entitäten enthält, nicht nur eine Mindestanzahl von Zeilen.
Die meisten Aufgaben und Überlegungen im Zusammenhang mit Aggregationsrichtlinien sind dieselben, unabhängig davon, ob Sie Datenschutz auf Entitätsebene implementieren. Allgemeine Informationen zur Verwendung von Aggregationsrichtlinien finden Sie unter Aggregationsrichtlinien.
Allgemeine Informationen zum Datenschutz auf Entitätsebene¶
Eine Entität bezieht sich auf eine Menge von Attributen, die zu einem logischen Objekt gehören (z. B. ein Benutzerprofil oder Haushaltsdaten). Diese Attribute können verwendet werden, um eine Entität innerhalb eines Datensets zu identifizieren. Datenschutz auf Entitätsebene ist ein Feature aus dem Bereich von Privacy-Enhancing Technologies, kurz PET (dt. Technologien zum Schutz der Privatsphäre), das die Privatsphäre einer Entität schützt, die in einem freigegebenen Datenset gespeichert ist. Das Feature stellt sicher, dass Abfragen keine sensiblen Attribute einer Entität offenlegen können, selbst wenn diese Attribute in mehreren Datensätzen zu finden sind.
Um Datenschutz auf Entitätsebene zu erreichen, können Sie in Snowflake angeben, welche Spalten eine Entität identifizieren (ein Entitätsschlüssel). Damit kann Snowflake alle Datensätze identifizieren, die zu einer bestimmten Entität innerhalb eines Datensets gehören. Wenn zum Beispiel die Spalte email
als der Entitätsschlüssel definiert ist, kann Snowflake feststellen, dass alle Datensätze, in denen email=joe.smith@example.com
vorkommt, zur selben Entität gehören.
Wenn Sie mehrere Entitäten für eine Tabelle definieren, wird die Aggregationsrichtlinie für jeden Entitätsschlüssel separat ausgewertet.
Die Richtlinie wird auf eine Abfrage angewendet, auch wenn die Schlüsselspalten nicht in der Abfrage erscheinen. Bei einer Richtlinie, die sich auf den Entitätsschlüssel (user_id) bezieht, wendet die Abfrage SELECT age FROM T1 GROUP BY age;
beispielsweise die Einschränkung min_group_size
für user_id
in jeder Gruppe an, obwohl user_id
nicht in der Abfrage erscheint.
Aggregationsrichtlinien ohne Datenschutz auf Entitätsebene¶
Standardmäßig verlangen die Aggregationsrichtlinien, dass Analysten Abfragen ausführen, die Daten aggregieren, anstatt einzelne Zeilen abzurufen, wodurch die Privatsphäre auf Zeilenebene erreicht wird. Der Datenschutz auf Zeilenebene verhindert jedoch nicht, dass eine Abfrage Attribute einer Entität offenlegt, wenn diese Attribute in mehreren Zeilen gefunden werden (z. B. in einer Tabelle mit Transaktionsdaten).
Angenommen, ein Streaming-Dienst ActonViz hat eine Transaktionstabelle, die die E-Mail-Adressen (user_id
) und Haushalte (household_id
) aller Zuschauer erfasst, die sich bestimmte Sendungen ansehen.
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 kann eine Aggregationsrichtlinie verwenden, um Werbekunden zu zwingen, Daten in Gruppen zusammenzufassen, die mindestens 2 Datensätze enthalten. Dies verhindert, dass die Werbekunden Daten aus einem einzelnen Datensatz abrufen können (Datenschutz auf Zeilenebene). Wenn jeder Zuschauer und jeder Haushalt nur einmal in der Tabelle auftauchen würde, wäre das genug, um seine Privatsphäre zu schützen.
Die Abfrage eines Werbekunden könnte jedoch immer noch Informationen über die Zuschauer und deren Haushalte erhalten. Eine Abfrage könnte eine Gruppe erstellen, die ausschließlich aus Datensätzen von Haushalt 12345
besteht, oder, noch schlimmer, eine Gruppe, die ausschließlich aus Datensätzen von Zuschauer dave_sr
besteht. In beiden Fällen würde die Anzahl der Datensätze in der Gruppe den Anforderungen von ActonViz entsprechen (mindestens 2 Datensätze pro Gruppe).
Aggregationsrichtlinien mit Datenschutz auf Entitätsebene¶
Um Datenschutz auf Entitätsebene zu erreichen, können Sie in Snowflake einen oder mehrere Entitätsschlüssel angeben, wenn Sie einer Tabelle oder Ansicht eine Aggregationsrichtlinie zuweisen. Nachdem der Entitätsschlüssel definiert ist, müssen die Gruppen, die von einer Abfrage auf einer aggregationsbeschränkten Tabelle oder Ansicht zurückgegeben werden, mindestens die angegebene Anzahl von Entitäten enthalten, nicht eine angegebene Anzahl von Zeilen.
Angenommen, ActonViz definiert household_id
als Entitätsschlüssel, da dieses Attribut jeden Haushalt eindeutig identifiziert. Die Privatsphäre der einzelnen Haushalte ist nun besser geschützt. Vor der Änderung konnte eine Gruppe ausschließlich aus Datensätzen bestehen, in denen household_id = 12345
enthalten war, aber jetzt muss sie mindestens zwei unterschiedliche Werte für die household_id
enthalten.
Beachten Sie, dass der Entitätsschlüssel nicht immer mit dem Primärschlüssel einer Tabelle identisch ist. In diesem Beispiel könnte die Tabelle user_id
als Primärschlüssel verwenden, weil damit ein Zuschauer eindeutig identifiziert wird. Aber in diesem Fall möchte ActonViz die Privatsphäre eines ganzen Haushalts schützen, der aus mehreren Zuschauern besteht, und hat daher household_id
als Entitätsschlüssel gewählt.
Allgemeine Informationen zur Mindestgruppengröße¶
Jede Aggregationsrichtlinie legt eine Mindestgruppengröße fest. Ohne Datenschutz auf Entitätsebene definiert die Mindestgruppengröße die Anzahl der Datensätze, die in eine Aggregationsgruppe aufgenommen werden müssen. Wenn ein Entitätsschlüssel angegeben wird, definiert die Mindestgruppengröße die Mindestanzahl von eindeutigen Entitäten, die in der Gruppe vorkommen müssen, damit sie in den Endergebnissen angezeigt werden kann. Denken Sie daran, dass Aggregationsfunktionen wie SUM und AVG eine Gruppe zurückgeben, während GROUP BY-Spalten eine Gruppe pro eindeutigem Wert in den gruppierten Spalten zurückgeben.
Die folgenden Richtlinien auf Spaltenebene wirken sich nicht darauf aus, wie Snowflake berechnet, ob genügend Entitäten in einer Aggregationsgruppe vorhanden sind:
Projektionsrichtlinien werden nach den Aggregationsrichtlinien durchgesetzt.
Die Maskierungsrichtlinien werden vor den Aggregationsrichtlinien durchgesetzt. Alle Aggregationsfunktionen oder -richtlinien arbeiten mit maskierten Daten.
In Fällen, in denen Namensreferenzen mehrfach verwendet werden (z. B. in den Operatoren JOIN oder UNION), erzwingt Snowflake die minimale Gruppengröße für jede Namensreferenz eines jeden Datensets separat. Dies gilt auch dann, wenn die Referenz mehrmals auf dasselbe Datenset verweist.
Datenschutzes auf Entitätsebene mit Aggregationsrichtlinien durchsetzen¶
Um den Datenschutz auf Entitätsebene mit Aggregationsrichtlinien durchzusetzen, gehen Sie wie folgt vor:
Wenn Sie den Befehl CREATE AGGREGATION POLICY ausführen, um die Aggregationsrichtlinie zu erstellen, können Sie die Anzahl der Entitäten angeben, die in jeder Aggregationsgruppe enthalten sein muss.
Definieren Sie den Entitätsschlüssel, wenn Sie die Aggregationsrichtlinie einer Tabelle oder Ansicht zuweisen.
Mindestanzahl der Entitäten angeben¶
Die Syntax für das Erstellen einer Aggregationsrichtlinie mit CREATE AGGREGATION POLICY ändert sich nicht, wenn Sie einen Entitätsschlüssel verwenden, um Datenschutz auf Entitätsebene zu erreichen. Sie verwenden weiterhin das Argument MIN_GROUP_SIZE der Funktion AGGREGATION_CONSTRAINT, um eine Mindestgruppengröße anzugeben. Sobald Sie einen Entitätsschlüssel definieren, ändert sich die Mindestgruppengröße von einer Anforderung an die Anzahl der Datensätze in einer Gruppe zu der Anzahl der Entitäten in einer Gruppe.
Der folgende Befehl erstellt zum Beispiel eine Aggregationsrichtlinie mit einer Mindestgruppengröße von 5: Solange Sie bei der Zuweisung der Richtlinie zu einer Tabelle einen Entitätsschlüssel definieren, muss jede Aggregationsgruppe mindestens 5 Entitäten enthalten.
CREATE AGGREGATION POLICY my_agg_policy
AS () RETURNS AGGREGATION_CONSTRAINT ->
AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
Ausführliche Informationen zum Erstellen von Aggregationsrichtlinien, einschließlich eines Beispiels für eine bedingte Aggregationsrichtlinie, die unter verschiedenen Umständen unterschiedliche Einschränkungen durchsetzt, finden Sie unter Aggregationsrichtlinie erstellen.
Entitätsschlüssel definieren¶
Sie definieren einen Entitätsschlüssel für eine Tabelle, wenn Sie die Aggregationsrichtlinie der Tabelle oder Ansicht zuweisen. Sie können den Entitätsschlüssel definieren, wenn Sie eine neue Tabelle oder Ansicht erstellen, oder wenn Sie eine bestehende Tabelle oder Ansicht aktualisieren.
Entitätsschlüssel für bestehende Tabellen und Ansichten definieren¶
Wenn Sie den Befehl ALTER TABLE … SET AGGREGATION POLICY oder den Befehl ALTER VIEW … SET AGGREGATION POLICY ausführen, um die Aggregationsrichtlinie zuzuweisen, verwenden Sie die Klausel ENTITY KEY, um anzugeben, welche Spalten in der Tabelle oder Ansicht die identifizierenden Attribute einer Entität (d. h. den Entitätsschlüssel) enthalten.
Um beispielsweise einen Entitätsschlüssel zu erstellen, während Sie einer Tabelle viewership_log
eine Aggregationsrichtlinie my_agg_policy
zuweisen, führen Sie Folgendes aus:
ALTER TABLE viewership_log
SET AGGREGATION POLICY my_agg_policy
ENTITY KEY (first_name,last_name);
Da die Spalten first_name
und last_name
der Entitätsschlüssel sind, kann die Aggregationsrichtlinie feststellen, dass alle Zeilen mit first_name = joe
und last_name = peterbilt
zur gleichen Entität gehören.
Mehrere Entitätsschlüssel für bestehende Tabellen und Ansichten definieren¶
Um mehrere Entitätschlüssel für eine bestehende Tabelle zu definieren, können Sie entweder neue Schlüssel in mehreren Aufrufen hinzufügen oder mehrere Schlüssel in einem einzigen Aufruf hinzufügen. Die Definition eines Schlüssels für eine Tabelle ist additiv; sie überschreibt oder löscht keine zuvor definierten Schlüssel.
Fügen Sie zwei Entitätsschlüssel in zwei Aufrufen hinzu. Der erste Schlüssel besteht aus zwei Spalten.
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id, user_email);
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (vendor_id);
Zwei Entitätsschlüssel in einem Aufruf hinzufügen
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id) ENTITY KEY (vendor_id);
Entitätsschlüssel für neue Tabellen und Ansichten definieren¶
Wenn Sie den Befehl CREATE TABLE … WITH AGGREGATION POLICY oder den Befehl CREATE VIEW … WITH AGGREGATION POLICY ausführen, um die Aggregationsrichtlinie zuzuweisen, verwenden Sie die Klausel ENTITY KEY, um anzugeben, welche Spalten in der Tabelle oder Ansicht die identifizierenden Attribute einer Entität enthalten.
Um zum Beispiel eine neue Tabelle t1
zu erstellen und dabei eine Aggregationsrichtlinie zuzuweisen und einen Entitätsschlüssel zu definieren, führen Sie Folgendes aus:
CREATE TABLE t1
WITH AGGREGATION POLICY my_agg_policy
ENTITY KEY (first_name,last_name);
Da die Spalten first_name
und last_name
der Entitätsschlüssel sind, kann die Aggregationsrichtlinie feststellen, dass alle Zeilen mit first_name = joe
und last_name = peterbilt
zur gleichen Entität gehören.
Aufgeschobene Aggregationsrichtlinien¶
Wenn eine Abfrage Unterabfragen hat, versucht Snowflake, alle Aggregationsrichtlinien für Entitäten auf die innerste Abfrage anzuwenden. Wenn diese Abfrage eine GROUP BY-Klausel hat und die GROUP BY-Spalten mit dem Entitätsschlüssel für eine Aggregationsrichtlinie übereinstimmen, wird diese Aggregationsrichtlinie nicht auf diese Unterabfrage, sondern auf die übergeordnete Abfrage dieser Unterabfrage angewendet. Dieser Aufschub setzt sich die Kette hinauf fort, bis entweder eine Abfrage erreicht wird, die keinen Satz von GROUP BY-Spalten hat, die mit dem Entitätsschlüssel der Richtlinie übereinstimmen, oder bis die oberste Abfrage erreicht wird; in beiden Fällen wird die Aggregationsrichtlinie auf diese Abfrage angewendet. Eine Aggregationsrichtlinie wird nur einmal in einer Abfragekette angewendet.
Nehmen wir zum Beispiel an, Sie haben eine Aggregationsrichtlinie my_agg_policy
mit dem Entitätsschlüssel (name, zipcode)
. In der folgenden Pseudoabfrage hat die innere Abfrage einen GROUP BY-Satz, der mit dem Entitätsschlüssel für my_agg_policy
übereinstimmt, sodass die Richtlinie auf die übergeordnete Abfrage verschoben wird. Die Richtlinie wird auf die übergeordnete Ebene angewendet, da es sich um eine Abfrage der obersten Ebene handelt, auch wenn die GROUP BY-Spalten ebenfalls mit den Spalten der Richtlinie übereinstimmen.
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;
Beachten Sie, dass GROUP BY-Spalten eine Obermenge der Entitätsschlüsselspalten sein können, um einen Aufschub auszulösen, und dass Richtlinien nur aufgeschoben werden, wenn GROUP BY-Spalten übereinstimmen; Aggregationsfunktionen lösen keinen Aufschub aus.
Jede Aggregationsrichtlinie wird separat auf alle Abfrageblöcke in der Abfrage angewendet. Eine Abfrage, die aus mehreren Blöcken besteht, wertet durch einen Set-Operator (wie z. B. UNION) die Aggregationsrichtlinien für jeden Abfrageblock separat aus.
Der Aufschub der Aggregation hat einige nützliche Auswirkungen, wie das folgende Beispiel zeigt.
Beispiel für einen Aufschub¶
Stellen Sie sich vor, Sie möchten Benutzer in zwei Buckets zusammenfassen, „Low Spenders“ und „High Spenders“, für Entitäten, die als (zipcode, email)
definiert sind. Der Aufschub ermöglicht dies wie im folgenden Beispiel gezeigt. Ohne Aufschub würde die innere Abfrage NULL zurückgeben, da jede Gruppe aus einer (zipcode, email)
-Entität besteht, die unterdrückt wird, wenn min_group_size
auf einen Wert größer als 1 gesetzt wird.
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;
Aufschub von mehreren Richtlinien¶
Wenn eine Tabelle mehrere Aggregationsrichtlinien hat, wird jede Aggregationsrichtlinie unabhängig ausgewertet und möglicherweise aufgeschoben. Wenn Sie mehrere Aggregationsrichtlinien für eine Tabelle verwenden, sollten Sie Ihre Abfragen sorgfältig gestalten, da unerwartete Ergebnisse auftreten können, wenn verschiedene Richtlinien auf verschiedenen Abfrageebenen angewendet werden.
Hier ein Beispiel für ein Problem, auf das Sie stoßen könnten, wenn Sie eine verschachtelte Abfrage ausprobieren, um Ihre Benutzer in einer Tabelle mit zwei separaten Aggregationsrichtlinien in Buckets für hohe und niedrige Ausgaben einzuteilen:
Tabelle 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
Aggregationsrichtlinien:
user_policy
:min_group_size
= 3, Entitätsschlüssel =(user_id)
vendor_policy
:min_group_size
= 2, Entitätsschlüssel =(vendor_id)
Abfrage an den Bucket von Benutzern, die viel oder wenig Geld ausgeben:
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
Unerwartete Ergebnisse:
In der inneren Abfrage wird vendor_policy
erzwungen. Jede Zeile ist nach user_id
gruppiert, die nur eine entsprechende vendor_id
hat, was gegen die vendor_policy
-Mindestgruppengröße verstößt, und die innere Abfrage wird NULL zurückgeben, obwohl drei verschiedene Kunden in den Bucket „High“ gehören.
Entitätsschlüssel-Einschränkungen entfernen¶
So entfernen Sie eine Aggregationsrichtlinie für einen einzelnen Entitätsschlüssel:
-- Drop agg policy ap associated with entity key user_id
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
Um eine Aggregationsrichtlinie für mehrere Entitätsschlüssel zu entfernen, entfernen Sie jede Richtlinie einzeln:
-- 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)
Um eine Aggregationsrichtlinie zusammen mit all ihren Entitäten zu entfernen, lassen Sie ENTITY KEY in der DROP-Anweisung weg:
-- Drop agg policy ap from the table entirely
ALTER TABLE transactions DROP AGGREGATION POLICY ap
Einschränkungen¶
Die folgenden Einschränkungen gelten, wenn Sie mit Tabellen arbeiten, für die mehrere Entitätsschlüssel oder Aggregationsrichtlinien definiert sind:
Ein Entitätsschlüssel kann mit höchstens einer Richtlinie verknüpft sein. Der Versuch, eine andere Richtlinie für einen Entitätsschlüssel zuzuweisen, der bereits einer Richtlinie zugeordnet ist, führt zu einem Fehler.
Eine Richtlinie kann nicht sowohl für den Datenschutz auf Zeilenebene als auch für den Datenschutz auf Entitätsebene verwendet werden.
Für den Datenschutz auf Zeilenebene kann höchstens eine Richtlinie verwendet werden. Der Versuch, eine andere Richtlinie als Aggregationsrichtlinie auf Zeilenebene zuzuweisen, führt zu einem Fehler.
Abfragen von Tabellen mit Aggregationseinschränkung¶
Die Anforderungen an das Abfragen einer Tabelle mit Aggregationseinschränkung, die einen Entitätsschlüssel hat, sind dieselben wie beim Abfragen von Tabellen ohne einen solchen. Weitere Informationen darüber, welche Typen von Abfragen diesen Anforderungen entsprechen, finden Sie unter Abfrageanforderungen.