Zeilenzugriffsrichtlinien verwenden

Dieses Thema bietet eine Einführung in die Implementierung von Zeilenzugriffsrichtlinien.

Unter diesem Thema:

Zeilenzugriffsrichtlinien implementieren

In den folgenden Unterabschnitten finden Sie Beispiele für die Implementierung von Zeilenzugriffsrichtlinien:

  • Verwenden einer typischen Zeilenzugriffsrichtlinie mit einer Suche in einer Zuordnungstabelle.

  • Ersetzen bestehender Zeilenzugriffsrichtlinien-Unterabfragen durch memoisierbare Funktionen zur Steigerung der Abfrageleistung.

  • Referenzieren einer Zuordnungstabelle, die durch eine Zeilenzugriffsrichtlinie in einer anderen Zeilenzugriffsrichtlinie geschützt ist.

Beispiel: Suche in Zuordnungstabellen

Die folgenden Schritte sind eine repräsentative Anleitung zum Konfigurieren von Berechtigungen für Zeilenzugriffsrichtlinien und zum Hinzufügen von Zeilenzugriffsrichtlinien zu Tabellen und Ansichten.

Diese Schritte gehen von den folgenden Annahmen aus:

  • Der Verwaltungsansatz ist „zentral“.

    Wenn der Anwendungsfall für Zeilenzugriffsrichtlinien einen hybriden oder dezentralen Verwaltungsansatz enthält, finden Sie unter Zeilenzugriffsrichtlinien verwalten eine repräsentative Verteilung von Rollen und Berechtigungen.

  • Es ist eine Zuordnungstabelle erforderlich, ähnlich wie bei Repräsentativer Anwendungsfall: Verwenden einer Zuordnungstabelle zum Filtern des Abfrageergebnisses.

    Die folgenden Schritte verwenden die Kontextfunktion CURRENT_ROLE, um zu bestimmen, ob Benutzern Zeilen in einem Abfrageergebnis angezeigt werden, während sich der repräsentative Anwendungsfall auf den Vornamen des Benutzers konzentriert (d. h. CURRENT_USER).

    Wenn Rollenaktivierung und Rollenhierarchie wichtig sind, empfiehlt Snowflake, dass die Richtlinienbedingungen die Kontextfunktion IS_ROLE_IN_SESSION verwenden. Beispiele für Richtlinien finden Sie im Abschnitt Beispiele der Funktion IS_ROLE_IN_SESSION.

    Der Gesamtprozess zur Implementierung einer Zeilenzugriffsrichtlinie mit Zuordnungstabellen bleibt gleich, auch wenn die Kontextfunktionen unterschiedlich sind.

  • Die Systemrolle SECURITYADMIN erteilt kundenspezifischen Rollen die Berechtigung, Zeilenzugriffsrichtlinien zu verwalten und zu implementieren.

    Wenn Sie in einer Produktionsumgebung keine Rollen mit höheren Berechtigungen (d. h. SECURITYADMIN oder ACCOUNTADMIN) zugunsten von kundenspezifischen Rollen mit geringeren Berechtigungen (z. B. database_admin, finance_admin) verwenden möchten, vergewissern Sie sich, dass die Rollen mit niedrigeren Berechtigungen über die erforderlichen Berechtigungen zur Verwaltung und Implementierung von Zeilenzugriffsrichtlinien verfügen.

    Weitere Informationen dazu finden Sie unter Berechtigungen von Zeilenzugriffsrichtlinien und Übersicht der DDL-Befehle, Operationen und Berechtigungen.

  • Es gibt getrennte Schritte für das Erstellen einer Tabelle, die durch eine Zeilenzugriffsrichtlinie geschützt werden soll (Schritt 1), und für das Hinzufügen der Zeilenzugriffsrichtlinie zu der Tabelle (Schritt 5). Es ist möglich, der Tabelle beim Erstellen eine Zeilenzugriffsrichtlinie hinzuzufügen, vorausgesetzt, dass bereits eine Zeilenzugriffsrichtlinie vorhanden ist. Weitere Informationen zur Syntax finden Sie unter CREATE TABLE.

Beispiel:

  1. Erstellen Sie eine Tabelle für die Umsatzdaten:

    CREATE TABLE sales (
      customer   varchar,
      product    varchar,
      spend      decimal(20, 2),
      sale_date  date,
      region     varchar
    );
    
    Copy
  2. Erstellen Sie im security-Schema eine Zuordnungstabelle wie im repräsentativen Beispiel gezeigt. Diese Tabelle definiert, welche Zeilen der sales-Tabelle dem Vertriebsleiter angezeigt werden:

    CREATE TABLE security.salesmanagerregions (
      sales_manager varchar,
      region        varchar
    );
    
    Copy
  3. Als Nächstes erstellt ein Sicherheitsadministrator die kundenspezifische Rolle mapping_role und erteilt dieser kundenspezifischen Rolle die SELECT-Berechtigung. Diese Berechtigung erlaubt es Benutzern mit der kundenspezifischen Rolle, die Zuordnungstabelle abzufragen:

    USE ROLE SECURITYADMIN;
    
    CREATE ROLE mapping_role;
    
    GRANT SELECT ON TABLE security.salesmanagerregions TO ROLE mapping_role;
    
    Copy
  4. Erstellen Sie mit der Schemaeigentümerrolle eine Zeilenzugriffsrichtlinie mit den folgenden beiden Bedingungen:

    • Benutzer mit der kundenspezifischen Rolle sales_executive_role können alle Zeilen anzeigen.

    • Benutzer mit der kundenspezifischen Rolle sales_manager können Zeilen auf Basis der Zuordnungstabelle salesmanagerregions anzeigen.

    Beachten Sie, dass die Schemaeigentümerrolle automatisch die Berechtigung CREATE ROW ACCESS POLICY erhält. Wenn andere Rollen in der Lage sein sollen, Zeilenzugriffsrichtlinien zu erstellen, kann die Schemaeigentümerrolle anderen Rollen das Richtlinienberechtigung CREATE ROW ACCESS erteilen.

    USE ROLE schema_owner_role;
    
    CREATE OR REPLACE ROW ACCESS POLICY security.sales_policy
    AS (sales_region varchar) RETURNS BOOLEAN ->
      'sales_executive_role' = CURRENT_ROLE()
        OR EXISTS (
          SELECT 1 FROM salesmanagerregions
            WHERE sales_manager = CURRENT_ROLE()
            AND region = sales_region
        )
    ;
    
    Copy

    Wobei:

    security.sales_policy

    Der Name der Zeilenzugriffsrichtlinie im Schema security.

    AS (sales_region varchar)

    Die Signatur für die Zeilenzugriffsrichtlinie.

    Eine Signatur spezifiziert das Attribut der Zuordnungstabelle und den Datentyp. Der zurückgegebene Wert bestimmt, ob der Benutzer Zugriff auf eine bestimmte Zeile der Tabelle oder der Ansicht hat, zu der die Zeilenzugriffsrichtlinie hinzugefügt wurde.

    'sales_executive_role' = CURRENT_ROLE()

    Der Anfang von body in der Zeilenzugriffsrichtlinie.

    Die erste Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, die es Benutzern mit der kundenspezifischen Rolle sales_executive_role erlaubt, Daten anzuzeigen.

    OR EXISTS (select 1 from salesmanagerregions WHERE sales_manager = CURRENT_ROLE() AND region = sales_region)

    Die zweite Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, in dem eine Unterabfrage verwendet wird.

    Die Unterabfrage erfordert, dass CURRENT_ROLE die kundenspezifische Rolle sales_manager ist, wobei die ausgeführte Abfrage auf den Daten eine Region angibt, die in der Zuordnungstabelle {salesmanagerregions} aufgeführt ist.

    Tipp

    Um die Abfrageleistung für die richtliniengeschützte Tabelle zu erhöhen, ersetzen Sie in der EXISTS-Klausel die Unterabfrage für die Suche in der Zuordnungstabelle durch eine memoisierbare Funktion.

    Weitere Informationen dazu finden Sie im Beispiel für memoisierbare Funktionen (unter diesem Thema).

  5. Führen Sie unter Verwendung der Systemrolle SECURITYADMIN die folgenden beiden Anweisungen aus:

    GRANT OWNERSHIP ON ROW ACCESS POLICY security.sales_policy TO mapping_role;
    
    GRANT APPLY ON ROW ACCESS POLICY security.sales_policy TO ROLE sales_analyst_role;
    
    Copy

    Diese beiden GRANT <Berechtigungen>-Anweisungen haben die folgenden Auswirkungen:

    • Die Eigentümerschaft der Richtlinie liegt nicht bei der Systemrolle SECURITYADMIN. Zur Laufzeit der Abfrage verwendet Snowflake die der kundenspezifische Rolle erteilten Berechtigungen, da Richtlinien mit den Berechtigungen des Eigentümers und nicht mit den höheren Berechtigungen der Systemrolle SECURITYADMIN ausgeführt werden. Dieser Ansatz unterstützt das Prinzip der niedrigsten Berechtigung.

    • Die kundenspezifische Rolle sales_analyst_role kann die Zeilenzugriffsrichtlinie einer Tabelle nach Bedarf hinzufügen oder entfernen.

  6. Fügen Sie die Zeilenzugriffsrichtlinie zur Regionsspalte der Datentabelle sales hinzu (d. h. binden Sie diese):

    USE ROLE SECURITYADMIN;
    
    ALTER TABLE sales ADD ROW ACCESS POLICY security.sales_policy ON (region);
    
    Copy
  7. Erteilen Sie der kundenspezifischen Rolle sales_manager_role die SELECT-Berechtigung für die geschützten sales-Daten:

    GRANT SELECT ON TABLE sales TO ROLE sales_manager_role;
    
    Copy
  8. Nachdem die sales-Tabelle mit den Verkaufsdaten aufgefüllt wurde, testen Sie die Zeilenzugriffsrichtlinie:

    USE ROLE sales_manager_role;
    SELECT product, SUM(spend)
    FROM sales
    WHERE YEAR(sale_date) = 2020
    GROUP BY product;
    
    Copy

Beispiel: Ersetzen von Richtlinien-Unterabfragen durch eine memoisierbare Funktion

Mit den Schritten in diesem Beispiel wird eine memoisierbare Funktion für Suchvorgänge in einer Zuordnungstabelle innerhalb der Bedingungen der Zeilenzugriffsrichtlinie erstellt. Die Unterabfrage in jeder EXISTS-Klausel gibt die Suche in der Zuordnungstabelle angibt, wobei die Tabellen jeweils regions, customers und products heißen:

CREATE OR REPLACE ROW ACCESS POLICY rap_NO_memoizable_function
  AS (region_id number, customer_id number, product_id number)
  RETURNS BOOLEAN ->
    EXISTS(SELECT 1 FROM regions WHERE id = region_id) OR
    EXISTS(SELECT 1 FROM customers WHERE id = customer_id) OR
    EXISTS(SELECT 1 FROM products WHERE id = product_id)
  ;
Copy

Bei den folgenden Schritten wird davon ausgegangen, dass die kundenspezifische Rolle rap_admin Zeilenzugriffsrichtlinien erstellen kann (d. h. über die Berechtigung CREATE ROW ACCESS POLICY on SCHEMA verfügt).

Führen Sie die folgenden Schritte aus, um jeden Suchvorgang auf Zuordnungstabellen der Zeilenzugriffsrichtlinie durch eine memoisierbare Funktion zu ersetzen:

  1. Erstellen Sie eine kundenspezifische Rolle mit dem Namen functions_admin, um die memoisierbare Funktion zu verwalten:

    USE ROLE USERADMIN;
    
    CREATE ROLE functions_admin;
    
    Copy
  2. Erteilen Sie der Rolle functions_admin die folgenden Berechtigungen, um das Erstellen der memoisierbaren Funktion in einem vorhandenen Schema namens governance.functions zu ermöglichen:

    USE ROLE SECURITYADMIN;
    
    GRANT USAGE ON DATABASE governance TO ROLE functions_admin;
    
    GRANT USAGE ON SCHEMA governance.functions TO ROLE functions_admin;
    
    GRANT CREATE FUNCTION ON SCHEMA governance.functions TO ROLE functions_admin;
    
    Copy
  3. Erstellen Sie eine memoisierbare Funktion für jede EXISTS-Unterabfrageklausel der Zeilenzugriffsrichtlinie. Die Definition der memoisierbaren Funktion hat immer die gleiche Form. Der Kürze halber wird nur ein Funktionsbeispiel gezeigt:

    USE ROLE functions_admin;
    
    USE SCHEMA governance.functions;
    
    CREATE OR REPLACE function allowed_regions()
      RETURNS array
      memoizable
      AS 'SELECT ARRAY_AGG(id) FROM regions';
    
    Copy
  4. Verwenden Sie eine CREATE ROW ACCESS POLICY-Anweisung, um eine neue Zeilenzugriffsrichtlinie zu definieren, in der die Unterabfragen durch memoisierbare Funktionen ersetzt sind:

    Die neue Zeilenzugriffsrichtlinie ermöglicht das Testen von Abfragen auf einer geschützten Tabelle, wenn die Richtlinie die memoisierbaren Funktionen verwendet oder nicht verwendet, um die Performance-Effekte bei Verwendung von memoisierbaren Funktionen in den Richtlinienbedingungen zu quantifizieren:

    USE ROLE rap_admin;
    
    CREATE OR REPLACE ROW ACCESS POLICY rap_with_memoizable_function
      AS (region_id number, customer_id number, product_id number)
      RETURNS BOOLEAN ->
        ARRAY_CONTAINS(region_id, allowed_regions()) OR
        ARRAY_CONTAINS(customer_id, allowed_customers()) OR
        ARRAY_CONTAINS(product_id, allowed_products())
      ;
    
    Copy

Beispiel: Schützen der Zuordnungstabelle mit einer Zeilenzugriffsrichtlinie

Dieses Beispiel zeigt, wie Sie eine Zuordnungstabelle referenzieren, die durch eine Zeilenzugriffsrichtlinie in einer anderen Zeilenzugriffsrichtlinie geschützt ist. Die Zeilenzugriffsrichtlinie, mit der die Zuordnungstabelle geschützt wird, ruft die Kontextfunktion IS_ROLE_IN_SESSION auf, um die Rollenhierarchie zu berücksichtigen. Die Tabelle, die der Benutzer abfragt, wird durch eine andere Zeilenzugriffsrichtlinie geschützt. Diese Zeilenzugriffsrichtlinie verwendet eine Unterabfrage, um eine Suche in einer Zuordnungstabelle auszuführen. Beispiel:

  1. Erstellen Sie eine Zuordnungstabelle, um zulässige Rollen auf der Grundlage von geografischen Verkaufsregionen zu definieren, und fügen Sie Daten in die Tabelle ein:

    CREATE OR REPLACE TABLE sales.tables.regional_managers (
      allowed_regions varchar
      allowed_roles varchar
    );
    
    Copy
    INSERT INTO sales.tables.regional_managers
    (allowed_regions, allowed_roles)
    VALUES
    ('na', 'NA_MANAGER'),
    ('eu', 'EU_MANAGER'),
    ('apac', 'APAC_MANAGER');
    
    Copy
  2. Erstellen Sie eine Zeilenzugriffsrichtlinie, um die Spalte ALLOWED_ROLES in der Zuordnungstabelle anzugeben:

    CREATE OR REPLACE ROW ACCESS POLICY governance.policies.rap_map_exempt
    AS (allowed_roles varchar) RETURNS BOOLEAN ->
    IS_ROLE_IN_SESSION(allowed_roles);
    
    Copy
  3. Fügen Sie die Zeilenzugriffsrichtlinie für die Zuordnungstabelle mit einer ALTER TABLE-Anweisung hinzu:

    ALTER TABLE sales.tables.regional_managers
      ADD ROW ACCESS POLICY governance.policies.rap_map_exempt
      ON (allowed_roles);
    
    Copy
  4. Erstellen Sie eine neue Zeilenzugriffsrichtlinie, die die Zuordnungstabellensuche in der geschützten Zuordnungstabelle festlegt:

     CREATE OR REPLACE ROW ACCESS POLICY governance.policies.rap_map_lookup
     AS (allowed_regions varchar) RETURNS BOOLEAN ->
     EXISTS (
       SELECT * FROM sales.tables.regional_managers
       WHERE
         REGION = allowed_regions
    );
    
    Copy
  5. Fügen Sie die Zeilenzugriffsrichtlinie namens governance.policies.rap_map_lookup auf der Tabelle namens sales.tables.data mithilfe einer ALTER TABLE-Anweisung hinzu:

    ALTER TABLE sales.tables.data
      ADD ROW ACCESS POLICY governance.policies.rap_map_lookup
      ON (allowed_regions);
    
    Copy
  6. Weisen Sie den Rollen in der Zuordnungstabelle Berechtigungen zu, damit Benutzer mit diesen Rollen die geschützten Daten abfragen können. Folgende Berechtigungszuweisungen erfolgen beispielsweise für die kundenspezifische Rolle na_manager:

    USE ROLE SECURITYADMIN;
    GRANT USAGE ON DATABASE sales TO ROLE na_manager;
    GRANT USAGE ON SCHEMA sales.tables TO ROLE na_manager;
    GRANT SELECT ON TABLE sales.tables.regional_managers TO ROLE na_manager;
    GRANT SELECT ON TABLE sales.tables.data TO ROLE na_manager;
    
    Copy

    Wiederholen Sie bei Bedarf die Befehle in diesem Schritt für jede Rolle in der Zuordnungstabelle.