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, familiarizzati con una panoramica della sicurezza a livello di riga leggendo Introduzione alla sicurezza a livello di riga di BigQuery.

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

Prima di iniziare

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

Creare o aggiornare un criterio di accesso a livello di riga

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

Autorizzazioni obbligatorie

Per creare un criterio di accesso a livello di riga in una tabella BigQuery, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.create
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (nella tabella di destinazione e in eventuali tabelle a cui si fa riferimento nei criteri di accesso a livello di riga delle sottoquery concessi)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Per aggiornare un criterio di accesso a livello di riga in una tabella BigQuery, devi disporre delle seguenti autorizzazioni IAM:

  • bigquery.rowAccessPolicies.update
  • bigquery.rowAccessPolicies.setIamPolicy
  • bigquery.tables.getData (nella tabella di destinazione e in eventuali tabelle a cui si fa riferimento nei criteri di accesso a livello di riga delle sottoquery concessi)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per creare e aggiornare un criterio di accesso a livello di riga:

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

Il ruolo bigquery.filteredDataViewer

Quando crei un criterio di accesso a livello di riga, BigQuery concede automaticamente il ruolo bigquery.filteredDataViewer ai membri dell'elenco dei beneficiari. Quando elenchi i criteri 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 del criterio.

Non concedere manualmente il ruolo bigquery.filteredDataViewer con IAM. Per ulteriori informazioni, consulta le best practice per la sicurezza a livello di riga.

Creare o aggiornare i criteri di accesso a livello di riga

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

  • CREATE ROW ACCESS POLICY crea un nuovo criterio di accesso a livello di riga.

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

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

Esempi

Crea un nuovo criterio 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');

Aggiorna il criterio di accesso da applicare all'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');

Crea un criterio di accesso riga 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 un criterio di accesso riga con allAuthenticatedUsers come concessori:

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

Crea un criterio 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 un criterio 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 un criterio di accesso riga con una sottoquery per sostituire più criteri con un confronto delle regioni configurato per utente:

Per fornire un feedback o richiedere assistenza per questa funzionalità, invia un'email all'indirizzo bigquery-row-level-security-support@google.com.

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 consente di evitare di creare più criteri di accesso alle righe. Ad esempio, l'istruzione precedente restituisce lo stesso risultato del seguente, con meno query:

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

Per ulteriori informazioni sulla sintassi e sulle opzioni disponibili, consulta la documentazione di riferimento relativa all'istruzione DDL CREATE ROW ACCESS POLICY.

Combinare criteri di accesso a livello di riga

Se due o più criteri di accesso a livello di riga concedono a un utente o a un gruppo l'accesso alla stessa tabella, l'utente o il gruppo avrà accesso a tutti i dati coperti da uno dei criteri. Ad esempio, i seguenti criteri concedono all'utenteabc@example.com l'accesso a righe specifiche 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 nella tabella my_table per le quali il campo product_category è impostato su shoes e abc@example.com ha accesso anche alle righe per le quali 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 è equivalente a quello fornito dal seguente singolo criterio 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 dal verificarsi di più condizioni, utilizza un filtro con un operatore AND. Ad esempio, il seguente criterio di accesso a livello di riga grants abc@example.com access only to rows that have both the product_category field set to shoes and the color field set to 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 il criterio di accesso a livello di riga precedente, abc@example.com potrebbe accedere alle informazioni sulle scarpe blu, ma non a quelle sulle scarpe rosse o sulle auto blu.

Elenca i criteri di accesso a livello di riga della tabella

Puoi elencare e visualizzare tutti i criteri di accesso a livello di riga in una tabella utilizzando la console Google Cloud, lo strumento a riga di comando bq o il metodo dell'API RowAccessPolicies.List.

Autorizzazioni obbligatorie

Per elencare i criteri di accesso a livello di riga in una tabella BigQuery, devi disporre dell'autorizzazione IAM bigquery.rowAccessPolicies.list.

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

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per elencare e visualizzare i criteri di accesso a livello di riga:

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

Per ulteriori informazioni sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Elenca i criteri di accesso a livello di riga della tabella

Per elencare i criteri di accesso a livello di riga, segui questi passaggi:

Console

  1. Per visualizzare i criteri 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 visualizzarne i dettagli, quindi su Visualizza policy di accesso alle righe.

    Visualizza criteri di accesso alle righe

  3. Quando si apre il riquadro Criteri di accesso alle righe, viene visualizzato un elenco di tutti i criteri di accesso a livello di riga della tabella, per nome, e il filter_expression per ogni criterio.

    Dettagli dei criteri di accesso alle righe

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

    Dettagli dei criteri 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 sui criteri di accesso a livello di riga in 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.

Eliminare i criteri di accesso a livello di riga

Se disponi delle autorizzazioni necessarie, puoi eliminare uno o tutti i criteri di accesso a livello di riga in una tabella utilizzando un'istruzione DDL.

Autorizzazioni obbligatorie

Per eliminare un criterio 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 tutti i criteri 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)

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per eliminare i criteri di accesso a livello di riga:

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

Per ulteriori informazioni sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Eliminare i criteri di accesso a livello di riga

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

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

  • L'istruzione DROP ROW ACCESS POLICY IF EXISTS elimina un criterio di accesso a livello di riga se questo esiste nella tabella specificata.

  • L'istruzione DROP ALL ROW ACCESS POLICIES elimina tutti i criteri di accesso a livello di riga nella tabella specificata.

Esempi

Per eliminare un criterio di accesso a livello di riga da una tabella:

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

Elimina tutti i criteri 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 un criterio di accesso a livello di riga, consulta la documentazione relativa all'istruzione DDL DROP ROW ACCESS POLICY.

Esegui query sulle tabelle con criteri di accesso alle righe

Un utente deve prima avere accesso a una tabella BigQuery per poter eseguire query, anche se si trova nel gruppo grantee_list di un criterio di accesso a riga per 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 criteri di accesso a livello di riga, devi avere l'autorizzazione IAM bigquery.tables.getData e l'autorizzazione IAM bigquery.rowAccessPolicies.getFilteredData. Devi disporre dell'autorizzazione IAM bigquery.tables.getData per tutte le tabelle pertinenti.

Per ottenere queste autorizzazioni con ruoli predefiniti, devi disporre dei ruoli IAM roles/bigquery.dataViewer e roles/bigquery.filteredDataViewer.

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 console Google Cloud, quando esegui una query su una tabella con un criterio di accesso a livello di riga, BigQuery mostra un banner che indica che i risultati potrebbero essere filtrati da un criterio di accesso a livello di riga. Questo avviso viene visualizzato anche se fai parte dell'elenco dei beneficiari del criterio.

Risultato della query nella tabella con criterio di accesso a livello di riga

Statistiche job

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

Esempio

Per semplicità, questa risposta dell'oggetto Job è stata troncata:

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

Passaggi successivi