Verwenden der dynamischen Datenmaskierung

Unter diesem Thema wird eine Anleitung zum Konfigurieren und Verwenden der dynamischen Datenmaskierung in Snowflake bereitgestellt.

Verwenden der dynamischen Datenmaskierung

Im Folgenden sind die allgemeinen Schritte zum Konfigurieren und Verwenden der dynamischen Datenmaskierung in Snowflake aufgeführt:

  1. Erteilen Sie einer benutzerdefinierten Rolle für einen Sicherheits- oder Datenschutzbeauftragten Berechtigungen zur Verwaltung von Maskierungsrichtlinien.

  2. Der Sicherheits- oder Datenschutzbeauftragte erstellt und definiert Maskierungsrichtlinien und wendet diese auf Spalten mit vertraulichen Daten an.

  3. Führen Sie Abfragen in Snowflake aus. Beachten Sie Folgendes:

    • Snowflake schreibt die Abfrage dynamisch neu, indem der SQL-Ausdruck der Maskierungsrichtlinie auf die Spalte angewendet wird.

    • Das Umschreiben der Spalte erfolgt an jeder Stelle, an der die in der Maskierungsrichtlinie angegebene Spalte in der Abfrage angezeigt wird (z. B. Projektionen, JOIN-Prädikat, WHERE-Klausel-Prädikat, ORDER BY und GROUP BY).

    • Benutzern werden maskierte Daten basierend auf den in den Maskierungsrichtlinien definierten Ausführungskontextbedingungen angezeigt. Weitere Informationen zum Ausführungskontext in Richtlinien zur dynamischen Datenmaskierung finden Sie unter Erweiterte Sicherheit auf Spaltenebene.

Schritt 1: Benutzerdefinierter Rolle Maskierungsrichtlinienberechtigungen erteilen

Ein Sicherheits- oder Datenschutzbeauftragter sollte als Administrator der Maskierungsrichtlinie (d. h. benutzerdefinierte Rolle: MASKING_ADMIN) fungieren und über Berechtigungen zum Definieren, Verwalten und Anwenden von Maskierungsrichtlinien auf Spalten verfügen.

Snowflake stellt die folgenden Berechtigungen zur Verfügung, die einem Sicherheits- oder Datenschutzbeauftragten für Sicherheitsrichtlinien auf Spaltenebene erteilt werden können:

Berechtigung

Beschreibung

CREATE MASKING POLICY

Diese Berechtigung auf Schemaebene steuert, wer Maskierungsrichtlinien erstellen kann.

APPLY MASKING POLICY

Diese Berechtigung auf Kontoebene steuert, wer Maskierungsrichtlinien für Spalten festlegen/aufheben kann. Sie wird standardmäßig der Rolle ACCOUNTADMIN erteilt. . Diese Berechtigung ermöglicht nur das Anwenden einer Maskierungsrichtlinie auf eine Spalte und bietet keine der zusätzlichen Tabellenberechtigungen, die in Zugriffssteuerungsrechte beschrieben sind.

APPLY ON MASKING POLICY

Optional. Diese Berechtigung auf Richtlinienebene kann von einem Richtlinieneigentümer verwendet werden, um die Operationen zum Festlegen/Aufheben einer bestimmten Maskierungsrichtlinie für bestimmte Spalten an die Objekteigentümer (d. h. der Rolle mit der OWNERSHIP-Berechtigung für das Objekt) zu übergeben. . Snowflake unterstützt die besitzverwaltete Zugriffssteuerung, bei der Objekteigentümer auch als Dateneigentümer gelten. . Wenn der Richtlinienadministrator den Objekteigentümern hinsichtlich der Dateneigentümerschaft für geschützte Spalten vertraut, kann der Richtlinienadministrator diese Berechtigung verwenden, um die Operationen zum Festlegen/Aufheben von Richtlinien zu dezentralisieren.

Im folgenden Beispiel wird die Rolle MASKING_ADMIN erstellt, und dieser Rolle werden Maskierungsrichtlinienberechtigungen erteilt.

-- create a masking policy administrator custom role

CREATE ROLE masking_admin;

-- grant privileges to masking_admin role.

GRANT CREATE MASKING POLICY on SCHEMA <schema_name> to ROLE masking_admin;

GRANT APPLY MASKING POLICY on ACCOUNT to ROLE masking_admin;

-- allow table_owner role to set or unset the ssn_mask masking policy (optional)

GRANT APPLY ON MASKING POLICY ssn_mask to ROLE table_owner;

Wobei:

  • Schemaname

    Gibt den Bezeichner des Schemas an, dem die Berechtigung erteilt werden soll.

Weitere Informationen dazu finden Sie unter:

Schritt 2: Maskierungsrichtlinie erstell und auf eine Spalte anwenden

Erstellen Sie mit der Rolle MASKING_ADMIN eine Maskierungsrichtlinie, und wenden Sie diese auf eine Spalte an.

In diesem typischen Beispiel wird Benutzern mit der Rolle ANALYST der nicht maskierte Wert angezeigt. Benutzern ohne ANALYST-Rolle wird eine vollständige Maske angezeigt.

-- create masking policy

create or replace masking policy email_mask as (val string) returns string ->
  case
    when current_role() in ('ANALYST') then val
    else '*********'
  end;

Schritt 3: Maskierungsrichtlinie auf Tabellen- oder Ansichtsspalte anwenden

Führen Sie die folgenden Anweisungen aus, um die Richtlinie auf eine Tabellenspalte oder eine Ansichtsspalte anzuwenden.

-- apply masking policy to a table column

alter table if exists user_info modify column email set masking policy email_mask;

-- apply the masking policy to a view column

alter view user_info_v modify column email set masking policy email_mask;

Schritt 4: Daten in Snowflake abfragen

Führen Sie in Snowflake zwei verschiedene Abfragen aus, eine Abfrage mit der Rolle ANALYST und eine andere Abfrage mit einer anderen Rolle, um zu überprüfen, ob Benutzern ohne ANALYST-Rolle eine vollständige Maske angezeigt wird.

-- using the ANALYST role

use role ANALYST;
select email from user_info; -- should see plain text value

-- using the PUBLIC role

use role public;
select email from user_info; -- should see full data mask

Weitere Beispiele für Maskierungsrichtlinien

Im Folgenden finden Sie weitere typische Beispiele, die im Richtlinientext zur dynamischen Datenmaskierung verwendet werden können.

Rückgabe von NULL für nicht autorisierte Benutzer:

case
  when current_role() IN ('ANALYST') then val
  else NULL
end;

Rückgabe eines statischen maskierten Werts für nicht autorisierte Benutzer:

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE '********'
END;

Rückgabe eines Hashwerts mit SHA2 , SHA2_HEX für nicht autorisierte Benutzer:

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE sha2(val) -- return hash of the column value
END;

Anwenden einer Teil- oder Vollmaske:

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  WHEN current_role() IN ('SUPPORT') THEN regexp_replace(val,'.+\@','*****@') -- leave email domain unmasked
  ELSE '********'
END;

Verwenden einer UDF:

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE mask_udf(val) -- custom masking function
END;

Auf Variant-Daten:

CASE
   WHEN current_role() IN ('ANALYST') THEN val
   ELSE OBJECT_INSERT(val, 'USER_IPADDRESS', '****', true)
END;

Verwenden einer benutzerdefinierten Berechtigungstabelle. Beachten Sie die Verwendung von EXISTS in der WHEN-Klausel. Verwenden Sie bei Einfügen einer Unterabfrage in den Maskierungsrichtlinientext immer EXISTS.

CASE
  WHEN current_role() EXISTS
    (SELECT role from <db>.<schema>.entitlement where mask_method='unmask') THEN val
  ELSE '********'
END;

Verwenden von DECRYPT auf zuvor mit ENCRYPT oder ENCRYPT_RAW verschlüsselte Daten unter Verwendung einer Passphrase für die verschlüsselten Daten:

case
  when current_role() in ('ANALYST') then DECRYPT(val, $passphrase)
  else val -- shows encrypted value
end;

Verwenden von JavaScript UDFs auf JSON (Variant):

In diesem Beispiel maskiert ein JavaScript-UDF die Standortdaten in einer JSON-Zeichenfolge. Es ist wichtig, den Datentyp in der UDF und in der Maskierungsrichtlinie als VARIANT festzulegen.

-- Flatten the JSON data

create or replace table <table_name> (v variant) as
select value::variant
from @<table_name>,
  table(flatten(input => parse_json($1):stationLocation));

-- JavaScript UDF to mask latitude, longitude, and location data

CREATE OR REPLACE FUNCTION full_location_masking(v variant)
  RETURNS variant
  LANGUAGE JAVASCRIPT
  AS
  $$
    if ("latitude" in V) {
      V["latitude"] = "**latitudeMask**";
    }
    if ("longitude" in V) {
      V["longitude"] = "**longitudeMask**";
    }
    if ("location" in V) {
      V["location"] = "**locationMask**";
    }

    return V;
  $$;

  -- Grant UDF usage to ACCOUNTADMIN

  grant ownership on function FULL_LOCATION_MASKING(variant) to role accountadmin;

  -- Create a masking policy using JavaScript UDF

  create or replace masking policy json_location_mask as (val variant) returns variant ->
    CASE
      WHEN current_role() IN ('ANALYST') THEN val
      else full_location_masking(val)
      -- else object_insert(val, 'latitude', '**locationMask**', true) -- limited to one value at a time
    END;

Beispiele für die Verwendung anderer Kontextfunktionen und Rollenhierarchien finden Sie unter Erweiterte Sicherheit auf Spaltenebene.

Nächste Themen: