Erste Schritte mit Differential Privacy

Einführung

Dieses Tutorial zeigt Ihnen, wie Sie sensible Daten mit einer Richtlinie für differentielle Privatsphäre (Differential Privacy) schützen können, damit Sie sie sicher mit Analysten teilen können.

Lerninhalte

In diesem Tutorial erfahren Sie, wie Sie Folgendes tun können:

  • Erstellen Sie eine Richtlinie für differentielle Privatsphäre.

  • Wenden Sie diese Datenschutzrichtlinie auf eine Tabelle an, um sie mit differentieller Privatsphäre zu schützen.

  • Definieren Sie Datenschutzdomänen für eine Tabelle.

  • Führen Sie eine Abfrage über eine Tabelle aus, die durch differentielle Privatsphäre geschützt ist.

  • Bestimmen Sie die Menge an Rauschen in den Abfrageergebnissen ist.

In diesem Tutorial werden die Schlüsselkonzepte der differentiellen Privatsphäre, wie Rauschen, Datenschutzbudgets und Datenschutzbereiche nicht vollständig erklärt. In diesem Tutorial geht es darum, wie Sie differentielle Privatsphäre auf Ihre Daten anwenden können.

Über Admins und Analysten

In diesem Tutorial werden Sie von zwei Personas ausgehen:

  • Der Administrator, der Berechtigungen für die Rohdaten hat und unterschiedliche Richtlinien für differentielle Privatsphäre für eine Tabelle verwaltet.

  • Der Analyst, der Abfragen zu diesen geschützten Daten durchführt.

In der Praxis kann es sich dabei um zwei verschiedene Personen oder Personengruppen handeln oder aber um eine Person, die die geschützten Ergebnisse analysieren und sicher mit anderen teilen möchte.

Dieses Tutorial zeigt zwar, wie Abfragen auf geschützte Daten ausgeführt werden, aber es soll in erster Linie zeigen, wie man differentielle Privatsphäre implementiert und nicht, wie man damit umgeht.

Voraussetzungen

  • Sie müssen über ein Konto mit Enterprise Edition oder höher verfügen.

  • Sie müssen die Rolle ACCOUNTADMIN verwenden können.

Wichtig

In diesem Tutorial werden Sie alle Schritte der Admin-Persona mit der Rolle ACCOUNTADMIN durchführen. In der Regel sollten Sie jedoch Rollen verwenden, deren Berechtigungen speziell für die von Ihnen durchgeführte Aktion definiert sind. Die Berechtigungen, die zum Erstellen und Anwenden von Datenschutzrichtlinien erforderlich sind, werden hier beschrieben.

Erstellen Sie Rollen, ein Warehouse und Daten

In diesem Abschnitt werden Sie die folgenden Einrichtungsschritte durchführen:

  • Erstellen Sie eine Rolle für den Analysten.

  • Erstellen Sie das Warehouse, mit dem Sie die Abfragen gegen die geschützten Daten ausführen.

  • Erstellen Sie nachgebildete sensible Daten, die durch die Datenschutzrichtlinie geschützt werden.

Keiner dieser Einrichtungsschritte ist spezifisch für Richtlinien für differentielle Privatsphäre. Wenn es bereits eine passende Rolle, ein passendes Warehouse und/oder einen passenden Datasatz gibt, können Sie diese stattdessen verwenden.

Erstellen Sie die Rolle des Analysten

Führen Sie in einem Snowsight-Arbeitsblatt oder einer anderen Umgebung, die mit der Ausführung von Snowflake SQL über Ihr Snowflake-Konto verbunden ist, die folgenden Befehle aus, um die Analystenrolle zu erstellen und sie sich selbst zuzuweisen:

USE ROLE ACCOUNTADMIN;
CREATE ROLE dp_tutorial_analyst;

-- You can find your own user name by running "SELECT CURRENT_USER();"
GRANT ROLE dp_tutorial_analyst TO USER <user_name>;
Copy

Erstellen Sie ein Warehouse für die Daten

CREATE OR REPLACE WAREHOUSE dp_tutorial_wh;
GRANT USAGE ON WAREHOUSE dp_tutorial_wh TO ROLE dp_tutorial_analyst;
Copy

Sensible Daten nachbilden

Mit den folgenden Befehlen erstellen Sie eine Datenbank, ein Schema und eine Tabelle und füllen sie mit Daten. Die Daten simulieren eine einfache Diabetes-Studie, bei der wir die Identität der Patienten schützen wollen. Im weiteren Verlauf des Tutorials werden Sie die differentielle Privatsphäre verwenden, um die Identität der Personen in der Studie zu schützen.

-- Create the table
CREATE OR REPLACE DATABASE dp_db;
CREATE OR REPLACE SCHEMA dp_db.dp_schema;
USE SCHEMA dp_db.dp_schema;
CREATE OR REPLACE TABLE dp_tutorial_diabetes_survey (
  patient_id TEXT,
  is_smoker BOOLEAN,
  has_difficulty_walking BOOLEAN,
  gender TEXT,
  age INT,
  has_diabetes BOOLEAN,
  income_code INT);

-- Populate the table
INSERT INTO dp_db.dp_schema.dp_tutorial_diabetes_survey
VALUES
('ID-23493', TRUE, FALSE, 'male', 39, TRUE, 2),
('ID-00923', FALSE, FALSE, 'female', 82, TRUE, 5),
('ID-24020', FALSE, FALSE, 'male', 69, FALSE, 8),
('ID-92848', TRUE, TRUE, 'other', 75, FALSE, 3),
('ID-62937', FALSE, FALSE, 'male', 46, TRUE, 5);
Copy

Anmerkungen:

Auch wenn es den Anschein hat, dass die Maskierung der Patienten-ID besser wäre als die Verwendung von differentieller Privatsphäre, würde dies jedoch Verknüpfungen mit dieser Spalte verhindern. Wenn Sie eine Tabelle hinzufügen, in der jeder Patient mehrere Zeilen hat, wie z. B. eine Medikamententabelle oder eine Besuchstabelle, würde eine einfache Maskierung verhindern, dass Sie die Ergebnisse nach Personen gruppieren können. Dies ist ein Fall, in dem differentielle Privatsphäre viel leistungsfähiger sein kann als einfaches Maskieren und Ausblenden von Zeilen. Sie können Analysten mehr von Ihren Daten zur Verfügung stellen und nützlichere Abfragen ermöglichen, während Sie gleichzeitig die Privatsphäre der Entitäten schützen.

Definieren Sie eine Datenschutzrichtlinie

Die Anwendung einer Datenschutzrichtlinie auf eine Tabelle oder Ansicht schützt diese mit differentieller Privatsphäre und weist Gruppen oder Benutzern ein Datenschutzbudget zu, sodass Snowflake verhindern kann, dass mehrere Abfragen zu viele sensible Informationen preisgeben.

Sie erstellen die Datenschutzrichtlinie in einer eigenen Datenbank. Dies ist eine bewährte Vorgehensweise für alle Arten von Richtlinien in Snowflake. Wenn Sie die Richtlinie in der gleichen Datenbank erstellen, würde das Klonen der Datenbank unsynchronisierte Kopien der Richtlinie erzeugen. Wenn Sie alle Richtlinien in einer einzigen, separaten Datenbank speichern und sie auf mehrere Tabellen anwenden, können Sie eine einzige Kopie jeder Richtlinie verwalten und aktualisieren.

Sie werden diese neue Richtlinie patients_policy nennen.

-- Define a privacy policy. Use default budget, budget window, max budget per aggregate.
CREATE OR REPLACE DATABASE policy_db;
CREATE OR REPLACE SCHEMA policy_db.diff_priv_policies;
CREATE OR REPLACE PRIVACY POLICY policy_db.diff_priv_policies.patients_policy AS () RETURNS privacy_budget ->
  CASE
    WHEN CURRENT_ROLE() = 'ACCOUNTADMIN' THEN no_privacy_policy()
    WHEN CURRENT_ROLE() IN ('DP_TUTORIAL_ANALYST')
      THEN privacy_budget(budget_name => 'clinical_analysts')
    ELSE privacy_budget(budget_name => 'default')
END;
Copy

Anmerkungen:

  • Die angewandte Datenschutzrichtlinie hängt von der Rolle des Benutzers ab, wie in der CASE-Anweisung angegeben. Rollennamen werden hier in Großbuchstaben angegeben, da CURRENT_ROLE() Werte in Großbuchstaben zurückgibt.

  • Durch die Erstellung separater Datenschutzbudgets pro Rolle können Sie das für Analysten und andere Benutzer verwendete Budget trennen und die Nutzung durch die einzelnen Gruppen überwachen.

  • Wenn die Datenschutzrichtlinie bei der Auswertung ein gültiges Datenschutzbudget ergibt, kann der Benutzer keine nicht aggregierten SELECT-Abfragen durchführen, den Ergebnissen wird Rauschen hinzugefügt, und die Anzahl der Abfragen wird durch das Datenschutzbudget für diese Richtlinie begrenzt.

  • Für die Kontoadministratorrolle gilt keine Datenschutzrichtlinie. Das bedeutet, dass für Abfragen, die in dieser Rolle ausgeführt werden, kein besonderer Datenschutz gilt. Wenn Sie keine Datenschutzrichtlinie angeben möchten, müssen Sie no_privacy_policy() zurückgeben, anstatt NULL zurückzugeben.

  • Die Rolle DP_TUTORIAL_ANALYST verwendet eine Datenschutzrichtlinie mit dem Namen „clinical_analysts“ mit Standardwerten für Datenschutzbudget, Budgetfenster und maximales Budget pro Aggregat.

  • Jeder andere Benutzer mit SELECT-Zugriff erhält ein Datenschutzbudget mit dem Namen „default“, ebenfalls mit Standardwerten für die Datenschutzrichtlinie. Wenn Sie verhindern wollen, dass andere Benutzer Abfragen auf dieser Tabelle ausführen, sollten Sie die SELECT-Berechtigungen für diese Tabelle einschränken. Richtlinien auf Tabellenebene erfordern eine ELSE-Klausel und können nicht NULL zurückgeben.

Zuweisen der Datenschutzrichtlinie

Als Nächstes weisen Sie der Tabelle die soeben erstellte Datenschutzrichtlinie zu, um sie mit differentieller Privatsphäre zu schützen.

-- Assign the privacy policy to the table.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
ADD PRIVACY POLICY policy_db.diff_priv_policies.patients_policy ENTITY KEY (patient_id);
Copy

Anmerkungen:

Die Klausel ENTITY KEY gibt eine Spalte an, die die Entität, die durch die differentielle Privatsphäre geschützt werden soll, eindeutig identifiziert. In diesem Tutorial, in dem es um eine einzige Tabelle geht, in der jede Entität in einer einzigen Zeile aufgeführt ist, ist die Definition des Entitätsschlüssels weniger wichtig. Wenn jedoch jeder Patient in mehreren Zeilen auftauchen könnte (z. B. wenn Patientenbesuche oder Patientenmedikationen erfasst werden), wäre die Definition des Schlüssels wichtig. Es ist immer noch eine gute Vorgehensweise, den Schlüssel hier zu definieren, für den Fall, dass später eine zweite solche Tabelle zur Datenbank hinzugefügt wird. Erfahren Sie mehr über Datenschutz auf Entitätsebene.

Definieren Sie einen Datenschutzbereich

Als Nächstes richten Sie Datenschutzbereiche für ausgewählte Spalten in der Tabelle ein.

Ein Datenschutzbereich teilt dem System den Wertebereich mit, der in den Ergebnissen für diese Spalte angezeigt werden kann. Das System verwendet diese Informationen auf zwei Arten:

  • Werte, die außerhalb dieses Bereichs liegen, werden ausgelassen oder an die Grenzen angehängt, je nachdem, ob es sich bei der Spalte um eine Zeichenfolge oder einen numerischen Wert / Datumswert handelt.

  • Das System verwendet diesen „gültigen Bereich“, um den Bereich der Ergebnisse zu bestimmen, um das auf jeden Messwert angewandte Rauschen zu ermitteln.

Ein Analyst kann einen Bereich weiter einschränken, z. B. durch die Verwendung einer WHERE-Klausel, um die Menge des Rauschens, das durch die differentielle Privatsphäre entsteht, zu reduzieren (je kleiner der Bereich, desto weniger Rauschen). Wenn Sie für eine Spalte keine Datenschutzdomäne festlegen, muss der Analyst eine Datenschutzdomäne mit einer WHERE-Klausel hinzufügen, um Werte für diese Spalte anzuzeigen (Spalten ohne Datenschutzdomäne können nicht angezeigt oder in der Abfrage verwendet werden).

Für die Diabetes-Umfragedaten werden Sie Datenschutzbereiche für drei Spalten festlegen: gender, age und income_code. Sie werden keine Datenschutzdomänen für boolesche Spalten festlegen (bei nur zwei möglichen Werten ist eine Datenschutzdomäne nicht sinnvoll und auch nicht erforderlich), und Sie sollten keine Datenschutzdomäne für die Spalte patient_id festlegen, da der Benutzer die Werte sehen kann, die Sie in der Datenschutzdomäne festgelegt haben und die ihm zeigen würden, welche Patienten-IDs in den Daten enthalten sind. Wenn Sie eine Datenschutzdomäne für eine begrenzte Anzahl von Zeichenkettenwerten angeben müssen, wie z. B. ZIP-Codes, sollten Sie die Domänendefinition mit zusätzlichen, nicht vorhandenen Werten auffüllen, um mögliche Werte zu verschleiern.

-- Define privacy domains.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey ALTER (
COLUMN gender SET PRIVACY DOMAIN IN ('female', 'male', 'other'),
COLUMN age SET PRIVACY DOMAIN BETWEEN (0, 90),
COLUMN income_code SET PRIVACY DOMAIN BETWEEN (1, 8)
);
Copy

Gewähren Sie dem Analysten Zugriff auf die Tabelle

Gewähren Sie den Zugriff auf die Tabelle erst, nachdem Sie den Daten Datenschutzrichtlinien zugewiesen haben. Andernfalls könnten die Benutzer die Daten sehen, bevor Sie Datenschutzrichtlinien anwenden.

GRANT USAGE ON DATABASE dp_db TO ROLE dp_tutorial_analyst;
GRANT USAGE ON SCHEMA dp_schema TO ROLE dp_tutorial_analyst;
GRANT SELECT
  ON TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
  TO ROLE dp_tutorial_analyst;
Copy

Führen Sie einige Abfragen aus

Endlich können Sie Abfragen auf Ihre Daten durchführen!

Sie werden zwischen den Rollen Admin und Analyst wechseln, um die Verhaltensweise und die Ausgabe für jede Rolle zu vergleichen.

Prüfen Sie, ob die differentielle Privatsphäre funktioniert

Verwenden Sie die Administratorrolle, um eine Abfrage auszuführen, die einzelne Zeilen zurückgibt. Diese Abfrage ist erfolgreich, da die Datenschutzrichtlinie für die ACCOUNTADMIN-Rolle zu no_privacy_policy() aufgelöst wird:

USE ROLE ACCOUNTADMIN;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Copy

Führen Sie nun dieselbe Abfrage mit der Analystenrolle aus. Die Abfrage schlägt fehl, weil die differentielle Privatsphäre keine SELECT *-Abfragen zulässt.

USE ROLE dp_tutorial_analyst;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Copy

Versuchen Sie es mit einer dritten Rolle, um sicherzustellen, dass das Standardergebnis dasselbe ist. (Vergessen Sie nicht, der Person oder Rolle SELECT-Zugriff auf die Tabelle zu gewähren!)

Sehen Sie, wie Rauschen aussieht

Führen Sie zunächst eine einfache Abfrage als Administrator aus, ohne differentielle Privatsphäre anzuwenden. Sie sehen dann die genauen Tabellenwerte.

-- Run a basic query without DP.
USE ROLE ACCOUNTADMIN;
SELECT COUNT(DISTINCT patient_id)
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

Führen Sie nun dieselbe Abfrage als Analyst aus, und Sie werden sehen, dass die Ergebnisse mit Rauschen versehen wurden. Beachten Sie, dass die Abfrage etwas länger dauert, weil differentielle Privatsphäre angewendet wird.

USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id)
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

Die Ergebnisse unterscheiden sich in der Regel von den Ergebnissen des Administrators, da die differentielle Privatsphäre Rauschen in die Ergebnisse eingebracht hat, um die persönliche Angaben im Datensatz zu verschleiern. Die Ergebnisse können jedoch manchmal identisch sein, da das zufällig erzeugte Rauschen in jeder Abfrage klein genug war, um auf 0 abzurunden. Aber der Analyst kann nicht wissen, ob auf eine bestimmte Abfrage Rauschen angewendet wird oder nicht. Sie können versuchen, diese Abfrage erneut auszuführen, um zu sehen, ob Sie ein anderes Ergebnis erhalten.

Analysieren Sie die Menge des Rauschens

Obwohl Analysten die Ergebnisse nicht ohne Rauschen sehen können, benötigen sie eine Möglichkeit, um zu verstehen, wie groß das Rauschen bei dem Ergebnis im Allgemeinen ist, um zu bestimmen, ob die Daten für ihre Bedürfnisse brauchbar sind. Um diese Informationen bereitzustellen, legen wir das Rauschintervall jedes Abfrageparameters für den Analysten offen. Das Rauschintervall wird mit den Funktionen DP_INTERVAL_LOW und DP_INTERVAL_HIGH abgerufen.

-- Retrieve noise interval for the previous query.
USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id) as c,
  DP_INTERVAL_LOW(c) as LOW,
  DP_INTERVAL_HIGH(c) as HIGH
  FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
  WHERE income_code = 5;
Copy

Es besteht eine Mindestwahrscheinlichkeit von 95 %, dass der wahre Wert der Aggregation zwischen LOW und HIGH liegt.

Beachten Sie, dass das Intervall für diese Abfrage bei diesen Daten im Vergleich zur Größe des Ergebnisses aufgrund des künstlich kleinen Datensatzes sehr groß ist. Dieses große Rauschintervall bedeutet im Wesentlichen, dass es hier zu wenige Patienten gibt, als dass Snowflake eine genaue Antwort geben könnte, ohne ihre Privatsphäre zu verletzen.

Sehen Sie Ihr Budget und die geschätzten verbleibenden Abfragen

Benutzer, die Abfragen auf mit differentieller Privatsphäre geschützte Tabellen ausführen, können ihr verbrauchtes Budget für differentielle Privatsphäre und eine Schätzung der Anzahl der verbleibenden Abfragen sehen, indem sie die Tabellenfunktion ESTIMATE_REMAINING_DP_AGGREGATES aufrufen. Übernehmen Sie die Rolle, für die Sie das Budget anzeigen möchten, und rufen Sie die Funktion wie hier gezeigt auf:

USE ROLE <role_name>;
SELECT * FROM TABLE(SNOWFLAKE.DATA_PRIVACY.ESTIMATE_REMAINING_DP_AGGREGATES(dp_db.dp_schema.dp_tutorial_diabetes_survey));
Copy

Bereinigen

Bereinigen Sie Ihre Ressourcen, damit Sie oder jemand anderes in Ihrer Organisation das Tutorial später noch einmal ausführen kann.

USE ROLE ACCOUNTADMIN;
DROP ROLE dp_tutorial_analyst;
DROP WAREHOUSE dp_tutorial_wh;
ALTER TABLE dp_tutorial_diabetes_survey
  DROP PRIVACY POLICY policy_db.diff_priv_policies.patients_policy;
DROP DATABASE dp_db;
DROP DATABASE policies_db;
Copy