Utilizzare 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, consulta la panoramica della sicurezza a livello di riga in Introduzione alla sicurezza a livello di riga di BigQuery.

Puoi eseguire le seguenti attività con le policy di accesso a livello di riga:

Limitazioni

Quando selezioni una tabella nella Google Cloud console, la Anteprima scheda 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 Identity and Access Management (IAM) che forniscono agli utenti le autorizzazioni necessarie per eseguire ogni attività descritta in questo documento. Le autorizzazioni richieste per eseguire un'attività (se presenti) sono elencate nella sezione "Autorizzazioni richieste" dell'attività.

Creare o aggiornare 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 del linguaggio di definizione dei dati (DDL).

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 (nella tabella di destinazione e in tutte le tabelle a cui viene fatto 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 (nella tabella di destinazione e in tutte le tabelle a cui viene fatto 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 elenchi le policy di accesso a livello di riga di una tabella nella console, questo ruolo viene visualizzato in associazione ai membri dell'elenco dei beneficiari della policy. Google Cloud

Creare o aggiornare le policy di accesso a livello di riga

Quando configuri l'accesso a livello di riga a una tabella, avrai bisogno 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, gli amministratori di BigQuery e i service account che utilizzano le 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:

  • L'istruzione 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 nella tabella specificata non esiste già una policy di accesso a livello di riga con lo stesso nome.

  • 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 principali inclusi gli Account Google e le identità federate. Per saperne di più sulle identità federate, consulta Federazione delle identità per i workload.

Creare una nuova policy e concedere l'accesso a un Account Google

Crea una nuova policy di accesso alle righe. L'accesso alla tabella è limitato all'utente abc@example.com. Sono visibili 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');

Creare una nuova policy e concedere 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' sono visibili:

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

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

Aggiorna la policy di accesso apac_filter in modo che si applichi al account di servizio example@exampleproject.iam.gserviceaccount.com:

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

Creare una policy e concedere l'accesso a utenti e gruppi

Crea una policy di accesso alle righe che conceda 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');

Creare una policy e concedere 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');

Creare una policy e concedere 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');

Creare una policy e filtrare 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());

Creare una policy e filtrare una colonna

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

Creare una policy e utilizzare un confronto tra regioni

Crea una policy di accesso alle righe con una sottoquery per sostituire più policy con un confronto tra 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 sottoquery su lookup_table ti 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 CREATE ROW ACCESS POLICY riferimento all'istruzione DDL.

Combinare 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 in cui il campo product_category è impostato su shoes e ha anche accesso alle righe in cui il campo color è impostato su blue.abc@example.com Ad esempio, abc@example.com potrebbe accedere alle righe con informazioni su scarpe rosse e auto blu.

Questo accesso è equivalente all'accesso 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 dalla veridicità di più condizioni, utilizza un filtro con un operatore AND. Ad esempio, la seguente policy di accesso a livello di riga concede a abc@example.com l'accesso 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 sulle scarpe rosse o sulle auto blu.

Elencare le policy di accesso a livello di riga delle tabelle

Puoi elencare e visualizzare tutte le policy di accesso a livello di riga su una tabella utilizzando la Google Cloud console, 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.

Elencare le policy di accesso a livello di riga delle tabelle

Per elencare le policy di accesso a livello di riga:

Console

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

    Vai a BigQuery

  2. Fai clic sul nome della tabella per visualizzarne i dettagli, quindi fai clic su Visualizza policy di accesso alle righe.

    Visualizza criteri 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 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 bigquery.filteredDataViewer ruolo.

    Dettagli delle policy di accesso alle righe

bq

Inserisci il comando bq ls e fornisci il flag --row_access_policies. Sono obbligatori i nomi del set di dati e della tabella.

    bq ls --row_access_policies dataset.table

Ad esempio, il seguente comando elenca le informazioni sulle policy di accesso a livello di riga di 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 RowAccessPolicies.List metodo nella sezione di riferimento dell'API REST.

Eliminare le policy di accesso a livello di riga

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

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 su 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ù sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Eliminare 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 alle righe se 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 DROP ROW ACCESS POLICY riferimento all'istruzione DDL.

Eseguire query sulle tabelle con policy di accesso alle righe

Un utente deve prima avere accesso a una tabella BigQuery per poter eseguire query su di essa, anche se si trova nell'elenco grantee_list di una policy di accesso alle righe su quella tabella. Senza questa autorizzazione, la query non riesce 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 i ruoli predefiniti, devi disporre del roles/bigquery.dataViewer sulla tabella utilizzando IAM e del 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 la sicurezza a livello di colonna. Per ottenere questa autorizzazione con i ruoli predefiniti, devi disporre del ruolo datacatalog.categoryFineGrainedReader.

Visualizzare i risultati delle query

Nella Google Cloud console, quando esegui una query su una tabella con una policy di accesso a livello di riga, BigQuery visualizza un banner che indica che i risultati potrebbero essere filtrati da una policy di accesso a livello di riga. Questa notifica viene visualizzata anche se sei un membro 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 le tabelle con policy di accesso alle righe nell'oggetto di risposta Job:

Esempio

Questo oggetto di risposta Job è stato troncato per semplicità:

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

Passaggi successivi