Wenn Sie ein Multi-Tenant-Dashboard auf einer OAuth-fähigen BI-Plattform betreiben und den Zugriff auf Tabellenzeilen pro Nutzer oder Gruppe steuern möchten, ist die Row-Level-Security-Funktion in BigQuery genau das Richtige.

Klassischerweise hat man den Zugriff auf bestimmte Zeilen eingeschränkt, indem man der Tabelle zusätzliche Spalten spendiert hat, die festhalten, wer Zugriff bekommt, und diese per JOIN mit einer Hilfstabelle der jeweiligen Nutzer bzw. Gruppen abgeglichen hat. Zum Beispiel:
SELECT
t.*
FROM `project.dataset.table` AS t
JOIN `project.dataset.users` AS u ON t.access=u.name;
Auf den ersten Blick ganz einfach, oder? Allerdings bedeutet die Pflege dieser Nutzertabelle Zusatzaufwand, sobald Einträge hinzukommen oder wegfallen. Genau das lässt sich mit der in BigQuery verfügbaren Row-Level-Funktion vermeiden. Sie können Berechtigungen jetzt direkt über Google-Gruppen vergeben und so die Verwaltung vereinheitlichen. Zum Beispiel:
CREATE OR REPLACE ROW ACCESS POLICY policy_<customer_id>
ON `project.dataset.table`
GRANT TO ('group:<customer_id>@<domain>')
FILTER USING (customer_id = '<customer_id>');
Statt mit gemeinsamen Zugangsdaten über einen einzelnen Service Account zu arbeiten, können Sie zudem die Autorisierung des Nutzers per OAuth nutzen. So erhalten Sie deutlich feingranularere Zugriffe (Sicherheit und Auditing), Kontrolle über Quotas sowie Nutzungsdaten, mit denen Sie Ihr Produkt fundiert weiterentwickeln können.
Und ich gehe davon aus, dass Sie sorgfältig vorgehen und Ihre Entscheidungen auf Basis belastbarer Fakten treffen.
Die Herausforderung
Wenn Sie im Zuge Ihres Wachstums mehr als 100 Kunden betreuen, stößt dieser Ansatz an seine Grenzen, denn BigQuery zieht hier eine harte Obergrenze (glauben Sie mir und sparen Sie sich die Zeit, Google um eine Anhebung zu bitten). Davon abgesehen: Über 100 Regeln für eine einzige Tabelle anzulegen klingt ohnehin schräg, oder?
Und was, wenn Sie eine Admin-Gruppe brauchen, deren Mitglieder tatsächlich Zugriff auf sämtliche Daten haben sollen? Auch dieser Fall kann knifflig werden.
Wie lässt sich diese Herausforderung lösen?
Der folgende Ansatz filtert den Zugriff anhand des Domain-Namens des Nutzers. Der Vorteil: Sie müssen keine neuen Gruppen anlegen und deren Mitgliedschaften pflegen. Gleichzeitig sorgt er dafür, dass Ihre interne Gruppe uneingeschränkten Zugriff auf die Daten erhält – und das mit lediglich zwei Row-Level-Policies.
Der klare Nachteil: Ihre Kunden müssen eine Unternehmens-Domain nutzen, damit das Verfahren zuverlässig funktioniert. Für generische Domains wie gmail.com, yahoo.com oder hotmail.com ist diese Lösung nicht geeignet, da Sie damit Millionen von Nutzern Zugriff gewähren würden.
-- Create a table
CREATE TABLE test.my_table (
id INT,
name STRING,
domain STRING);
-- Insert some values
INSERT INTO test.my_table (id, name, domain) VALUES
(1, 'test1', 'example.com'),
(2, 'test2', 'domain.com');
-- Restrict access to the users based on their domain name
CREATE OR REPLACE ROW ACCESS POLICY restrict_per_domain
ON `test.my_table`
GRANT TO ('allAuthenticatedUsers')
FILTER USING (domain = SUBSTR(SESSION_USER(),STRPOS(SESSION_USER(),'@')+1));
-- Grant access to an internal DoiT group
CREATE OR REPLACE ROW ACCESS POLICY grant_internal_group
ON `test.my_table`
GRANT TO ('group:<internal_group>@<domain>')
FILTER USING (1=1);
Das Ergebnis:
1. [email protected] gehört zur Gruppe allAuthenticatedUsers und sieht nur eine einzige Zeile, während
2. [email protected], Mitglied der Gruppe [email protected], alle Zeilen sehen kann.
Kurz gesagt: Permissive Row-Level-Policies stechen restriktivere aus (analog zur Vererbung von IAM-Berechtigungen), und auch wenn Google das nicht explizit dokumentiert, lassen sich Gruppen wie allAuthenticatedUsers einsetzen.
Fazit: Sie haben gesehen, wie Sie Row-Level Security in Kombination mit einem OAuth-fähigen BI-Tool voll ausschöpfen. So behalten Sie die Kontrolle darüber, was, wann und von wem ausgeführt wird – bei spürbar weniger Wartungsaufwand. Probieren Sie es aus!
Bleiben Sie mit uns in Kontakt – im DoiT Engineering Blog , auf dem DoiT LinkedIn-Kanal und auf dem DoiT Twitter-Kanal . Aktuelle Karrieremöglichkeiten finden Sie unter https://careers.doit-intl.com .