Zeilenzugriffsrichtlinien verwenden¶
Dieses Thema bietet eine Einführung in die Implementierung von Zeilenzugriffsrichtlinien.
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 Funktion IS_ROLE_IN_SESSION für Kontorollen und die Funktion IS_DATABASE_ROLE_IN_SESSION für Datenbankrollen verwenden. Weitere Details dazu finden Sie unter Aktive Rollenhierarchie und Zuordnungstabellen.
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:
Erstellen Sie eine Tabelle für die Umsatzdaten:
Erstellen Sie im
security-Schema eine Zuordnungstabelle wie im repräsentativen Beispiel gezeigt. Diese Tabelle definiert, welche Zeilen dersales-Tabelle dem Vertriebsleiter angezeigt werden:Als Nächstes erstellt ein Sicherheitsadministrator die kundenspezifische Rolle
mapping_roleund erteilt dieser kundenspezifischen Rolle die SELECT-Berechtigung. Diese Berechtigung erlaubt es Benutzern mit der kundenspezifischen Rolle, die Zuordnungstabelle abzufragen:Erstellen Sie mit der Schemaeigentümerrolle eine Zeilenzugriffsrichtlinie mit den folgenden beiden Bedingungen:
Benutzer mit der kundenspezifischen Rolle
sales_executive_rolekönnen alle Zeilen anzeigen.Benutzer mit der kundenspezifischen Rolle
sales_managerkönnen Zeilen auf Basis der Zuordnungstabellesalesmanagerregionsanzeigen.
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.
Wobei:
security.sales_policyDer 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
bodyin der Zeilenzugriffsrichtlinie.Die erste Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, die es Benutzern mit der kundenspezifischen Rolle
sales_executive_roleerlaubt, 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_managerist, 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).
Führen Sie unter Verwendung der Systemrolle SECURITYADMIN die folgenden beiden Anweisungen aus:
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 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_rolekann die Zeilenzugriffsrichtlinie einer Tabelle nach Bedarf hinzufügen oder entfernen.
Fügen Sie die Zeilenzugriffsrichtlinie zur Regionsspalte der Datentabelle
saleshinzu (d. h. binden Sie diese):Erteilen Sie der kundenspezifischen Rolle
sales_manager_roledie SELECT-Berechtigung für die geschütztensales-Daten:Nachdem die
sales-Tabelle mit den Verkaufsdaten aufgefüllt wurde, testen Sie die Zeilenzugriffsrichtlinie:
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:
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:
Erstellen Sie eine kundenspezifische Rolle mit dem Namen
functions_admin, um die memoisierbare Funktion zu verwalten:Erteilen Sie der Rolle
functions_admindie folgenden Berechtigungen, um das Erstellen der memoisierbaren Funktion in einem vorhandenen Schema namensgovernance.functionszu ermöglichen: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: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:
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:
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:
Erstellen Sie eine Zeilenzugriffsrichtlinie, um die Spalte ALLOWED_ROLES in der Zuordnungstabelle anzugeben:
Fügen Sie die Zeilenzugriffsrichtlinie für die Zuordnungstabelle mit einer ALTER TABLE-Anweisung hinzu:
Erstellen Sie eine neue Zeilenzugriffsrichtlinie, die die Zuordnungstabellensuche in der geschützten Zuordnungstabelle festlegt:
Fügen Sie die Zeilenzugriffsrichtlinie namens
governance.policies.rap_map_lookupauf der Tabelle namenssales.tables.datamithilfe einer ALTER TABLE-Anweisung hinzu: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:Wiederholen Sie bei Bedarf die Befehle in diesem Schritt für jede Rolle in der Zuordnungstabelle.