Bewährte RLS-Methoden für Datenquellen und Arbeitsmappen
Sicherheit auf Zeilenebene (Row-Level Security, RLS) in Tableau beschränkt die Datenzeilen, die ein bestimmter Benutzer in einer Arbeitsmappe sehen kann. Dies unterscheidet sich von Tableau-Berechtigungen, die den Zugriff auf Inhalte und Feature-Funktionen steuern. So steuern beispielsweise Berechtigungen, ob ein Benutzer eine Arbeitsmappe kommentieren oder bearbeiten kann, während die Sicherheit auf Zeilenebene dafür sorgt, dass zwei Benutzer, die dasselbe Dashboard anzeigen, nur die Daten sehen können, zu deren Ansicht sie jeweils berechtigt sind.
Es gibt mehrere Möglichkeiten, RLS in Tableau zu implementieren. Beispielsweise können Sie RLS auf Datenquellen- oder Arbeitsmappenebene festlegen oder Sie können RLS auf Verbindungsebene festlegen, indem Sie eine virtuelle Verbindung mit einer Datenrichtlinie verwenden (erfordert Tableau Data Management). Einzelheiten zu Alternativen finden Sie in der Übersicht über Optionen für Sicherheit auf Zeilenebene in Tableau.
Hinweis: Dieses Thema konzentriert sich auf bewährte RLS-Methoden für Datenquellen und Arbeitsmappen. Ausführlichere Beispiele für die in diesem Thema beschriebenen Konzepte finden Sie im Whitepaper Best Practices for Row Level Security with Entitlement Tables(Link wird in neuem Fenster geöffnet) oder How to Set Up Your Database for Row Level Security in Tableau(Link wird in neuem Fenster geöffnet) im Blog Tableau and Behold.
RLS-Workflow
Für Direktverbindungen und Multi-Table-Extrakte gestaltet sich der grundlegende RLS-Workflow folgendermaßen:
- Der Benutzer wird durch die Anmeldung bei Tableau Server oder Tableau Cloud identifiziert.
- Dafür ist ein eindeutiger Benutzername pro Benutzer und eine sichere einmalige Anmeldung (SSO) erforderlich
- Active Directory, LDAP oder die Tableau REST API können verwendet werden, um Benutzernamen zu synchronisieren und Berechtigungen einzurichten
- Der Satz von Datenberechtigungen für den Benutzer wird aus allen möglichen Datenberechtigungen abgerufen.
- Dies erfordert eine Datenstruktur, die Berechtigungen mit dem Tableau-Benutzernamen verknüpfen kann.
- Die Daten werden nach den Berechtigungen für diesen Benutzer gefiltert.
- Dies erfordert häufig die Verwendung von Benutzerfunktionen in einem berechneten Feld
- Die veröffentlichten, gefilterten Daten werden zum Erstellen von Inhalten verwendet.
- Durch die Verwendung einer veröffentlichten (nicht eingebetteten) Datenquelle mit einem Datenquellenfilter wird sichergestellt, dass das RLS nicht durch Herunterladen oder Webbearbeitung der Arbeitsmappe geändert werden kann
Wie die Verknüpfungen, berechneten Felder und Filter eingerichtet werden, hängt von der Struktur der Daten und der Art und Weise ab, wie Benutzer verwaltet werden.
Berechtigungstabellen
Jede eindeutige Kombination von Attributen, nach denen die Daten gefiltert werden können, ist eine Berechtigung. In den meisten Abschnitten gibt es separate Tabellen, in denen die Berechtigungen selbst angegeben und Benutzern oder Benutzerrollen zugeordnet werden können. Die Denormalisierung wird leistungsbedingt empfohlen, da Verknüpfungen teure Vorgänge sind.
Die Berechtigungsansicht, die aus den Berechtigungen besteht, die Benutzern oder Rollen zugeordnet sind, wird mit den Daten verknüpft. Anschließend wird ein benutzerbasierter Datenquellenfilter angewendet, der als WHERE-Klausel fungiert, die nur die Berechtigungen – und damit die entsprechenden Datenzeilen – für den betreffenden Benutzer einführt. (Die Abfrageoptimierung sollte sicherstellen, dass die Filterung vor dem Beitritt erfolgt, wenn die Abfrage verarbeitet wird, um die Datenduplizierung zu minimieren. Weitere Informationen finden Sie unter Leistung und Bearbeitungsreihenfolge der Operationen.)
Berechtigungstabellenmodelle
Im Allgemeinen gibt es zwei Modelle für die Darstellung von Berechtigungen:
Vollständige Zuordnung zur tiefsten Granularitätsebene
- Berechtigungen werden für jede Spalte vollständig definiert.
- Für jede mögliche Berechtigung des Benutzers gibt es eine Zeile in der Zuordnungstabelle.
- Für dieses Modell sind weniger Verknüpfungsklauseln erforderlich.
Sparse-Berechtigungen
- Berechtigungen werden für jede Hierarchieebene definiert, wobei NULL verwendet wird, um den Status "all" darzustellen.
- In der Zuordnungstabelle für eine bestimmte Ebene in der Berechtigungshierarchie befindet sich eine einzelne Zeile, wodurch die Anzahl der Berechtigungszeilen für Benutzer auf hohen Ebenen in einer Hierarchie erheblich reduziert wird.
- Dieses Modell erfordert komplexere Verknüpfungen und Filter.
Benutzer und Rollen
Kombinationen von Berechtigungen werden häufig als Rollen dargestellt, die dann in einer n:n-Zuordnungstabelle mit Benutzern verknüpft werden. Dies ermöglicht das einfache Ändern oder Entfernen eines Benutzers aus der Rolle, während gleichzeitig eine Aufzeichnung der Rolle und ihrer Berechtigungen beibehalten wird.
Alternativ kann eine n:n-Zuordnungstabelle erstellt werden, die Benutzer stattdessen direkt Berechtigungen zuweist, anstatt eine Rollentabelle zu verbinden. Für die Verwaltung der Werte in der Tabelle ist jedoch eine Verknüpfung erforderlich.
Hinweis: Die Benutzerwerte, die einer Rolle oder Berechtigung zugeordnet sind, müssen mit dem Benutzernamen oder dem vollständigen Namen auf der Tableau-Website übereinstimmen, um die Benutzerfunktionen in Tableau Desktop nutzen zu können.
Verknüpfungen
Unabhängig von dem Modell, das zur Darstellung der Berechtigungen verwendet wird, ist es ratsam, alle Berechtigungen und Zuordnungstabellen in einer einzigen denormalisierten Berechtigungsansicht zusammenzufügen. Während dies zunächst eine sogenannte "Blowup"-Version (hochgradig duplizierte Version) der Berechtigungen verursacht, reduziert der Datenquellenfilter für den Benutzer diese wieder nach unten. Diese Ansicht soll auch angezeigt werden, wenn Sie einen Extrakt verwenden möchten.
Die Methode der tiefsten Granularität kann einen Leistungsvorteil bieten, wenn alles hierarchisch ist – Sie müssen nur eine einzelne Verknüpfung auf der tiefsten Ebene der Hierarchie erstellen. Dies funktioniert nur, wenn alle Attribute auf der niedrigsten Ebene unterschiedlich sind. Wenn eine Überschneidungsmöglichkeit besteht (z. B. eine zentrale Unterregion in mehr als einer Region), müssen Sie alle Spalten verbinden, um die Wirkung eines eindeutigen Schlüsselwerts zu erzielen.
Die tatsächlichen Details und ihre Leistungsmerkmale hängen vom Datensystem ab und müssen getestet werden. Beispielsweise kann die Verwendung eines einzelnen Schlüssels die Leistung möglicherweise verbessern, da die Verknüpfung dann nur für eine Spalte ausgeführt wird, aber die korrekte Indizierung aller Spalten kann die gleiche Leistung bieten, wenn andere Faktoren berücksichtigt werden.
Implementieren von Sicherheit auf Zeilenebene
Tiefste Granularität
Sobald die denormalisierte Ansicht der zugeordneten Berechtigungen erstellt wurde, wird eine innere Verknüpfung zwischen der Ansicht und den Daten im Tableau-Datenverbindungsdialogfeld eingerichtet. Die Daten können in einem herkömmlichen Sternschema verbleiben. Alternativ können Bemaßungs- und Faktentabellen in zwei Ansichten materialisiert werden. Extrakte vom Typ "Mehrere Tabellen" erstellen Extrakttabellen, die den Verknüpfungen entsprechen, sodass das Erstellen der beiden Ansichten den resultierenden Extrakt vereinfacht. Die SQL folgt diesem grundlegenden Muster:
SELECT * FROM data d INNER JOIN entitlements e ON d.attribute_a = e.attribute_a AND d.attribute_b = e.attribute_b AND ... WHERE e.username = USERNAME()
Sparse-Berechtigungen
Wenn Ihre Berechtigungen eher dem Sparse-Berechtigungsmodell entsprechen, wäre die benutzerdefinierte SQL, die die Daten mit den Berechtigungen verbinden soll, aufgrund der NULL-Werte etwas komplexer. Konzeptionell würde es wie folgt aussehen:
SELECT * FROM data d INNER JOIN entitlements e ON (e.region_id = d.region_id OR ISNULL(e.region_id) AND (e.sub_region_id = d.sub_region_id OR ISNULL(e.sub_region_id) AND (e.country_id = d.country_id OR ISNULL(e.country_id)
Ohne benutzerdefinierte SQL besteht die Möglichkeit, dies mit einer Querverknüpfung und zusätzlichen Filtern in Tableau Desktop zu erreichen. Erstellen Sie eine Verknüpfungsberechnung auf beiden Seiten des Verknüpfungsdialogs, die einfach aus der ganzzahligen 1 besteht, und legen Sie sie gleich fest. Dadurch wird jede Zeile aus der Datentabelle mit jeder Zeile in der Berechtigungstabelle verknüpft.
Dann benötigen Sie eine Berechnung (oder einzelne Berechnungen), um die Ebenen in der Hierarchie zu berücksichtigen. Sie können z. B. mehrere Berechnungen haben, die diesem Format entsprechen: [region_id] = [region_id (Entitlements View)] OR ISNULL([region_id (Entitlements View)]
Oder Sie können eine kombinierte Berechnung für alle Ebenen in einem haben:
([region_id] = [region_id (Entitlements View)] OR ISNULL([region_id (Entitlements View)]) AND ([sub_region_id] = [sub_region_id (Entitlements View)] OR ISNULL([sub_region_id (Entitlements View)]) AND ([country_id] = [country_id (Entitlements View)] OR ISNULL([country_id (Entitlements View)])
Die ISNULL-Funktion gleicht jede Berechtigungsspalte mit allen Elementen in der anderen Spalte ab. Wie immer bei RLS sollten diese Berechnungen als Datenquellenfilter hinzugefügt werden.
Datenquellenfilter
Für beide Ansätze muss, sobald die Berechtigungen korrekt mit den Daten verknüpft sind, ein Filter festgelegt werden, um die Daten für einen bestimmten Benutzer einzuschränken. Ein berechnetes Feld sollte mit einer Benutzerfunktion erstellt werden. Beispielsweise wäre ein einfacher boolescher Vergleich, um festzustellen, ob der im Feld "Benutzername" aufgeführte Benutzer mit dem Benutzernamen der bei der Tableau-Website angemeldeten Person identisch ist: [Username] = USERNAME()
Diese Berechnung sollte als Datenquellenfilter verwendet werden (Auswahl: TRUE).
Wenn die Datenquelle eingebettet ist und ein Benutzer über Berechtigungen zum Bearbeiten oder Herunterladen der Arbeitsmappe verfügt, ist das RLS nicht vorhanden, da die erzwingenden Filter problemlos entfernt werden können. Die Tableau-Datenquelle sollte separat veröffentlicht werden, anstatt in der Arbeitsmappe eingebettet zu bleiben.
Vollständiger Zugriff mit tiefster Granularität
Es gibt auch ein häufiges Szenario, in dem es zwei Zugriffsebenen innerhalb der Organisation gibt: Personen, die alles sehen können ("Vollständiger Zugriff") oder Personen mit einer vernünftig definierbaren Teilmenge von Berechtigungen. Dies wird am häufigsten bei eingebetteten Anwendungen gesehen – die Organisation, die die Daten hostet, kann alles sehen, aber jeder Client kann nur seine eigenen Daten sehen. In diesem Fall benötigen Sie eine Möglichkeit, die vollständigen Daten für Benutzer mit "vollständigem Zugriff" zurückzugeben, während die tiefsten Granularitätsverknüpfungen für alle anderen Benutzer beibehalten werden.
Für diese Technik verwenden Sie Tableau-Gruppen, um eine Außerkraftsetzung mithilfe einer Berechnung in der Join-Klausel zu erstellen.
- Erstellen einer Gruppe für Benutzer, die alle Daten anzeigen sollen (hier als "Vollständiger Zugriff" bezeichnet)
- Erstellen Sie aus der Faktenansicht eine linke Verknüpfung mit zwei Join-Klauseln
- Die erste Join-Klausel sollte sich in der Spalte befinden, die die tiefste Granularitätsebene darstellt.
- Die zweite Join-Klausel sollte zwei Berechnungen sein:
- Geben Sie für die Berechnung auf der linken Seite (die Faktenansicht)
True
ein - Auf der rechten Seite (Ansicht der Berechtigungen) sollte die Berechnung folgendermaßen aussehen:
IF ISMEMBEROF('All Access') THEN False ELSE True END
- Geben Sie für die Berechnung auf der linken Seite (die Faktenansicht)
- Erstellen Sie auf einem Blatt eine Berechnung, die wie folgt strukturiert ist:
[Username] = USERNAME() OR ISMEMBEROF(['All Access'] ([Entitlements View)])
- Erstellen eines Datenquellenfilters für die Benutzernamensberechnung
Wenn ein Benutzer Mitglied der Gruppe "Vollständiger Zugriff" ist, wird die Verknüpfung zu einer linken Verknüpfung für True = False
. Dies bedeutet, dass in der Berechtigungsansicht überhaupt keine Übereinstimmungen vorhanden sind, sodass die gesamte Faktenansicht jeweils mit dem Wert NULL für die Spalten aus der Berechtigungsansicht zurückgegeben wird (Nullduplizierung). Wenn der Benutzer nicht Teil der Gruppe "Vollständiger Zugriff" ist, ändert die Join-Klausel True = True
nichts, und die Verknüpfung funktioniert wie erwartet.
Die als Datenquellenfilter verwendete Benutzerberechnung gilt für alle Zeilen, wenn die Gruppenüberschreibung funktioniert, oder sie filtert nur auf die tiefste Granularität des Benutzers in der Hierarchie herunter.
Leistung und Bearbeitungsreihenfolge der Operationen
Wenn eine Visualisierung in Tableau Desktop, Tableau Server oder Tableau Cloud angezeigt wird, sendet Tableau eine optimierte Abfrage an das RDBMS, die dann die Abfrage verarbeitet und die Ergebnisse zurück an Tableau sendet, um die Visualisierung mit den resultierenden Daten darzustellen. Die Reihenfolge der Vorgänge, wann Verknüpfungen, Berechnungen und Filter ausgeführt werden, hängt von der Abfrageoptimierung und der Art und Weise ab, wie die Abfrage ausgeführt wird.
Direktverbindungen
Bei Verwendung einer Direktverbindung mit einer Datenquelle in Tableau hängt die Leistung der Abfrageausführung von der Abfrageoptimierung ab, wodurch die eingehende SQL in einen effizienten Plan zum Abrufen der Daten übersetzt wird.
Es gibt zwei Möglichkeiten, die Abfrage zu verarbeiten:
- Filtern der Berechtigungszeilen nach dem Benutzer und Verknüpfung mit der Faktentabelle
- Verbinden Sie die Berechtigungen mit der Faktentabelle und filtern Sie dann nach den Zeilen des Benutzers.
Im bestmöglichen Fall stellt die Abfrageoptimierung sicher, dass die Datenbank die Abfrage verarbeitet, indem sie erst filtert und dann die Verknüpfung herstellt. Wenn ein Benutzer Berechtigungen für sämtliche Inhalte hat, bedeutet dies, dass die maximale Anzahl der verarbeiteten Zeilen die Anzahl der Zeilen in der Datentabelle ist.
Wenn die Datenbank die Abfrage verarbeitet, indem sie erst die Verknüpfung herstellt und dann filtert, kann es zu einer Duplizierung von Daten kommen. Die maximale Anzahl der verarbeiteten Zeilen ist die Anzahl der Benutzer, die berechtigt sind, diese bestimmte Zeile in jeder Zeile in der Datentabelle anzuzeigen.
Im Falle dieses zweiten Szenarios sind die Dinge klarer: Ihre Abfragen dauern lange, Sie erhalten Fehlermeldungen, oder es gibt einen Hinweis auf Leistungsprobleme in der Datenbank. Ihr gesamtes Datenvolumen wird exponentiell erweitert, was zu einer übermäßigen Systembelastung des Backends führen könnte.
Extrakte
Wenn es sich bei der Datenquelle in Tableau um eine Direktverbindung handelt, sendet Tableau jede Abfrage, die zur Darstellung einer bestimmten Visualisierung oder eines bestimmten Dashboards im RDBMS erforderlich ist. Wenn es sich bei der Datenquelle um einen Extrakt handelt, erfolgt der Prozess der Datenabfrage aus der zugrunde liegenden Datenquelle nur bei der Erstellung und Aktualisierung des Extrakts. Alle einzelnen Abfragen nach Visualisierungen werden vom Extraktmodul aus der Extraktdatei beantwortet.
Beim Erstellen einzelner Tabellenextrakte ist dieselbe Reihenfolge vorhanden. Der "Blowup" erfolgt jedoch sowohl auf der zugrunde liegenden Datenquelle als auch innerhalb des resultierenden Extrakts selbst.
Überlegungen zu Extrakten
Ab Tableau 2018.3 kann die Daten-Engine einen Extrakt vom Typ "Mehrere Tabellen" erstellen und RLS kann wie oben beschrieben implementiert werden. Die Verwendung mehrerer Tabellenextrakte reduziert die Zeit, die zum Generieren eines Extrakts mit n:n-Beziehungen benötigt wird, indem die Verknüpfung nicht materialisiert wird.
Der Extrakt sollte mit einem Datenobjekt und einem Berechtigungsobjekterstellt werden. Dies ist der einfachste Speichertyp im Extrakt und führt zur besten Leistung.
- Das Datenobjekt ist die Tabelle, Ansicht oder benutzerdefinierte SQL-Abfrage, die die denormalisierte Kombination der tatsächlichen und der erforderlichen Dimensionstabellen darstellt
- Das Berechtigungsobjekt ist eine denormalisierte Tabelle, Ansicht oder benutzerdefinierte SQL-Abfrage aller Berechtigungen, die erforderlich sind, um die Daten auf der granularsten Ebene zu filtern. Dazu ist Folgendes erforderlich:
- Eine Spalte für den Benutzernamen, die mit den genauen Benutzernamen in Tableau Server oder Tableau Cloud übereinstimmt
- Eine Zeile für jede der granularsten Berechtigungen für das Datenobjekt
Dieses Format wird in der Methode der tiefsten Granularität oben beschrieben. Extrakte vom Typ "Mehrere Tabellen" verwenden dieselbe Methode, wobei die Einschränkung besteht, dass nur zwei Datenobjekte verknüpft werden und eine feldspezifische Filterung bereits innerhalb des Objekts angewendet wird.
Da bei mehreren Tabellenextrakten Extraktfilter deaktiviert sind, können Sie entweder in den Ansichten oder Tabellen filtern, mit denen Sie in der Datenquelle eine Verbindung herstellen, oder die Filter in benutzerdefinierten SQL-Objekten im Tableau-Datenverbindungsdialogfeld definieren.
Hinweis: Wie auch bei Direktverbindungen verhält es sich so, dass das RLS nicht vorhanden ist, wenn die Datenquelle eingebettet ist und ein Benutzer über Berechtigungen zum Bearbeiten oder Herunterladen der Arbeitsmappe verfügt, da die erzwingenden Filter problemlos entfernt werden können. Der Extrakt sollte separat veröffentlicht werden, anstatt in der Arbeitsmappe eingebettet zu bleiben.
Einzelne Tabellenextrakte
Die folgende Methode wird nur empfohlen, wenn eine Tableau-Version vor 2018.3 verwendet wird – falls verfügbar, sind mehrere Tabellenextrakte vorzuziehen.
Einzelne Tabellenextrakte materialisieren alle Verknüpfungen, die beim Erstellen der Tableau-Datenquelle entstehen, und speichern alles als eine einzelne Tabelle über eine Abfrage, deren Ergebnisse in einer einzelnen Tabelle in der Extraktdatei transformiert werden. Diese Denormalisierung birgt das Risiko einer massiven Datenduplizierung, da jede Zeile, die mehr als einer Berechtigung oder einem Benutzer zugewiesen wurde, aufgrund der n:n-Beziehung dupliziert würde.
So verhindern Sie diese Duplizierung:
- Erstellen eines Felds für Sicherheitsbenutzer, das die Benutzernamen für diese Berechtigung enthält
- Ein Beispiel für einen Wert ist "bhowell|mosterheld|rdugger"
- Verwenden Sie die Funktion CONTAINS() in Tableau, um einzelne Benutzer korrekt zu identifizieren.
- Beispiel:
CONTAINS([Security Users Field], USERNAME())
.
- Beispiel:
Bei dieser Methode sind offensichtlich einige Vorbehalte zu erwähnen. Es ist erforderlich, dass Sie von Ihren Berechtigungen in Zeilen zu einer einzelnen Spalte wechseln, die ordnungsgemäß mit SQL getrennt wurde, und diese Spalte kann nur eine bestimmte Anzahl an Zeichen enthalten. Teilübereinstimmungen können zu Problemen führen, und Sie müssen Trennzeichen verwenden, die in den IDs selbst nie gültig sind. Obwohl sie innerhalb der Tableau Data Engine ausgeführt wird, wird diese Methode als Zeichenfolgenberechnung für die meisten Daten-Engines sehr langsam sein. Dies schränkt Ihre Fähigkeit ein, wieder zu einer Direktverbindung zu wechseln.
Alternativ können Sie verschiedene Extrakte pro "Rolle" oder Berechtigungsebene verwenden, so dass nur die Daten im Extrakt enthalten sind, die für die jeweilige Person oder Ebene angemessen sind. Dafür sind jedoch Prozesse erforderlich, um ordnungsgemäß Berechtigungen für Vorlagenveröffentlichungen und die Nutzung dieser Vorlagen in Tableau Server zu ermöglichen, in der Regel über die APIs.
Verwenden der integrierten Sicherheit auf Zeilenebene in einer Datenbank
Viele Datenbanken verfügen über integrierte Mechanismen für RLS. Wenn Ihre Organisation bereits Anstrengungen unternommen hat, um Sicherheit auf Zeilenebene in eine Datenbank zu integrieren, können Sie möglicherweise die Vorteile der vorhandenen RLS nutzen. Im Vergleich mit dem Neuerstellen ist es im Hinblick auf Tableau nicht unbedingt einfacher oder besser, ein integriertes RLS-Modell zu implementieren. Diese Techniken werden in der Regel genutzt, wenn eine Organisation bereits in diese Technologien investiert hat und die Investition bestmöglich ausnutzen möchte. Der Hauptvorteil der Verwendung von integrierter RLS besteht darin, dass die Administratoren ihre Datensicherheitsrichtlinie an einem zentralen Ort implementieren und steuern können: in ihren Datenbanken. Weitere Informationen finden Sie unter Sicherheit auf Zeilenebene in der Datenbank.