Utilizza la sicurezza a livello di riga

Questo documento spiega come utilizzare la sicurezza a livello di riga in BigQuery per limitare l'accesso ai dati a livello di riga della tabella. Prima di leggere questo documento, acquisisci familiarità con una panoramica della sicurezza a livello di riga leggendo Introduzione alla sicurezza a livello di riga di BigQuery.

Con le policy di accesso a livello di riga puoi eseguire le seguenti attività:

Limitazioni

Quando selezioni una tabella nella console Google Cloud , la scheda Anteprima non può mostrare le anteprime delle tabelle con policy di accesso alle righe. Per visualizzare i contenuti della tabella, esegui una query.

Prima di iniziare

Concedi i ruoli IAM (Identity and Access Management) che forniscono agli utenti le autorizzazioni necessarie per eseguire ogni attività in questo documento. Le autorizzazioni necessarie per eseguire un'attività (se presenti) sono elencate nella sezione "Autorizzazioni richieste" dell'attività.

Crea o aggiorna una policy di accesso a livello di riga

Puoi creare o aggiornare una policy di accesso a livello di riga su una tabella in BigQuery con un'istruzione DDL (Data Definition Language).

Autorizzazioni obbligatorie

Per creare una policy di accesso a livello di riga su una tabella BigQuery, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.create
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (sulla tabella di destinazione e su tutte le tabelle di riferimento nelle policy di accesso a livello di riga delle sottoquery concesse)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Per aggiornare una policy di accesso a livello di riga su una tabella BigQuery, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (sulla tabella di destinazione e su tutte le tabelle di riferimento nelle policy di accesso a livello di riga delle sottoquery concesse)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Ognuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per creare e aggiornare una policy di accesso a livello di riga:

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

Il ruolo bigquery.filteredDataViewer

Quando crei una policy di accesso a livello di riga, BigQuery concede automaticamente il ruolo bigquery.filteredDataViewer ai membri dell'elenco dei beneficiari. Quando elenti le policy di accesso a livello di riga di una tabella nella console Google Cloud , questo ruolo viene visualizzato in associazione ai membri dell'elenco dei beneficiari della policy.

Crea o aggiorna le policy di accesso a livello di riga

Quando configuri l'accesso a livello di riga su una tabella, devi disporre di almeno due policy di accesso alle righe:

  • Una policy che concede l'accesso completo alla tabella. La prima policy di accesso alle righe deve concedere l'accesso agli utenti e ai gruppi che richiedono l'accesso completo ai dati della tabella per la manutenzione o l'assistenza dei dati. Ad esempio, i tuoi amministratori BigQuery e i service account che utilizzano istruzioni DML per trasformare i dati delle tabelle.
  • Una seconda policy che filtra l'accesso. Questa policy utilizza filtri basati sulla logica di business per concedere l'accesso a gruppi specifici.

Per creare o aggiornare una policy di accesso a livello di riga, utilizza una delle seguenti istruzioni DDL:

  • CREATE ROW ACCESS POLICY crea una nuova policy di accesso a livello di riga.

  • L'istruzione CREATE ROW ACCESS POLICY IF NOT EXISTS crea una nuova policy di accesso a livello di riga, se non esiste già una policy di accesso a livello di riga con lo stesso nome nella tabella specificata.

  • L'istruzione CREATE OR REPLACE ROW ACCESS POLICY aggiorna una policy di accesso a livello di riga esistente con lo stesso nome nella tabella specificata.

Esempi

Gli esempi seguenti mostrano come creare e aggiornare le policy di accesso alle righe per diversi tipi di identificatori delle entità, tra cui Account Google e identità federate. Per ulteriori informazioni sulle identità federate, consulta Federazione delle identità dei workload.

Crea una nuova policy e concedi l'accesso a un Account Google

Crea una nuova policy di accesso alle righe. L'accesso alla tabella è limitato all'utente abc@example.com. Solo le righe in cui region = 'APAC' sono visibili:

CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');

Crea una nuova policy e concedi l'accesso a una singola identità in un pool di identità della forza lavoro

Crea una nuova policy di accesso alle righe. L'accesso alla tabella è limitato a una singola identità in un pool di identità della forza lavoro utilizzando questo formato: principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTITY. Sono visibili solo le righe in cui region = 'APAC':

CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/abc@example.com')
FILTER USING (region = 'APAC');

Aggiorna una policy per concedere l'accesso a un account di servizio

Aggiorna la policy di accesso apac_filter in modo che venga applicata al account di servizio example@exampleproject.:

CREATE OR REPLACE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('serviceAccount:example@exampleproject.')
FILTER USING (region = 'APAC');

Crea una policy e concedi l'accesso a utenti e gruppi

Crea una policy di accesso alle righe che concede l'accesso a un utente e a due gruppi:

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

Crea una policy e concedi l'accesso alle identità della forza lavoro nei gruppi

Crea una policy di accesso alle righe che conceda l'accesso a tutte le identità della forza lavoro nei gruppi utilizzando questo formato principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTITY:

CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/sales-us@example.com',
          'principal://iam.googleapis.com/locations/global/workforcePools/example-contractors/subject/sales-managers@example.com')
FILTER USING (region = 'US');

Crea una policy e concedi l'accesso a tutti gli utenti autenticati

Crea una policy di accesso alle righe con allAuthenticatedUsers come beneficiari:

CREATE ROW ACCESS POLICY us_filter
ON project.dataset.my_table
GRANT TO ('allAuthenticatedUsers')
FILTER USING (region = 'US');

Crea una policy e un filtro in base all'utente corrente

Crea una policy di accesso alle righe con un filtro basato sull'utente corrente:

CREATE ROW ACCESS POLICY my_row_filter
ON dataset.my_table
GRANT TO ('domain:example.com')
FILTER USING (email = SESSION_USER());

Crea una policy e un filtro su una colonna

Crea una policy di accesso alle righe con un filtro su una colonna con un tipo 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));

Crea una policy e utilizza un confronto delle regioni

Crea una policy di accesso alle righe con una subquery per sostituire più policy con un confronto delle regioni configurato per utente:

Considera la seguente tabella, lookup_table:

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

L'utilizzo della subquery su lookup_table consente di evitare di creare più policy di accesso alle righe. Ad esempio, l'istruzione precedente produce lo stesso risultato della seguente, con meno query:

CREATE OR REPLACE ROW ACCESS POLICY us_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 eu_filter
ON project.dataset.my_table
GRANT TO ('user:xyz@example.com')
FILTER USING (region = 'europe-west1');

Per saperne di più sulla sintassi e sulle opzioni disponibili, consulta il riferimento per l'istruzione DDL CREATE ROW ACCESS POLICY.

Combina le policy di accesso a livello di riga

Se due o più policy di accesso a livello di riga concedono a un utente o a un gruppo l'accesso alla stessa tabella, l'utente o il gruppo ha accesso a tutti i dati coperti da una qualsiasi delle policy. Ad esempio, le seguenti policy concedono all'utente abc@example.com l'accesso alle righe specificate nella tabella 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');

Nell'esempio precedente, l'utente abc@example.com ha accesso alle righe della tabella my_table con il campo product_category impostato su shoes e abc@example.com ha anche accesso alle righe con il campo color impostato su blue. Ad esempio, abc@example.com potrebbe accedere alle righe con informazioni su scarpe rosse e auto blu.

Questo accesso equivale a quello fornito dalla seguente singola policy di accesso a livello di riga:

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

D'altra parte, per specificare l'accesso che dipende da più di una condizione vera, utilizza un filtro con un operatore AND. Ad esempio, la seguente policy di accesso a livello di riga concede l'accesso abc@example.com solo alle righe in cui il campo product_category è impostato su shoes e il campo color è impostato su blue:

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

Con la policy di accesso a livello di riga precedente, abc@example.com potrebbe accedere alle informazioni sulle scarpe blu, ma non su quelle rosse o sulle auto blu.

Elenca le policy di accesso a livello di riga della tabella

Puoi elencare e visualizzare tutte le policy di accesso a livello di riga su una tabella utilizzando la console Google Cloud , lo strumento a riga di comando bq o il metodo API RowAccessPolicies.List.

Autorizzazioni obbligatorie

Per elencare le policy di accesso a livello di riga su una tabella BigQuery, devi disporre dell'autorizzazione IAM bigquery.rowAccessPolicies.list.

Per visualizzare i membri di una policy di accesso a livello di riga su una tabella BigQuery, devi disporre dell'autorizzazione IAM bigquery.rowAccessPolicies.getIamPolicy.

Ognuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per elencare e visualizzare le policy di accesso a livello di riga:

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

Per saperne di più sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Elenca le policy di accesso a livello di riga della tabella

Per elencare le policy di accesso a livello di riga, segui questi passaggi:

Console

  1. Per visualizzare le policy di accesso a livello di riga, vai alla pagina BigQuery nella console Google Cloud .

    Vai a BigQuery

  2. Fai clic sul nome della tabella per aprire il riquadro dei dettagli, quindi fai clic su Altro > Visualizza policy di accesso alle righe.

  3. Quando si apre il riquadro Policy di accesso alle righe, viene visualizzato un elenco di tutte le policy di accesso a livello di riga della tabella, per nome, e il filter_expression per ogni policy.

    Dettagli delle policy di accesso alle righe

  4. Per visualizzare tutti i ruoli e gli utenti interessati da una policy di accesso a livello di riga, fai clic su VISUALIZZA accanto alla policy. Ad esempio, nell'immagine seguente, puoi vedere nel riquadro Visualizza autorizzazioni che i membri dell'elenco dei beneficiari hanno il ruolo bigquery.filteredDataViewer.

    Dettagli delle policy di accesso alle righe

bq

Inserisci il comando bq ls e specifica il flag --row_access_policies. I nomi del set di dati e della tabella sono obbligatori.

    bq ls --row_access_policies dataset.table

Ad esempio, il seguente comando elenca le informazioni sulle policy di accesso a livello di riga su una tabella denominata my_table in un set di dati con l'ID my_dataset:

    bq ls --row_access_policies my_dataset.my_table

API

Utilizza il metodo RowAccessPolicies.List nella sezione di riferimento dell'API REST.

Elimina le policy di accesso a livello di riga

Se disponi delle autorizzazioni necessarie, puoi eliminare una o tutte le policy di accesso a livello di riga di una tabella utilizzando un'istruzione DDL.

Autorizzazioni obbligatorie

Per eliminare una policy di accesso a livello di riga, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.jobs.create (per eseguire il job di query DDL)

Per eliminare contemporaneamente tutte le policy di accesso a livello di riga di una tabella, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.delete
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.rowAccessPolicies.list
  • bigquery.jobs.create (per eseguire il job di query DDL)

Ognuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per eliminare le policy di accesso a livello di riga:

  • roles/bigquery.admin
  • roles/bigquery.dataOwner

Per saperne di più su ruoli e autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Elimina le policy di accesso a livello di riga

Per eliminare una policy di accesso alle righe da una tabella, utilizza le seguenti istruzioni DDL:

  • L'istruzione DROP ROW ACCESS POLICY elimina una policy di accesso a livello di riga nella tabella specificata.

  • L'istruzione DROP ROW ACCESS POLICY IF EXISTS elimina una policy di accesso a livello di riga se la policy di accesso alle righe esiste nella tabella specificata.

  • L'istruzione DROP ALL ROW ACCESS POLICIES elimina tutte le policy di accesso a livello di riga nella tabella specificata.

Esempi

Elimina una policy di accesso a livello di riga da una tabella:

DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;

Elimina tutte le policy di accesso a livello di riga da una tabella:

DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;

Per saperne di più sull'eliminazione di una policy di accesso a livello di riga, consulta il riferimento all'istruzione DDL DROP ROW ACCESS POLICY.

Esegui query sulle tabelle con policy di accesso alle righe

Un utente deve prima avere accesso a una tabella BigQuery per poterla interrogare, anche se si trova nel campo grantee_list di una policy di accesso a livello di riga su quella tabella. Senza questa autorizzazione, la query non va a buon fine e viene visualizzato un errore access denied.

Autorizzazioni obbligatorie

Per eseguire query su una tabella BigQuery con policy di accesso a livello di riga, devi disporre dell'autorizzazione bigquery.tables.getData sulla tabella. Devi anche disporre dell'autorizzazione bigquery.rowAccessPolicies.getFilteredData.

Per ottenere queste autorizzazioni con ruoli predefiniti, devi disporre del ruolo roles/bigquery.dataViewer sulla tabella utilizzando IAM e del ruolo IAM roles/bigquery.filteredDataViewer sulla tabella tramite la policy di accesso a livello di riga.

Devi disporre dell'autorizzazione datacatalog.categories.fineGrainedGet su tutte le colonne pertinenti con sicurezza a livello di colonna. Per ottenere questa autorizzazione con i ruoli predefiniti, devi avere il ruolo datacatalog.categoryFineGrainedReader.

Visualizza i risultati della query

Nella console Google Cloud , quando esegui una query su una tabella con una policy di accesso a livello di riga, BigQuery mostra un banner che indica che i risultati potrebbero essere filtrati in base a una policy di accesso a livello di riga. Questo avviso viene visualizzato anche se fai parte dell'elenco dei beneficiari della policy.

Risultato della query sulla tabella con policy di accesso a livello di riga

Statistiche job

Quando esegui una query su una tabella con una policy di accesso a livello di riga utilizzando l'API Job, BigQuery indica se la query legge tabelle con policy di accesso alle righe nell'oggetto di risposta Job:

Esempio

Questa risposta dell'oggetto Job è stata troncata per semplicità:

{
  "configuration": {
    "jobType": "QUERY",
    "query": {
      "priority": "INTERACTIVE",
      "query": "SELECT * FROM dataset.table",
      "useLegacySql": false
    }
  },
  ...
  "statistics": {
    ...
    rowLevelSecurityStatistics: {
      rowLevelSecurityApplied: true
    },
    ...
  },
  "status": {
    "state": "DONE"
  },
  ...
}

Passaggi successivi