Freigeben von Daten, die durch eine Richtlinie geschützt sind

Mit dieser Vorschau können Datenfreigabe-Verbraucher eine Datenbankrolle einer freigegebene Datenbank verwenden, um auf freigegebene Daten zuzugreifen, die durch eine Maskierungsrichtlinie oder eine Zeilenzugriffsrichtlinie geschützt sind.

Übersicht

Ein Datenfreigabe-Anbieter kann die Kontextfunktion IS_DATABASE_ROLE_IN_SESSION in den Bedingungen einer Maskierungsrichtlinie oder einer Zeilenzugriffsrichtlinie verwenden, um einem Datenfreigabe-Verbraucher den Zugriff auf freigegebene Daten zu ermöglichen, die durch eine solche Richtlinie geschützt sind. Dadurch stehen dem Anbieter mehr Optionen für die Freigabe von Daten zur Verfügung, während dem Verbraucher Zugriff auf sensible Daten gewährt werden kann, die der Anbieter zur Verfügung stellt.

Der Anbieter kann wählen, ob die Richtlinie und die freigegebenen Objekte in einer einzigen Datenbank oder in verschiedenen Datenbanken gruppiert werden sollen. Wenn sich die Richtlinien und die geschützten Tabellen in verschiedenen Datenbanken befinden, muss der Anbieter Folgendes tun:

  • Geben Sie beide Datenbanken für das Verbraucherkonto frei.

  • Erstellen Sie die Datenbankrolle in derselben Datenbank wie die Richtlinie.

  • Weisen Sie die Datenbankrolle der Freigabe zu, die die Richtlinie enthält.

Wenn der Verbraucher eine Datenbank aus der Freigabe erstellt, werden die Datenbankrollen in der Freigabe der Rolle zugewiesen, die die Datenbank aus der Freigabe erstellt. Dadurch kann die Kontorolle im Verbraucherkonto die Richtlinienbedingungen erfüllen, die die Datenbankrolle spezifizieren, und auf die freigegebenen Daten zugreifen.

Um auf die durch die Richtlinie geschützten freigegebenen Daten zuzugreifen, muss der Verbraucher die Datenbank angeben, die die Datenbankrolle der freigegebenen Datenbank enthält, damit die Datenbankrolle der freigegebenen Datenbank in der aktuellen Sitzung aktiviert wird. In diesem Kontext bedeutet das Aktivieren der Datenbankrolle, dass die Datenbankrolle in der Rollenhierarchie der aktuellen Rolle für den Benutzer verfügbar ist. Wenn Sie diese freigegebene Datenbank nicht angeben, können die Benutzer des Verbraucherkontos nicht auf freigegebene Daten zugreifen, die durch eine Richtlinie geschützt sind. Sie können diese Datenbank mit einer der beiden folgenden Optionen angeben:

  • Aktivieren Sie die Datenbank in der Sitzung mit dem Befehl USE <Objekt>, oder wählen Sie die Datenbank im Arbeitsblatt aus. Beispiel:

    USE DATABASE mounted_db;
    
    Copy

    Beachten Sie, dass mounted_db der Name der Datenbank ist, die der Verbraucher aus der Freigabe erstellt.

  • Für eine bestimmte Abfrage verwenden Sie den vollqualifizierten Namen des Objekts, das sich in derselben Datenbank wie die Datenbankrolle befindet. Beispiel:

    SELECT * FROM mounted_db.myschema.mytable;
    
    Copy

Funktion aufrufen

Es gibt zwei verschiedene Möglichkeiten, Argumente in der Kontextfunktion IS_DATABASE_ROLE_IN_SESSION anzugeben: als Zeichenfolgenliteral oder als Nichtliteral (d. h. Spaltenname).

  • Wenn Sie eine Datenbankrolle als Zeichenfolge in der Kontextfunktion IS_DATABASE_ROLE_IN_SESSION angeben, hängt das Ergebnis des Funktionsaufrufs davon ab, wie die Funktion aufgerufen wird. Beispiel:

    • Bei einem Arbeitsblatt prüft Snowflake die Datenbank, die für die Sitzung verwendet wird, oder die Datenbank, die in der Abfrage angegeben ist. Dies gilt sowohl für das Anbieterkonto als auch für das Verbraucherkonto.

    • Bei einer Richtlinie, UDF oder Ansicht prüft Snowflake die Datenbank, in der die Richtlinie definiert ist, wenn die Richtlinie freigegeben ist. Wenn die Richtlinie nicht freigegeben ist, gibt Snowflake einen Fehler zurück, wenn die Suche nach der Datenbankrolle ergibt, dass die Datenbankrolle in einer anderen Datenbank definiert ist.

      A Role Context Function cannot reference a DB Role in another database.
      
      Copy
  • Wenn Sie einen Spaltennamen als Argument in der Kontextfunktion IS_DATABASE_ROLE_IN_SESSION angeben, gilt Folgendes:

    • Wenn die Funktion von einer Tabellenabfrage aufgerufen wird, wird die Spalte dem Tabellenbezeichner der Tabelle zugeordnet, die die Spalte enthält. Snowflake prüft dann die Datenbankrollen in der Datenbank, die die Tabelle enthält. So geben Sie beispielsweise die Spalte AUTHZ_ROLE (d. h. die autorisierte Rolle) als Argument an:

      SELECT * FROM mydb.myschema.t WHERE IS_DATABASE_ROLE_IN_SESSION(AUTHZ_ROLE);
      
      Copy
    • Wenn die Funktion von einer Maskierungsrichtlinie, einer Zeilenzugriffsrichtlinie oder einer UDF aufgerufen wird, erfolgt die Suche in der Datenbank, die die Richtlinie oder die UDF enthält.

Allgemeiner Workflow

Die Freigabe von richtliniengeschützten Daten mit der Funktion IS_DATABASE_ROLE_IN_SESSION in der Richtlinie erfordert die gleichen Schritte wie beim Erstellen einer Richtlinie zum Aufrufen der Funktion und zur Freigabe von Daten. Zusammengefasst:

  1. Der Anbieter erstellt eine Kontorolle.

  2. Der Anbieter erstellt eine Richtlinie und legt die Richtlinie für eine Tabelle oder Spalte fest.

  3. Der Anbieter testet die Richtlinie mit der Kontorolle.

  4. Der Anbieter erstellt eine Datenbankrolle und testet die Richtlinie mit der Datenbankrolle.

  5. Der Anbieter erstellt eine Freigabe und erteilt der Freigabe Berechtigungen, einschließlich Zuweisung der Datenbankrolle zur Freigabe.

  6. Der Verbraucher erstellt eine Datenbank aus der Freigabe (d. h. die eingebundene Datenbank).

  7. Der Verbraucher fragt das freigegebene Objekt ab, das durch die Richtlinie geschützt ist.

Beispiel: Alle Objekte in derselben Datenbank

In diesem Beispiel befinden sich die Datenbankrollen, die Maskierungsrichtlinie und die geschützte Tabelle alle in derselben Datenbank namens mydb.

In diesem Beispiel:

  • Die Datenbankrollen sind mydb.analyst und mydb.support.

  • Die Maskierungsrichtlinie ist wie folgt definiert:

    CREATE OR REPLACE MASKING POLICY mydb.policies.email_mask
      AS (val string) RETURNS string ->
      CASE
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.ANALYST')
          THEN val
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.SUPPORT')
          THEN REGEXP_REPLACE(val,'.+\@','*****@')
        ELSE '********'
      END
      COMMENT = 'use database role for shared data'
      ;
    
    Copy
  • Die Spalte EMAIL befindet sich in einer Tabelle mit dem Namen mydb.tables.empl_info, und die Maskierungsrichtlinie ist auf diese Spalte gesetzt.

Führen Sie die folgenden Schritte aus, um die Datenbank mydb freizugeben und dem Verbraucher zu erlauben, die Datenbankrolle der freigegebenen Datenbank zu verwenden, um die freigegebenen Daten abzufragen, die durch die freigegebene Maskierungsrichtlinie geschützt sind. Bei diesen Schritten wird davon ausgegangen, dass der Anbieter die Maskierungsrichtlinie für die Spalte EMAIL bereits mit seinen Kontorollen und Datenbankrollen getestet hat.

  1. Führen Sie im Anbieterkonto den Befehl CREATE SHARE aus, um eine Freigabe für die Datenbankrolle mydb.analyst_share zu erstellen:

    USE ROLE r1;
    CREATE SHARE analyst_share;
    
    Copy
  2. Weisen Sie der Freigabe Berechtigungen zu. Für jede Freigabe sind dieselben Berechtigungen erforderlich:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.policies TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.tables TO SHARE analyst_share;
    GRANT SELECT ON TABLE mydb.tables.empl_info TO SHARE analyst_share;
    GRANT DATABASE ROLE mydb.analyst TO SHARE analyst_share;
    
    Copy
  3. Fügen Sie der Freigabe das Verbraucherkonto hinzu:

    ALTER SHARE analyst_share ADD ACCOUNTS = consumer_account;
    
    Copy
  4. Erstellen Sie im Verbraucherkonto die Kontorolle r1, und erteilen Sie dieser Rolle die Berechtigungen zum Importieren der Freigabe:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  5. Importieren Sie die Freigabe:

    USE ROLE r1;
    CREATE DATABASE mounted_db FROM SHARE provider_account.analyst_share;
    
    Copy
  6. Überprüfen Sie, ob die Datenbankrolle in der Sitzung aktiv ist:

    USE DATABASE mounted_db;
    USE SCHEMA mounted_db.tables;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db.analyst');
    
    Copy

    Die SELECT-Anweisung sollte True zurückgeben.

  7. Führen Sie eine Abfrage auf der geschützten Tabelle aus:

    SELECT * FROM empl_info;
    
    Copy

    Die SELECT-Anweisung sollte die unmaskierten E-Mail-Adressen zurückgeben.

  8. Weisen Sie den Kontorollen die Datenbankrollen zu, damit Benutzer mit diesen Kontorollen die geschützte Tabelle abfragen und Daten auf Basis der Definition der Maskierungsrichtlinie anzeigen können.

    Nach Wiederholung der beiden vorangegangenen Schritte sollte ein Benutzer, dem die Datenbankrolle mydb.support zugewiesen wurde, eine teilweise maskierte E-Mail-Adresse sehen.

Beispiel: Maskierungsrichtlinie und geschützte Daten in verschiedenen Datenbanken

Wenn sich die Richtlinie und die geschützte Tabelle in verschiedenen Datenbanken befinden, müssen beide Datenbanken für den Verbraucher freigegeben werden.

Beispiel:

  • mydb1 enthält die Maskierungsrichtlinie und mydb1.analyst die Datenbankrolle. Sie müssen die Richtlinie und die Datenbankrolle in derselben Datenbank gruppieren.

  • mydb2 enthält die Tabelle namens mydb2.tables.empl_info, welche die Spalte EMAIL enthält. Die Maskierungsrichtlinie ist auf diese Spalte gesetzt.

Der Anbieter führt dieselben Schritte aus wie im vorherigen Beispiel, d. h. er erstellt eine Freigabe, erteilt der Freigabe Berechtigungen und weist der Freigabe die Datenbankrolle zu.

Der Verbraucher geht beim Erstellen einer Datenbank aus der Freigabe genauso vor wie im vorherigen Beispiel. Der Verbraucher muss jedoch die Datenbank, die die Richtlinie enthält, in Verwendung haben, um die Datenbankrolle aktivieren zu können. Dann kann der Verbraucher die geschützte Tabelle abfragen, indem er den vollqualifizierten Namen der Tabelle angibt.

  1. Führen Sie im Anbieterkonto den Befehl CREATE SHARE aus, um eine Freigabe für jede Datenbank zu erstellen:

    USE ROLE r1;
    CREATE SHARE analyst_policy_share;
    CREATE SHARE analyst_table_share;
    
    Copy
  2. Erteilen Sie der Freigabe namens analyst_policy_share die erforderlichen Berechtigungen:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb1 TO SHARE analyst_policy_share;
    GRANT USAGE ON SCHEMA mydb1.policies TO SHARE analyst_policy_share;
    GRANT DATABASE ROLE mydb1.analyst TO SHARE analyst_policy_share;
    
    Copy
  3. Erteilen Sie der Freigabe namens analyst_table_share die erforderlichen Berechtigungen:

    USE ROLE r1;
    GRANT USAGE ON SCHEMA mydb2.tables TO SHARE analyst_table_share;
    GRANT SELECT ON TABLE mydb2.tables.empl_info TO SHARE analyst_table_share;
    
    Copy
  4. Fügen Sie der Freigabe das Verbraucherkonto hinzu:

    ALTER SHARE analyst_policy_share ADD ACCOUNTS = consumer_account;
    ALTER SHARE analyst_table_share ADD ACCOUNTS = consumer_account;
    
    Copy
  5. Erstellen Sie im Verbraucherkonto die Kontorolle r1, und erteilen Sie dieser Rolle die Berechtigungen zum Importieren der Freigabe:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  6. Importieren Sie jede Freigabe:

    USE ROLE r1;
    CREATE DATABASE mounted_db1 FROM SHARE provider_account.analyst_policy_share;
    CREATE DATABASE mounted_db2 FROM SHARE provider_account.analyst_table_share;
    
    Copy
  7. Überprüfen Sie, ob die Datenbankrolle in der Sitzung aktiv ist:

    USE DATABASE mounted_db1;
    USE SCHEMA mounted_db1.policies;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db1.analyst');
    
    Copy

    Die SELECT-Anweisung sollte True zurückgeben.

  8. Führen Sie eine Abfrage auf der geschützten Tabelle aus:

    SELECT * FROM mounted_db2.tables.empl_info;
    
    Copy

    Die SELECT-Anweisung sollte die unmaskierten E-Mail-Adressen zurückgeben.

Beispiel: Zeilenzugriffsrichtlinie ohne Zuordnungstabelle

In diesem Beispiel ruft die Zeilenzugriffsrichtlinie die Funktion IS_DATABASE_ROLE_IN_SESSION auf, um in der Spalte AUTHZ_ROLE den Rollennamen (d. h. die autorisierte Rolle) zu suchen. Beachten Sie die nicht literale Syntax und dass die Funktionssuche in der Datenbank erfolgt, die die Richtlinie enthält. In diesem Szenario muss sich die Zuordnungstabelle in derselben Datenbank befinden wie die Zeilenzugriffsrichtlinie.

Erstellen Sie die Richtlinie:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_DATABASE_ROLE_IN_SESSION(authz_role);
Copy

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

Der Anbieter kann wählen, ob die Objekte in einer einzigen Datenbank oder in mehreren Datenbanken freigegeben werden sollen, wie in den Beispielen für die Maskierungsrichtlinie gezeigt. Der Verbraucher führt dieselben Schritte aus, um eine Datenbank aus einer Freigabe für jede Datenbank zu erstellen, die der Anbieter zur Verfügung stellt.

Beispiel: Zeilenzugriffsrichtlinie mit Zuordnungstabelle

In diesem Beispiel ruft die Zeilenzugriffsrichtlinie die Funktion IS_DATABASE_ROLE_IN_SESSION auf, um in der Spalte ROLE_NAME der Zuordnungstabelle die autorisierte Rolle zu suchen. Beachten Sie die nicht literale Syntax und dass die Funktionssuche in der Datenbank erfolgt, die die Richtlinie enthält. In diesem Szenario muss sich die Zuordnungstabelle in derselben Datenbank befinden wie die Zeilenzugriffsrichtlinie. Nachdem Sie die Richtlinie erstellt haben, fügen Sie diese der Tabelle mit der Spalte AUTHZ_ROLE hinzu.

Erstellen Sie die Richtlinie:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key AND IS_DATABASE_ROLE_IN_SESSION(m.role_name)
);
Copy

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy

Der Anbieter kann wählen, ob die Objekte in einer einzigen Datenbank oder in mehreren Datenbanken freigegeben werden sollen, wie in den Beispielen für die Maskierungsrichtlinie gezeigt. Der Verbraucher führt dieselben Schritte aus, um eine Datenbank aus einer Freigabe für jede Datenbank zu erstellen, die der Anbieter zur Verfügung stellt.