Kategorien:

DDL für Tabellen, Ansichten und Sequenzen

CREATE MASKING POLICY

Erstellt eine neue Maskierungsrichtlinie im aktuellen/angegebenen Schema oder ersetzt eine bestehende Maskierungsrichtlinie.

Wenden Sie nach dem Erstellen einer Maskierungsrichtlinie diese mit dem Befehl ALTER TABLE … ALTER COLUMN auf eine Spalte in einer Tabelle oder mit dem Befehl ALTER VIEW auf eine Ansicht an.

Siehe auch:

Auswahl eines zentralen, hybriden oder dezentralen Ansatzes, Erweiterte Sicherheit auf Spaltenebene

ALTER MASKING POLICY, DROP MASKING POLICY, SHOW MASKING POLICIES, DESCRIBE MASKING POLICY

Unter diesem Thema:

Syntax

CREATE [ OR REPLACE ] MASKING POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name_to_mask> <arg_type_to_mask> [ , <arg_1> <arg_type_1> ... ] )
RETURNS <arg_type_to_mask> -> <expression_on_arg_name>
[ COMMENT = '<string_literal>' ];

Parameter

Name

Bezeichner für die Maskierungsrichtlinie. Dieser muss für Ihr Konto eindeutig sein.

Der Bezeichnerwert muss mit einem alphabetischen Zeichen beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B. "My object"). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.

AS ( Argumentname_für_Mask Argumenttyp_für_Mask [ , Argument_1 Argumenttyp_1 ... ] )

Die Signatur für die Maskierungsrichtlinie. Gibt die Eingabespalten und Datentypen an, die zur Abfragelaufzeit ausgewertet werden sollen.

Weitere Details dazu finden Sie unter Datentypen.

Argumentname_für_Mask Argumenttyp_für_Mask

Die erste Spalte und ihr Datentyp geben immer die Spaltendatentypwerte an, die in den nachfolgenden Richtlinienbedingungen maskiert oder tokenisiert werden sollen.

Beachten Sie, dass Sie eine virtuelle Spalte nicht als erstes Spaltenargument in einer bedingten Maskierungsrichtlinie angeben können.

[ , Argument_1 Argumenttyp_1 ... ]

Gibt die bedingten Spalten und deren Datentypen an, die ausgewertet werden sollen, um zu bestimmen, ob die Richtlinienbedingungen die Daten in der ersten Spalte jeder Zeile des Abfrageergebnisses maskieren oder tokenisieren sollen.

Wenn diese zusätzlichen Spalten und Datentypen nicht angegeben werden, wertet Snowflake die Richtlinie als normale Maskierungsrichtlinie aus.

RETURNS Argumenttyp_für_Mask

Der Rückgabedatentyp muss mit dem Eingabedatentyp der ersten Spalte übereinstimmen, die als Eingabespalte angegeben ist.

Ausdruck_auf_Argumentname

SQL-Ausdruck, der die Daten transformiert.

Der Ausdruck kann Funktionen für bedingte Ausdrücke enthalten, um bedingte Logik, integrierte Funktionen oder UDFs zur Datentransformation zu repräsentieren.

Wenn eine UDF oder externe Funktion innerhalb des Maskierungsrichtlinientextes verwendet wird, muss der Richtlinieneigentümer die USAGE-Berechtigung für die UDF oder die externe Funktion haben. Die USAGE-Berechtigung für die UDF- oder externe Funktion ist für die Rolle nicht erforderlich, die zur Abfrage einer Spalte verwendet wird, auf die eine Maskierungsrichtlinie angewendet wurde.

Wenn eine UDF oder externe Funktion innerhalb des bedingten Maskierungsrichtlinientextes verwendet wird, muss der Richtlinieneigentümer die OWNERSHIP-Berechtigung für die UDF oder die externe Funktion haben. Benutzer, die eine Spalte abfragen, auf die eine bedingte Maskierungsrichtlinie angewendet wird, benötigen keine USAGE-Berechtigung für die UDF oder die externe Funktion.

COMMENT = 'Zeichenfolgenliteral'

Fügt einen Kommentar hinzu oder überschreibt einen vorhandenen Kommentar zur Maskierungsrichtlinie.

Nutzungshinweise

  • Wenn Sie eine vorhandene Maskierungsrichtlinie ersetzen möchten und dazu die aktuelle Definition der Richtlinie anzeigen müssen, können Sie die Funktion GET_DDL aufrufen oder den Befehl DESCRIBE MASKING POLICY ausführen.

  • Verwenden Sie bei Maskierungsrichtlinien, die im Maskierungsrichtlinientext eine Unterabfrage enthalten, in der WHEN-Klausel ein EXISTS. Ein repräsentatives Beispiel ist im Beispiel für eine benutzerdefinierte Berechtigungstabelle im Abschnitt Normale Maskierungsrichtlinie zu finden.

  • Eine bestimmte Tabellen- oder Ansichtsspalte kann entweder in der Signatur einer Maskierungsrichtlinie oder in der Signatur einer Zeilenzugriffsrichtlinie angegeben werden. Oder anders ausgedrückt, dieselbe Spalte kann nicht gleichzeitig in einer Maskierungsrichtliniensignatur und in einer Zeilenzugriffsrichtliniensignatur angegeben werden.

    Weitere Informationen dazu finden Sie unter CREATE ROW ACCESS POLICY.

  • Ein Data Sharing-Anbieter kann keine Maskierungsrichtlinie in einem Leserkonto erstellen.

  • Wenn Sie eine UDF in einer Maskierungsrichtlinie verwenden, stellen Sie sicher, dass die Datentypen von UDF-Spalte und Maskierungsrichtlinie übereinstimmen. Weitere Informationen dazu finden Sie unter Benutzerdefinierte Funktionen in einer Maskierungsrichtlinie.

  • Metadaten:

    Achtung

    Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.

Beispiele

Normale Maskierungsrichtlinie

Sie können zum Schreiben des SQL-Ausdrucks Funktionen für bedingte Ausdrücke, Kontextfunktionen und UDFs verwenden.

Im Folgenden finden Sie repräsentative Beispiele für die Erstellung von Maskierungsrichtlinien unter Verwendung verschiedener SQL-Ausdrücke, Funktionen und Datentypen.

Vollmaske:

Die Rolle ANALYST kann den Klartextwert anzeigen. Benutzern ohne ANALYST-Rolle wird eine vollständige Maske angezeigt.

CREATE OR REPLACE MASKING POLICY email_mask AS (val string) returns string ->
  CASE
    WHEN current_role() IN ('ANALYST') THEN VAL
    ELSE '*********'
  END;

Erlauben Sie einem Produktions konto, nicht maskierte Werte anzuzeigen, und allen anderen Konten (z. B. Entwicklung, Test), maskierte Werte anzuzeigen.

case
  when current_account() in ('<prod_account_identifier>') then val
  else '*********'
end;

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: Die Verwendung einer Hashing-Funktion in einer Maskierungsrichtlinie kann zu Kollisionen führen. Gehen Sie daher mit diesem Ansatz vorsichtig um. Weitere Informationen dazu finden Sie unter Erweiterte Sicherheit auf Spaltenebene.

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 von Zeitstempeln.

case
  WHEN current_role() in ('SUPPORT') THEN val
  else date_from_parts(0001, 01, 01)::timestamp_ntz -- returns 0001-01-01 00:00:00.000
end;

Wichtig

Gegenwärtig unterstützt Snowflake keine unterschiedlichen Ein- und Ausgabedatentypen in einer Maskierungsrichtlinie, wie z. B. beim Definieren der Maskierungsrichtlinie, um einen Zeitstempel anzusteuern und eine Zeichenfolge (z. B. ***MASKED***) zurückzugeben. Die Ein- und Ausgabedatentypen müssen übereinstimmen.

Eine Abhilfe besteht darin, den tatsächlichen Zeitstempelwert mithilfe eines generierten Zeitstempelwerts umzuwandeln. Weitere Informationen dazu finden Sie unter DATE_FROM_PARTS und CAST, ::.

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 beim Einfügen einer Unterabfrage in den Maskierungsrichtlinientext immer EXISTS. Weitere Informationen zu Unterabfragen, die Snowflake unterstützt, finden Sie unter Verwenden von Unterabfragen.

CASE
  WHEN EXISTS
    (SELECT role FROM <db>.<schema>.entitlement WHERE mask_method='unmask' AND role = current_role()) 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 eine JavaScript-UDF die Standortdaten in einer JSON-Zeichenfolge. Es ist wichtig, den Datentyp in der UDF und in der Maskierungsrichtlinie als VARIANT festzulegen. Wenn der Datentyp in Tabellenspalte, UDF und Signatur der Maskierungsrichtlinie nicht übereinstimmen, gibt Snowflake eine Fehlermeldung zurück, da der SQL-Code nicht aufgelöst werden kann.

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

Verwendung des Datentyps GEOGRAPHY:

In diesem Beispiel verwendet eine Maskierungsrichtlinie die Funktion TO_GEOGRAPHY, um für Benutzer, deren CURRENT_ROLE nicht ANALYST ist, alle GEOGRAPHY-Daten einer Spalte in einen festen Punkt zu konvertieren: den Längen- und Breitengrad für Snowflake in San Mateo, Kalifornien, USA.

create masking policy mask_geo_point as (val geography) returns geography ->
  case
    when current_role() IN ('ANALYST') then val
    else to_geography('POINT(-122.35 37.55)')
  end;

Legen Sie die Maskierungsrichtlinie für eine Spalte mit dem Datentyp GEOGRAPHY fest, und setzen Sie den Wert GEOGRAPHY_OUTPUT_FORMAT für die Sitzung auf GeoJSON:

alter table mydb.myschema.geography modify column b set masking policy mask_geo_point;
alter session set geography_output_format = 'GeoJSON';
use role public;
select * from mydb.myschema.geography;

Snowflake gibt Folgendes zurück:

---+--------------------+
 A |         B          |
---+--------------------+
 1 | {                  |
   |   "coordinates": [ |
   |     -122.35,       |
   |     37.55          |
   |   ],               |
   |   "type": "Point"  |
   | }                  |
 2 | {                  |
   |   "coordinates": [ |
   |     -122.35,       |
   |     37.55          |
   |   ],               |
   |   "type": "Point"  |
   | }                  |
---+--------------------+

Die Werte der Abfrageergebnisse in Spalte B hängen vom Wert des Parameters GEOGRAPHY_OUTPUT_FORMAT der Sitzung ab. Wenn der Parameterwert beispielsweise auf WKT gesetzt ist, gibt Snowflake Folgendes zurück:

alter session set geography_output_format = 'WKT';
select * from mydb.myschema.geography;

---+----------------------+
 A |         B            |
---+----------------------+
 1 | POINT(-122.35 37.55) |
 2 | POINT(-122.35 37.55) |
---+----------------------+

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

Bedingte Maskierungsrichtlinie

Das folgende Beispiel gibt nicht maskierte Daten für Benutzer zurück, deren CURRENT_ROLE die benutzerdefinierte Rolle ADMIN ist oder deren Wert in der Sichtbarkeitsspalte Public ist. Alle anderen Bedingungen führen zu einem festen maskierten Wert.

-- Conditional Masking

create masking policy email_visibility as
(email varchar, visibility string) returns varchar ->
  case
    when current_role() = 'ADMIN' then email
    when visibility = 'Public' then email
    else '***MASKED***'
  end;

Das folgende Beispiel gibt detokenisierte Daten für Benutzer zurück, deren CURRENT_ROLE die benutzerdefinierte Rolle ADMIN ist und deren Wert in einer anderen Spalte Public ist. Alle anderen Bedingungen führen zu einem tokenisierten Wert.

-- Conditional Tokenization

create masking policy de_email_visibility as
 (email varchar, visibility string) returns varchar ->
   case
     when current_role() = 'ADMIN' and visibility = 'Public' then de_email(email)
     else email -- sees tokenized data
   end;