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 sulla sicurezza a livello di riga leggendo l'introduzione alla sicurezza a livello di riga di BigQuery.
Panoramica
Con i criteri di accesso a livello di riga puoi eseguire le seguenti attività:
- Crea o aggiorna un criterio di accesso a livello di riga in una tabella
- Combinare i criteri di accesso a livello di riga in una tabella
- Elencare i criteri di accesso a livello di riga di una tabella
- Eliminare un criterio di accesso a livello di riga da una tabella
- Eseguire query su una tabella con un criterio di accesso a livello di riga
Prima di iniziare
Concedi i ruoli IAM (Identity and Access Management) che concedono agli utenti le autorizzazioni necessarie per eseguire ogni attività nel documento. Le autorizzazioni necessarie 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 in BigQuery con un'istruzione Data Definition Language (DDL).
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 qualsiasi tabella a cui viene fatto riferimento nei criteri di accesso concessi a livello di riga delle sottoquery)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 qualsiasi tabella a cui viene fatto riferimento nei criteri di accesso concessi a livello di riga delle sottoquery)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 correttamente un criterio di accesso a livello di riga, concedi automaticamente il ruolo bigquery.filteredDataViewer
ai membri dell'elenco dei beneficiari. Il ruolo bigquery.filteredDataViewer
concede la possibilità di visualizzare le righe definite dall'espressione di filtro del criterio. Quando elenchi i criteri di accesso a livello di riga di una tabella nella console Google Cloud, questo ruolo viene visualizzato in associazione con i membri dell'elenco dei beneficiari del criterio.
Consulta le best practice consigliate per la sicurezza a livello di riga quando utilizzi il ruolo bigquery.filteredDataViewer
con IAM.
Per ulteriori informazioni sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Autorizzazioni e ruoli predefiniti.
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:
L'elemento
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 in modo che venga applicato 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 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 un criterio di accesso alle righe con allAuthenticatedUsers
come beneficiario:
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 alle righe con una sottoquery per sostituire più criteri con un semplice confronto tra regioni configurato per utente:
Per fornire un feedback o richiedere assistenza con questa funzionalità, invia un'email a 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()));
Se utilizzi la sottoquery su lookup_table
puoi evitare di creare criteri di accesso a più 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 sull'istruzione DDL CREATE ROW ACCESS POLICY
.
Combinare i 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 qualsiasi dei criteri.
Ad esempio, i seguenti criteri concedono all'utente l'accesso abc@example.com
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
il cui campo product_category
è impostato su shoes
e abc@example.com
ha accesso anche alle righe che hanno 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 dai seguenti criteri di accesso a livello di riga singola:
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');
Invece, per specificare l'accesso che dipende dal fatto che più di una condizione sia vera, utilizza un filtro con un operatore AND
. Ad esempio, il seguente criterio di accesso a livello di riga concede l'accesso abc@example.com
solo alle righe che hanno 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 il precedente criterio di accesso a livello di riga, abc@example.com
sarebbe in grado di accedere alle informazioni sulle scarpe blu, ma non 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 su 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 Autorizzazioni e ruoli predefiniti.
Elenca i criteri di accesso a livello di riga della tabella
Per elencare i criteri di accesso a livello di riga:
Console
Per visualizzare i criteri di accesso a livello di riga, vai alla pagina BigQuery nella console Google Cloud.
Fai clic sul nome della tabella per visualizzarne i dettagli, poi fai clic su Visualizza i criteri di accesso alle righe.
Quando si apre il riquadro Criteri di accesso alle righe, viene visualizzato un elenco di tutti i criteri di accesso a livello di riga nella tabella, suddivisi per nome, e il
filter_expression
per ogni criterio.Per vedere 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 puoi vedere nel riquadro Visualizza autorizzazioni che i membri dell'elenco dei beneficiari dispongono del ruolo
bigquery.filteredDataViewer
.
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 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.
Elimina i criteri di accesso a livello di riga
Puoi eliminare uno o tutti i criteri di accesso a livello di riga in una tabella utilizzando un'istruzione DDL, se disponi delle autorizzazioni per farlo.
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 rilasciare contemporaneamente tutti i criteri 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)
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 Autorizzazioni e ruoli predefiniti.
Elimina 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 criterio 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 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 ulteriori informazioni sull'eliminazione di un criterio di accesso a livello di riga, consulta la documentazione di riferimento sull'istruzione DDL DROP ROW ACCESS POLICY
.
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 su grantee_list
di un criterio di accesso alle righe nella tabella. Senza questa autorizzazione, la query non riesce e viene restituito 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 IAM bigquery.tables.getData
e dell'autorizzazione IAM bigquery.rowAccessPolicies.getFilteredData
. Devi
disporre dell'autorizzazione IAM bigquery.tables.getData
su tutte
le tabelle pertinenti.
Per ottenere queste autorizzazioni con i 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 sicurezza a livello di colonna. Per ottenere questa autorizzazione con i ruoli predefiniti, è necessario il ruolo datacatalog.categoryFineGrainedReader
.
Visualizzare i risultati della 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 in base a un criterio di accesso a livello di riga. Questa notifica viene visualizzata anche se fai parte dell'elenco dei beneficiari delle norme.
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 alle righe nell'oggetto risposta Job
:
Esempio
Questa risposta all'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
Per informazioni su come funziona la sicurezza a livello di riga con altre funzionalità e servizi di 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 le best practice per la sicurezza a livello di riga in BigQuery.