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, acquisisci familiarità 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à:

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 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 un criterio di accesso a livello di riga su una tabella in BigQuery con un'istruzione DDL (Data Definition Language).

Autorizzazioni obbligatorie

Per creare un criterio 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 subquery concesse)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Per aggiornare un criterio 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 subquery concesse)
  • bigquery.jobs.create (per eseguire il job di query DDL)

Ciascuno 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

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

Creare o aggiornare criteri di accesso a livello di riga

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 un nuovo criterio di accesso a livello di riga se nella tabella specificata non esiste già un criterio di accesso a livello di riga con lo stesso nome.

  • 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

Gli esempi riportati di seguito mostrano come creare e aggiornare le policy di accesso a livello di riga per diversi tipi di identificatori principal, inclusi gli Account Google e le identità federate. Per ulteriori informazioni sulle identità federate, consulta Federazione delle identità per i carichi di lavoro.

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 un criterio per concedere l'accesso a un service account

Aggiorna il criterio di accesso apac_filter in modo che si applichi al service account 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 a livello di riga 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');

Crea un criterio e concedi l'accesso alle identità della forza lavoro nei gruppi

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

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

Crea una norma 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 filtra una colonna

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

Crea una policy e utilizza un confronto tra regioni

Crea un criterio di accesso a livello di riga con una sottoquery per sostituire più criteri 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 consente di evitare la creazione di più policy di accesso a livello di riga. Ad esempio, l'istruzione precedente produce lo stesso risultato della 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 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 il riferimento all'istruzione DDL CREATE ROW ACCESS POLICY.

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 abc@example.com ha accesso anche alle righe in cui 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 dalla seguente policy di accesso a livello di singola 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 policy di accesso a livello di riga della tabella

Puoi elencare e visualizzare tutte le policy 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 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 policy di accesso a livello di riga della tabella

Per elencare le policy di accesso a livello di riga:

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 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 nella 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 fornisci 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 in una tabella denominata my_table in un set di dati con ID my_dataset:

    bq ls --row_access_policies my_dataset.my_table

API

Utilizza il metodo RowAccessPolicies.List nella sezione Riferimento API REST.

Elimina le policy di accesso a livello di riga

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

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

Elimina le policy 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 una policy 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 il criterio di accesso alle righe 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

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 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 una policy di accesso a livello di riga, consulta il riferimento all'istruzione DDL DROP ROW ACCESS POLICY.

Eseguire query sulle tabelle con policy di accesso alle righe

Un utente deve prima avere accesso a una tabella BigQuery per poterla interrogare, anche se è l'grantee_list di un criterio di accesso a livello di riga nella 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 disporre dell'autorizzazione bigquery.tables.getData per la tabella. Devi anche avere l'autorizzazione bigquery.rowAccessPolicies.getFilteredData.

Per ottenere queste autorizzazioni con ruoli predefiniti, devi disporre del ruolo roles/bigquery.dataViewer nella tabella utilizzando IAM e devi disporre del ruolo IAM roles/bigquery.filteredDataViewer nella tabella tramite il criterio 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 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 avviso 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 della norma.

Risultato della query sulla tabella con policy 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 tabelle con criteri di accesso a livello di riga nell'oggetto di risposta Job:

Esempio

Per semplicità, la risposta di questo 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