Sicherheit auf Zeilenebene verwenden
In diesem Dokument wird erklärt, wie Sie die Sicherheit auf Zeilenebene in BigQuery verwenden, um den Zugriff auf Daten auf Tabellenzeilenebene zu beschränken. Bevor Sie dieses Dokument lesen, sollten Sie sich mit der Übersicht über die Sicherheit auf Zeilenebene vertraut machen. Weitere Informationen dazu finden Sie unter Einführung in die BigQuery-Sicherheit auf Zeilenebene.
Sie können die folgenden Aufgaben mit Zugriffsrichtlinien auf Zeilenebene ausführen:
- Zugriffsrichtlinie auf Zeilenebene für eine Tabelle erstellen oder aktualisieren
- Zugriffsrichtlinien auf Zeilenebene für eine Tabelle kombinieren
- Zugriffsrichtlinien einer Tabelle auf Zeilenebene auflisten
- Zugriffsrichtlinie auf Zeilenebene aus einer Tabelle löschen
- Eine Tabelle mit einer Zugriffsrichtlinie auf Zeilenebene abfragen
Hinweis
Weisen Sie IAM-Rollen (Identity and Access Management) zu, die Nutzern die erforderlichen Berechtigungen zum Ausführen der einzelnen Aufgaben in diesem Dokument gewähren. Die Berechtigungen, die zum Ausführen einer Aufgabe erforderlich sind (sofern zutreffend), werden im Abschnitt „Erforderliche Berechtigungen“ der Aufgabe aufgelistet.
Zugriffsrichtlinie auf Zeilenebene erstellen oder aktualisieren
Sie können eine Zugriffsrichtlinie auf Zeilenebene für eine Tabelle in BigQuery mit einer DDL-Anweisung (Datendefinitionssprache) erstellen oder aktualisieren.
Erforderliche Berechtigungen
Zum Erstellen einer Zugriffsrichtlinie auf Zeilenebene für eine BigQuery-Tabelle benötigen Sie die folgenden IAM-Berechtigungen:
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(für die Zieltabelle und alle referenzierten Tabellen in erteilten Zugriffsrichtlinien auf Zeilenebene für Unterabfragen)bigquery.jobs.create
(um den DDL-Abfragejob auszuführen)
Zum Aktualisieren einer Zugriffsrichtlinie auf Zeilenebene für eine BigQuery-Tabelle benötigen Sie die folgenden IAM-Berechtigungen:
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(für die Zieltabelle und alle referenzierten Tabellen in erteilten Zugriffsrichtlinien auf Zeilenebene für Unterabfragen)bigquery.jobs.create
(um den DDL-Abfragejob auszuführen)
Jede der folgenden vordefinierten IAM-Rollen enthält die Berechtigungen, die Sie zum Erstellen und Aktualisieren von Zugriffsrichtlinien auf Zeilenebene benötigen:
roles/bigquery.admin
roles/bigquery.dataOwner
Die Rolle bigquery.filteredDataViewer
Wenn Sie eine Zugriffsrichtlinie auf Zeilenebene erstellen, ordnet BigQuery den Mitgliedern der Empfängerliste automatisch die Rolle bigquery.filteredDataViewer
zu. Wenn Sie die Zugriffsrichtlinien einer Zeile auf Tabellenebene in der Google Cloud Console auflisten, wird diese Rolle zusammen mit den Mitgliedern der Empfängerliste der Richtlinie angezeigt.
Gewähren Sie die bigquery.filteredDataViewer
nicht manuell mit IAM.
Weitere Informationen finden Sie unter Best Practices für die Sicherheit auf Zeilenebene.
Zugriffsrichtlinien auf Zeilenebene erstellen oder aktualisieren
Verwenden Sie eine der folgenden DDL-Anweisungen, um eine Zugriffsrichtlinie auf Zeilenebene zu erstellen oder zu aktualisieren:
CREATE ROW ACCESS POLICY
erstellt eine neue Zugriffsrichtlinie auf Zeilenebene.CREATE ROW ACCESS POLICY IF NOT EXISTS
erstellt eine neue Zugriffsrichtlinie auf Zeilenebene, wenn in der angegebenen Tabelle noch keine Zugriffsrichtlinie auf Zeilenebene mit demselben Namen vorhanden ist.Mit der
CREATE OR REPLACE ROW ACCESS POLICY
-Anweisung wird eine vorhandene Zugriffsrichtlinie auf Zeilenebene mit demselben Namen in der angegebenen Tabelle aktualisiert.
Beispiele
Erstellen Sie eine neue Zugriffsrichtlinie für Zeilen. Der Zugriff auf die Tabelle ist auf den Nutzer abc@example.com
beschränkt. Nur die Zeilen, in denen region = 'APAC'
sichtbar sind.
CREATE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'APAC');
Aktualisieren Sie die Zugriffsrichtlinie, die stattdessen auf das Dienstkonto example@exampleproject.iam.gserviceaccount.com
angewendet werden soll:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('serviceAccount:example@exampleproject.iam.gserviceaccount.com') FILTER USING (region = 'APAC');
Erstellen Sie eine Zugriffsrichtlinie für Zeilen, die einem Nutzer und zwei Gruppen Zugriff gewährt:
CREATE ROW ACCESS POLICY sales_us_filter ON project.dataset.my_table GRANT TO ('user:john@example.com', 'group:sales-us@example.com', 'group:sales-managers@example.com') FILTER USING (region = 'US');
Erstellen Sie eine Zeilenzugriffsrichtlinie für Zeilen mit allAuthenticatedUsers
als Empfänger:
CREATE ROW ACCESS POLICY us_filter ON project.dataset.my_table GRANT TO ('allAuthenticatedUsers') FILTER USING (region = 'US');
Erstellen Sie eine Zeilenzugriffsrichtlinie mit einem Filter basierend auf dem aktuellen Nutzer:
CREATE ROW ACCESS POLICY my_row_filter ON dataset.my_table GRANT TO ('domain:example.com') FILTER USING (email = SESSION_USER());
Erstellen Sie eine Zeilenzugriffsrichtlinie mit einem Filter für eine Spalte mit dem Typ ARRAY
:
CREATE ROW ACCESS POLICY my_reports_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));
Erstellen Sie eine Zeilenzugriffsrichtlinie mit einer untergeordneten Abfrage, um mehrere Richtlinien durch einen pro Nutzer konfigurierten Regionsvergleich zu ersetzen:
Wenn Sie für dieses Feature Feedback geben oder Support anfordern möchten, senden Sie eine E-Mail an bigquery-row-level-security-support@google.com.Sehen Sie sich die folgende Tabelle lookup_table
an:
+-----------------+--------------+ | email | region | +-----------------+--------------+ | xyz@example.com | europe-west1 | | abc@example.com | us-west1 | | abc@example.com | us-west2 | +-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (region IN ( SELECT region FROM lookup_table WHERE email = SESSION_USER()));
Mit der Unterabfrage in lookup_table
können Sie vermeiden, mehrere Zeilenzugriffsrichtlinien zu erstellen. Die vorherige Anweisung liefert beispielsweise dasselbe Ergebnis wie die folgende, mit weniger Abfragen:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'us-west1'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region IN 'us-west1', 'us-west2'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:xyz@example.com') FILTER USING (region = 'europe-west1');
Weitere Informationen zur Syntax und den verfügbaren Optionen finden Sie in der Referenz zur DDL-Anweisung CREATE ROW ACCESS POLICY
.
Zugriffsrichtlinien auf Zeilenebene kombinieren
Wenn zwei oder mehr Zugriffsrichtlinien auf Zeilenebene einem Nutzer oder einer Gruppe Zugriff auf dieselbe Tabelle gewähren, hat der Nutzer oder die Gruppe Zugriff auf alle Daten, die von einer der Richtlinien abgedeckt werden.
Die folgenden Richtlinien gewähren dem Nutzer beispielsweise abc@example.com
-Zugriff auf bestimmte Zeilen in der Tabelle my_table
:
CREATE ROW ACCESS POLICY shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (color = 'blue');
Im vorherigen Beispiel hat der Nutzer abc@example.com
Zugriff auf die Zeilen in der Tabelle my_table
, in denen das Feld product_category
auf shoes
gesetzt ist, und abc@example.com
hat auch Zugriff auf die Zeilen, für die das Feld color
auf blue
gesetzt ist.
Zum Beispiel könnte abc@example.com
auf Zeilen mit Informationen zu roten Schuhen und blauen Autos zugreifen.
Dieser Zugriff entspricht dem Zugriff, der durch die folgende Zugriffsrichtlinie für einzelne Zeilen bereitgestellt wird:
CREATE ROW ACCESS POLICY shoes_and_blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' OR color = 'blue');
Verwenden Sie dagegen einen Filter mit einem AND
-Operator, um den Zugriff anzugeben, der davon abhängt, dass mehrere Bedingungen erfüllt sind. Die folgenden Zugriffsrichtlinien auf Zeilenebene gewähren beispielsweise abc@example.com
Zugriff auf Zeilen, die sowohl das Feld product_category
festgelegt haben aufshoes
und das Feld color
festgelegt haben aufblue
:
CREATE ROW ACCESS POLICY blue_shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' AND color = 'blue');
Mit der obigen Zugriffsrichtlinie auf Zeilenebene könnte abc@example.com
auf Informationen zu blauen Schuhen zugreifen, jedoch nicht auf rote Schuhe oder blaue Fahrzeuge.
Zugriffsrichtlinien auf Tabellenzeilenebene auflisten
Mit der Google Cloud Console, dem bq-Befehlszeilentool oder der API-Methode RowAccessPolicies.List
können Sie alle Zugriffsrichtlinien auf Zeilenebene für eine Tabelle auflisten und aufrufen.
Erforderliche Berechtigungen
Zum Auflisten von Zugriffsrichtlinien auf Zeilenebene für eine BigQuery-Tabelle benötigen Sie die IAM-Berechtigung bigquery.rowAccessPolicies.list
.
Zur Anzeige der Mitglieder einer Zugriffsrichtlinie auf Zeilenebene für eine BigQuery-Tabelle benötigen Sie die IAM-Berechtigung bigquery.rowAccessPolicies.getIamPolicy
.
Jede der folgenden vordefinierten IAM-Rollen enthält die Berechtigungen, die Sie zum Auflisten und Anzeigen von Zugriffsrichtlinien auf Zeilenebene benötigen:
roles/bigquery.admin
roles/bigquery.dataOwner
Weitere Informationen zu IAM-Rollen und Berechtigungen in BigQuery finden Sie unter Vordefinierte Rollen und Berechtigungen.
Zugriffsrichtlinien auf Tabellenzeilenebene auflisten
So listen Sie Zugriffsrichtlinien auf Zeilenebene auf:
Console
Öffnen Sie in der Google Cloud Console die Seite „BigQuery“, um Zugriffsrichtlinien auf Zeilenebene aufzurufen.
Klicken Sie auf den Tabellennamen, um die Details aufzurufen, und dann auf Zeilenzugriffsrichtlinien aufrufen.
Wenn der Bereich Zeilen-Zugriffsrichtlinien geöffnet wird, sehen Sie eine Liste aller Zugriffsrichtlinien auf Zeilenebene in der Tabelle, nach Namen geordnet, sowie den
filter_expression
für jede Richtlinie.Klicken Sie auf VIEW neben der Richtlinie, um alle von einer Zugriffsrichtlinie auf Zeilenebene betroffenen Rollen und Nutzer anzusehen. In der folgenden Abbildung sehen Sie beispielsweise im Bereich Berechtigungen ansehen, dass Mitglieder der Empfängerliste die Rolle
bigquery.filteredDataViewer
haben.
bq
Geben Sie den Befehl bq ls
mit dem Flag --row_access_policies
ein.
Dataset- und Tabellennamen sind erforderlich.
bq ls --row_access_policies dataset.table
Der folgende Befehl listet beispielsweise Informationen zu Zugriffsrichtlinien auf Zeilenebene für eine Tabelle mit dem Namen my_table
in einem Dataset mit der ID my_dataset
auf:
bq ls --row_access_policies my_dataset.my_table
API
Verwenden Sie die Methode RowAccessPolicies.List
im Referenzabschnitt der REST API.
Zugriffsrichtlinien auf Zeilenebene löschen
Sie können mit einer DDL-Anweisung eine oder alle Zugriffsrichtlinien für Zeilen für eine Tabelle löschen, wenn Sie über die Berechtigungen verfügen.
Erforderliche Berechtigungen
Zum Löschen einer Zugriffsrichtlinie auf Zeilenebene benötigen Sie die folgenden IAM-Berechtigungen:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.jobs.create
(um den DDL-Abfragejob auszuführen)
Wenn Sie alle Zugriffsrichtlinien auf Zeilenebene für eine Tabelle gleichzeitig löschen möchten, benötigen Sie die folgenden IAM-Berechtigungen:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
bigquery.jobs.create
(um den DDL-Abfragejob auszuführen)
Jede der folgenden vordefinierten IAM-Rollen enthält die Berechtigungen, die Sie zum Löschen von Zugriffsrichtlinien auf Zeilenebene benötigen:
roles/bigquery.admin
roles/bigquery.dataOwner
Weitere Informationen zu IAM-Rollen und Berechtigungen in BigQuery finden Sie unter Vordefinierte Rollen und Berechtigungen.
Zugriffsrichtlinien auf Zeilenebene löschen
Verwenden Sie die folgenden DDL-Anweisungen, um eine Zeilenzugriffsrichtlinie aus einer Tabelle zu löschen:
Die Anweisung
DROP ROW ACCESS POLICY
löscht eine Zugriffsrichtlinie auf Zeilenebene für die angegebeneDie
DROP ROW ACCESS POLICY IF EXISTS
-Anweisung löscht eine Zugriffsrichtlinie auf Zeilenebene, wenn die Zeilenzugriffsrichtlinie für die angegebene Tabelle vorhanden ist.Mit der
DROP ALL ROW ACCESS POLICIES
-Anweisung werden alle Zugriffsrichtlinien auf Zeilenebene für die angegebene Tabelle gelöscht.
Beispiele
Löschen Sie eine Zugriffsrichtlinie auf Zeilenebene aus einer Tabelle:
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
Löschen Sie alle Zugriffsrichtlinien auf Zeilenebene aus einer Tabelle:
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
Weitere Informationen zum Löschen einer Zugriffsrichtlinie auf Zeilenebene finden Sie in der Referenz zur DROP ROW ACCESS POLICY
-DDL-Anweisung.
Tabellen mit Zeilenzugriffsrichtlinien abfragen
Ein Nutzer muss zuerst Zugriff auf eine BigQuery-Tabelle haben, um sie abfragen zu können, auch wenn er auf der grantee_list
einer Zeilenzugriffsrichtlinie für diese Tabelle steht. Ohne diese Berechtigung schlägt die Abfrage mit dem Fehler access
denied
fehl.
Erforderliche Berechtigungen
Zum Abfragen einer BigQuery-Tabelle mit Zugriffsrichtlinien auf Zeilenebene benötigen Sie die IAM-Berechtigung bigquery.tables.getData
und die IAM-Berechtigung bigquery.rowAccessPolicies.getFilteredData
. Sie benötigen die IAM-Berechtigung bigquery.tables.getData
für alle relevanten Tabellen.
Zum Erteilen dieser Berechtigungen mit vordefinierten Rollen benötigen Sie die IAM-Rolle roles/bigquery.dataViewer
und roles/bigquery.filteredDataViewer
Rollen.
Sie benötigen die Berechtigung datacatalog.categories.fineGrainedGet
für alle relevanten Spalten mit Sicherheit auf Spaltenebene. Um diese Berechtigung mit vordefinierten Rollen zu erhalten, benötigen Sie die Rolle datacatalog.categoryFineGrainedReader
.
Abfrageergebnisse ansehen
Wenn Sie in der Google Cloud Console eine Tabelle mit einer Zugriffsrichtlinie auf Zeilenebene abfragen, wird in BigQuery ein Bannerhinweis angezeigt, der darauf hinweist, dass die Ergebnisse möglicherweise durch eine Zugriffsrichtlinie auf Zeilenebene gefiltert werden. Dieser Hinweis wird auch dann angezeigt, wenn Sie Mitglied der Empfängerliste für die Richtlinie sind.
Jobstatistiken
Wenn Sie eine Tabelle mit einer Zugriffsrichtlinie auf Zeilenebene mithilfe der Job API abfragen, gibt BigQuery an, ob die Abfrage Tabellen mit Zeilenzugriffsrichtlinien im Antwortobjekt Job
liest:
Beispiel
Der Einfachheit halber wurde die Objektantwort Job
gekürzt:
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
Nächste Schritte
Informationen dazu, wie die Sicherheit auf Zeilenebene mit anderen BigQuery-Features und -Diensten funktioniert, erhalten Sie unter Sicherheit auf Zeilenebene mit anderen BigQuery-Features verwenden.
Weitere Informationen finden Sie unter Best Practices für die Sicherheit auf Zeilenebene in BigQuery.