Kategorien:

DDL für Tabellen, Ansichten und Sequenzen

CREATE MASKING POLICY

Erstellt eine neue Maskierungsrichtlinie für Sicherheit auf Spaltenebene. Eine Maskierungsrichtlinie ist ein Objekt auf Schemaebene, das mehrere Regeln und eine Standardfunktion haben kann, bei der basierend auf dem ausführenden Kontext (z. B. Rolle) eine Regel angewendet werden kann.

Snowflake wertet die Maskierungsrichtlinie als SQL-Ausdruck aus. Daher werden Regeln in der Reihenfolge ausgewertet, in der sie geschrieben wurden, wenn sie im Maskierungsrichtlinientext als WHEN-THEN-Klauseln eines CASE-Ausdrucks angegeben sind.

Der Maskierungsrichtlinientext ist ein SQL-Ausdruck, der die Regeln angibt. Zur Laufzeit schreibt Snowflake die Abfrage neu, um den Maskierungsrichtlinienausdruck auf die Spalte anzuwenden.

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

Siehe auch:

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

Syntax

CREATE [ OR REPLACE ] MASKING POLICY <name> AS
(VAL <data_type>) RETURNS <data_type> -> <expression_ON_VAL>
[ 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 ( VAL Datentyp )

Definiert den zu maskierenden Datentyp. Weitere Details dazu finden Sie unter Datentypen.

RETURNS Datentyp

Definiert den zurückzugebenden Datentyp. Weitere Details dazu finden Sie unter Datentypen.

Ausdruck_ON_VAL

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 darzustellen.

Wenn eine UDF oder externe Funktion innerhalb des Maskierungsrichtlinientextes verwendet wird, muss der Richtlinienbesitzer die OWNERSHIP-Berechtigung für die UDF oder die externe Funktion haben. Benutzer, die eine Spalte abfragen, auf die eine Maskierungsrichtlinie angewendet wurde, müssen keine USAGE-Berechtigung für die UDF oder die externe Funktion haben.

COMMENT = 'Zeichenfolgenliteral'

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

Nutzungshinweise

  • 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 Beispiele zu finden.

Beispiele

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

Im Folgenden werden typische Beispiele gezeigt, wie Maskierungsrichtlinien mit einer vollständigen Maske, einem Hash, einem regulären Ausdruck und einer UDF erstellt werden.

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;

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.