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
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 } ]
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.
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 externe Funktion.
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.
Wenn der
body
der Richtlinie ein Lookup auf einer Zuordnungstabelle enthält, erstellen Sie eine zentralisierte Zuordnungstabelle, und speichern Sie die Zuordnungstabelle in derselben Datenbank wie die geschützte Tabelle. Dies ist besonders wichtig, wennbody
die Funktion IS_DATABASE_ROLE_IN_SESSION aufruft. Weitere Informationen dazu finden Sie in den Nutzungshinweisen.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 Rolleanalyst
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;
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 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;
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 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;
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.
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;
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;
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 ;
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.