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.

Übersicht

Sie können die folgenden Aufgaben mit Zugriffsrichtlinien auf Zeilenebene ausführen:

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 Zugriffsrichtlinien auf Zeilenebene erfolgreich erstellen, weisen Sie den Mitgliedern der Empfängerliste automatisch die Rolle bigquery.filteredDataViewer zu. Die Rolle bigquery.filteredDataViewer ermöglicht das Aufrufen der Zeilen, die durch den Filterausdruck der Richtlinie definiert sind. 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.

Informationen finden Sie in den empfohlenen Best Practices für die Sicherheit auf Zeilenebene, wenn Sie die Rolle bigquery.filteredDataViewer mit IAM verwenden.

Weitere Informationen zu IAM-Rollen und Berechtigungen in BigQuery finden Sie unter Vordefinierte Rollen und Berechtigungen.

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 Unterabfrage, um mehrere Richtlinien durch einen einfachen Regionsvergleich zu ersetzen, der pro Nutzer konfiguriert ist:

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()));

Bei Verwendung der Unterabfrage für lookup_table können Sie vermeiden, mehrere Zeilenzugriffsrichtlinien zu erstellen. Die obige Anweisung führt beispielsweise zu demselben 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

  1. Öffnen Sie in der Google Cloud Console die Seite „BigQuery“, um Zugriffsrichtlinien auf Zeilenebene aufzurufen.

    BigQuery aufrufen

  2. Klicken Sie auf den Tabellennamen, um die Details aufzurufen, und dann auf Zeilenzugriffsrichtlinien aufrufen.

    Zeilenzugriffsrichtlinien aufrufen

  3. 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.

    Zeilenzugriffsrichtlinien

  4. 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.

    Zeilenzugriffsrichtlinien

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 angegebene

  • Die 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. Zum Erteilen dieser Berechtigung mit vordefinierten Rollen 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.

Abfrageergebnis für Tabelle mit Zugriffsrichtlinie auf Zeilenebene

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