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

DDL für Maskierungsrichtlinien

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> -> <body>
[ COMMENT = '<string_literal>' ]
[ EXEMPT_OTHER_POLICIES = { TRUE | FALSE } ]
Copy

Erforderliche 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 ( arg_name_to_mask arg_type_to_mask [ , arg_1 arg_type_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 Referenz der SQL-Datentypen.

arg_name_to_mask arg_type_to_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.

[ , arg_1 arg_type_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 arg_type_to_mask

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

body

SQL-Ausdruck, der die Daten in der mit arg_name_to_mask angegebenen Spalte transformiert.

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

UDFs und externe Funktionen:

  • Der Eigentümer der Richtlinien, die Rolle mit der OWNERSHIP-Berechtigung für die Richtlinie, muss die USAGE-Berechtigung für die UDF oder 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 der beiden Funktionen innerhalb des Textes der bedingten Maskierungsrichtlinie 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 externe Funktion.

Kontextfunktionen im body der Richtlinie:

Wenn die Richtlinie die Funktion CURRENT_DATABASE oder CURRENT_SCHEMA aufruft, ergibt die Funktion die Datenbank oder das Schema, in der/dem die geschützte Tabelle oder Ansicht enthalten ist, und nicht die Datenbank oder das Schema für die Sitzung, die Sie mit einem USE <Objekt>-Befehl angeben oder mit der Kontextauswahl in Snowsight auswählen.

Optionale Parameter

COMMENT = 'string_literal'

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

EXEMPT_OTHER_POLICIES = TRUE | FALSE

Je nach Nutzung eine der folgenden Optionen:

  • Gibt an, ob eine Zeilenzugriffsrichtlinie oder eine bedingte Maskierungsrichtlinie auf eine Spalte verweisen kann, die bereits durch diese Maskierungsrichtlinie geschützt ist.

  • Gibt an, ob eine einer virtuellen Spalte zugewiesene Maskierungsrichtlinie die Maskierungsrichtlinie überschreibt, die die virtuelle Spalte von der VALUE-Spalte erbt. Wenn Sie externe Tabellen verwenden, geben Sie diese Eigenschaft in der Maskierungsrichtlinie an, die die VALUE-Spalte schützt.

TRUE

Erlaubt einer anderen Richtlinie, auf die maskierte Spalte zu verweisen, oder erlaubt, dass die Maskierungsrichtlinie, die für eine virtuelle Spalte festgelegt wurde, die Maskierungsrichtlinie überschreibt, die die virtuelle Spalte von der VALUE-Spalte einer externen Tabelle erbt.

FALSE

Erlaubt nicht, dass eine andere Richtlinie auf die maskierte Spalte verweist, oder erlaubt nicht, dass die Maskierungsrichtlinie, die für eine virtuelle Spalte festgelegt wurde, die Maskierungsrichtlinie überschreibt, die die virtuelle Spalte von der VALUE-Spalte einer externen Tabelle erbt.

Beachten Sie Folgendes:

  • Der Wert dieser Eigenschaft in der Maskierungsrichtlinie kann nicht geändert werden, nachdem die Maskierungsrichtlinie für eine Tabelle oder Ansicht festgelegt wurde. Wenn Sie den Wert dieser Eigenschaftseinstellung aktualisieren möchten, führen Sie eine CREATE OR REPLACE MASKING POLICY-Anweisung für die Maskierungsrichtlinie aus.

  • Wenn die Eigenschaft auf „true“ gesetzt ist, wird sie in die Ausgabe des Aufrufs der GET_DDL-Funktion auf der Richtlinie aufgenommen.

Anforderungen an die Zugriffssteuerung

Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:

Berechtigung

Objekt

Anmerkungen

CREATE MASKING POLICY

Schema

Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.

Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.

Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.

Wenn Sie die EXEMPT_OTHER_POLICIES-Eigenschaft in einer Maskierungsrichtlinie angeben, muss die Rolle, die Eigentümer der Maskierungsrichtlinie ist (d. h. die Rolle mit der OWNERSHIP-Berechtigung für die Richtlinie), in der Rollenhierarchie der Rolle enthalten sein, die Eigentümer der Zeilenzugriffsrichtlinie bzw. der bedingten Maskierungsrichtlinie ist.

So können beispielsweise die kundenspezifischen Rollen des Richtlinienadministrators wie folgt eine Rollenhierarchie bilden:

masking_admin » rap_admin » SYSADMIN

masking_admin » cond_masking_admin » SYSADMIN

Wobei:

masking_admin

Gibt die kundenspezifische Rolle an, die Eigentümer der Maskierungsrichtlinie ist, die für die Spalte festgelegt ist, die in der Signatur einer Zeilenzugriffsrichtlinie bzw. einer bedingten Maskierungsrichtlinie angegeben wird.

rap_admin

Gibt die kundenspezifische Rolle an, die Eigentümer der Zeilenzugriffsrichtlinie ist.

cond_masking_admin

Gibt die kundenspezifische Rolle an, die Eigentümer der bedingten Maskierungsrichtlinie ist.

Weitere Informationen zur DDL und zu Berechtigungen von Maskierungsrichtlinien finden Sie unter Verwalten der Sicherheit auf Spaltenebene.

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, im WHEN-Zweig der CASE-Funktion ein EXISTS. Ein repräsentatives Beispiel für eine kundenspezifische Berechtigungstabelle ist im Abschnitt Normale Maskierungsrichtlinie (unter diesem Thema) 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.

  • CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.

Beispiel: Normale Maskierungsrichtlinie

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

Im Folgenden werden repräsentative Beispiele für den Richtlinientext aufgeführt, um zu zeigen, wie Maskierungsrichtlinienbedingungen mit verschiedenen SQL-Ausdrücken, Funktionen und Datentypen erstellt werden können.

In diesen Beispielen wird meist die Kontextfunktion CURRENT_ROLE verwendet. Wenn Rollenaktivierung und Rollenhierarchie in den Richtlinienbedingungen erforderlich sind, verwenden Sie IS_ROLE_IN_SESSION.

Vollmaske:

Die kundenspezifische Rolle analyst kann den Wert in Klartext anzeigen. Benutzern, denen die kundenspezifische Rolle analyst nicht zugewiesen ist, 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;
Copy

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

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

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

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

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

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

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

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

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

Auf Variant-Daten:

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

Verwenden einer kundenspezifischen 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;
Copy

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

Verwenden einer <JavaScript UDF auf JSON (VARIANT):

In diesem Beispiel maskiert eine JavaScript-UDF die in einer JSON-Zeichenfolge enthaltenen Standortdaten. 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;
Copy

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

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

Snowflake gibt Folgendes zurück:

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

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

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

Beispiel: Bedingte Maskierungsrichtlinie

Das folgende Beispiel gibt nicht maskierte Daten für Benutzer zurück, deren CURRENT_ROLE die kundenspezifische 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;
Copy

Das folgende Beispiel gibt detokenisierte Daten für Benutzer zurück, deren CURRENT_ROLE die kundenspezifische 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;
Copy

Beispiel: Zulassen einer maskierten Spalte in einer Zeilenzugriffsrichtlinie oder einer bedingten Maskierungsrichtlinie

Ersetzen Sie eine Maskierungsrichtlinie, die entweder das Anzeigen der E-Mail-Adresse, das Anzeigen nur der E-Mail-Adressdomäne oder das Anzeigen eines festen maskierten Werts zulässt:

create or replace masking policy governance.policies.email_mask
as (val string) returns string ->
case
  when current_role() in ('ANALYST') then val
  when current_role() in ('SUPPORT') then regexp_replace(val,'.+\@','*****@')
  else '********'
end
comment = 'specify in row access policy'
exempt_other_policies = true
;
Copy

Diese Richtlinie kann nun für eine Spalte festgelegt werden, und eine Zeilenzugriffsrichtlinie oder eine bedingte Maskierungsrichtlinie kann bei Bedarf auf die durch diese Maskierungsrichtlinie geschützte Spalte verweisen.