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:
- Creare o aggiornare una policy di accesso a livello di riga su una tabella
- Combinare le policy di accesso a livello di riga su una tabella
- Elencare le policy di accesso a livello di riga di una tabella
- Eliminare una policy di accesso a livello di riga da una tabella
- Eseguire una query su una tabella con una 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.createbigquery.rowAccessPolicies.setIamPolicybigquery.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.updatebigquery.rowAccessPolicies.setIamPolicybigquery.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.adminroles/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 POLICYcrea una nuova policy di accesso a livello di riga.L'istruzione
CREATE ROW ACCESS POLICY IF NOT EXISTScrea 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 POLICYaggiorna 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.adminroles/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
Per visualizzare le policy di accesso a livello di riga, vai alla pagina BigQuery nella Google Cloud console.
Fai clic sul nome della tabella per visualizzarne i dettagli, quindi fai clic su Visualizza policy di accesso alle righe.
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_expressionper ogni policy.
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.filteredDataViewerruolo.
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.deletebigquery.rowAccessPolicies.setIamPolicybigquery.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.deletebigquery.rowAccessPolicies.setIamPolicybigquery.rowAccessPolicies.listbigquery.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.adminroles/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 POLICYelimina una policy di accesso a livello di riga nella tabella specificata.L'istruzione
DROP ROW ACCESS POLICY IF EXISTSelimina una policy di accesso alle righe se esiste nella tabella specificata.L'istruzione
DROP ALL ROW ACCESS POLICIESelimina 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.
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
Per informazioni su come funziona la sicurezza a livello di riga con altre funzionalità e altri servizi BigQuery, consulta Utilizzare la sicurezza a livello di riga con altre funzionalità di BigQuery.
Per informazioni sulle best practice per la sicurezza a livello di riga, consulta Best practice per la sicurezza a livello di riga in BigQuery.