Business Intelligence/26. Juni 2023 -Aktualisiert am 17. Januar 2024

Row-Level-Security mit Google BigQuery

Tabelle mit Haken und Schloss

Im Arbeitsalltag werden Berichte zwischen einer Vielzahl von Personen geteilt. Dabei muss sichergestellt werden, dass jeder auch nur die Inhalte zu sehen bekommt, für die er oder sie auch die entsprechende Berechtigung besitzt. Das betrifft Betriebsgeheimnisse, aber auch sensible Daten wie Umsatzzahlen. Erschwerend kommt hinzu, dass Berichte auch an Stakeholder geschickt werden, die man bei der Vergabe der Zugriffsrechte meist gar nicht berücksichtigen kann. Es ist also nicht einfach, die Kontrolle über die eigenen Daten zu behalten.

Von File-Level-Security zu Row-Level-Access

In vielen Online-Services, etwa bei Google Sheets, kann bei einer Datei genau bestimmt werden, wer auf die Inhalte zugreifen bzw. sie verändern darf. Die Nutzung wird dabei an einen spezifischen Account gebunden. Diese Maßnahme hilft aber nicht, wenn die Inhalte von den berechtigten Personen in irgendeiner Form geteilt bzw. weiterverbreitet werden (etwa als Screenshot, oder sollte die Datei heruntergeladen werden).

Innerhalb des Services sind die Daten jedoch weitgehend „sicher“, da nur berechtigte Interessengruppen mit ihnen arbeiten können.

Eine weitere Herausforderung entsteht dann, wenn nicht alle berechtigten Personen, auch alle Daten sehen dürfen sollen. Ein Service wie Google Sheets kommt dabei an seine Grenzen. Um einen differenzierten Zugriff zu ermöglichen, können natürlich Bruchteile der Daten in weitere Dokumente ausgelagert werden. Dies mag für ein kleineres Unternehmen die einfachste und auch schnellste Lösung sein, dieses Vorgehen ist jedoch bei größeren Unternehmen – oder bei unzähligen Dateien – nicht praktikabel.

Row-Level-Access mit SESSION_USER()

Redundante Daten und ein hoher administrativer Aufwand lassen sich mit einem Dienst wie GoogleBigQuery vermeiden. Wenn man sich bereits im Google-Ökosystem befindet, ist dies nur ein kleiner Schritt. Sheets lassen sich mit ein paar Klicks in BigQuery einbinden. Aufgrund der „Live“-Verbindung sind sie auch stets aktuell. In BigQuery können wir die Rechte nun granular vergeben, indem wir uns die Möglichkeit des Row-Level-Access zunutze machen.

Voraussetzung dieses Vorgehens ist es, über ein Google-Konto zu verfügen, da die Rechte an die Email-Adresse des Kontos geknüpft werden. In BigQuery können wir dann auf die Funktion SESSION_USER() zurückgreifen, die uns jene Email-Adresse als Zeichenkette zurückgibt. Wenn ein Unternehmen beispielsweise in mehreren Ländern vertreten ist und Personen nur auf Daten aus ihren jeweiligen Ländern zugreifen können sollen, dann können wir dies mithilfe einer „Access View“ bereitstellen.

Beispiel einer Access-View
Bild zeigt die Zugriffs Logik auf Tabellen mit Views

Schauen wir uns das folgende Beispiel zur Verdeutlichung an. In unserem Data-Warehouse haben wir eine Tabelle sales, die unsere weltweiten Umsätze beinhaltet. Zudem besitzen wir eine Fakten-Tabelle countries_employees, in der unsere Mitarbeiter pro Land hinterlegt sind. Mit dieser Tabelle können wir uns nun eine „Access View“ für unsere MitarbeiterInnen im Unternehmen erstellen, die jedoch nur die länderspezifischen Daten zurückgibt, aus dem die MitarbeiterIn stammt:

1WITH cte_access AS ( 
2  SELECT 
3    country 
4  FROM `countries_employees` 
5  WHERE user = SESSION_USER() 
6) 
7SELECT 
8  s.* 
9FROM cte_access AS a 
10LEFT JOIN `sales` AS s 
11  ON a.country = s.country
mysql