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à:
- Crea o aggiorna una policy di accesso a livello di riga in una tabella
- Combinare policy di accesso a livello di riga in una tabella
- Elencare le policy di accesso a livello di riga di una tabella
- Eliminare un criterio 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 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.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 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.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 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.adminroles/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 POLICYcrea una nuova policy di accesso a livello di riga.L'istruzione
CREATE ROW ACCESS POLICY IF NOT EXISTScrea 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 POLICYaggiorna 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.adminroles/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
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, 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 nella tabella, per nome, e il
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 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 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.deletebigquery.rowAccessPolicies.setIamPolicybigquery.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.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.
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 POLICYelimina una policy di accesso a livello di riga nella tabella specificata.L'istruzione
DROP ROW ACCESS POLICY IF EXISTSelimina 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 POLICIESelimina 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.
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
Per informazioni su come funziona la sicurezza a livello di riga con altri servizi e funzionalità BigQuery, consulta Utilizzo della sicurezza a livello di riga con altre funzionalità 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.