Verwenden von Zeilenzugriffsrichtlinien

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

Unter diesem Thema:

Implementieren von Zeilenzugriffsrichtlinien

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 Verwalten von Zeilenzugriffsrichtlinien 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).

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

  • Die Systemrolle SECURITYADMIN erteilt benutzerdefinierten 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 benutzerdefinierten 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.

Schritt 1: Tabelle für die Daten erstellen

Erstellen Sie eine Tabelle für die Umsatzdaten.

create table sales (
  customer   varchar,
  product    varchar,
  spend      decimal(20, 2),
  sale_date  date,
  region     varchar
);

Schritt 2: Zuordnungstabelle und benutzerdefinierte Rolle erstellen und SELECT-Berechtigung erteilen

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

Als Nächstes erstellt ein Sicherheitsadministrator die benutzerdefinierte Rolle mapping_role und erteilt der benutzerdefinierten Rolle die SELECT-Berechtigung. Diese Berechtigung erlaubt es Benutzern mit der benutzerdefinierten Rolle, die Zuordnungstabelle abzufragen.

use role securityadmin;

create role mapping_role;

grant select on table security.salesmanagerregions to role mapping_role;

Schritt 3: Zeilenzugriffsrichtlinie erstellen

Erstellen Sie mit der Schemaeigentümerrolle eine Zeilenzugriffsrichtlinie mit den folgenden beiden Bedingungen:

  1. Benutzer mit der benutzerdefinierten Rolle sales_executive_role können alle Zeilen anzeigen.

  2. Benutzer mit der benutzerdefinierten 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
          )
;

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.

returns boolean ->

Gibt die Anwendung der Zeilenzugriffsrichtlinie an.

Beachten Sie, dass der <expression> der Zeilenzugriffsrichtlinie unmittelbar auf den rechten Pfeil (d. h. ->) folgt.

Der Ausdruck kann ein beliebiger SQL-Ausdruck mit booleschem Wert sein. Snowflake unterstützt Ausdrücke, die UDFs, externe Funktionen und Ausdrücke mit Unterabfragen aufrufen.

'sales_executive_role' = current_role()

Die erste Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, die es Benutzern mit der benutzerdefinierten 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 benutzerdefinierte Rolle sales_manager ist, wobei die ausgeführte Abfrage auf den Daten eine Region angibt, die in der Zuordnungstabelle {salesmanagerregions} aufgeführt ist.

Schritt 4: Benutzerdefinierter Rolle Berechtigungen erteilen

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;

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

  • Die Eigentümerschaft der Richtlinie liegt nicht bei der Systemrolle SECURITYADMIN. Zur Laufzeit der Abfrage verwendet Snowflake die der benutzerdefinierten 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 benutzerdefinierte Rolle sales_analyst_role kann die Zeilenzugriffsrichtlinie einer Tabelle nach Bedarf hinzufügen oder entfernen.

Schritt 5: Zeilenzugriffsrichtlinie zu einer Tabelle hinzufügen

Jede Tabelle oder Ansicht in Snowflake kann immer nur eine Zeilenzugriffsrichtlinie gleichzeitig unterstützen.

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

Schritt 6: Rolle das Abfragen von geschützten Tabellendaten erlauben

Erteilen Sie der benutzerdefinierten Rolle sales_manager_role die SELECT-Berechtigung für die geschützten sales-Daten.

grant select on table sales to role sales_manager_role;

Schritt 7: Richtlinie testen

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;