Use a segurança ao nível da linha
Este documento explica como usar a segurança ao nível da linha no BigQuery para restringir o acesso aos dados ao nível da linha da tabela. Antes de ler este documento, familiarize-se com uma vista geral da segurança ao nível da linha lendo o artigo Introdução à segurança ao nível da linha do BigQuery.
Pode realizar as seguintes tarefas com políticas de acesso ao nível da linha:
- Crie ou atualize uma política de acesso ao nível da linha numa tabela
- Combine políticas de acesso ao nível da linha numa tabela
- Liste as políticas de acesso ao nível da linha de uma tabela
- Elimine uma política de acesso ao nível da linha de uma tabela
- Consultar uma tabela com uma política de acesso ao nível da linha
Limitações
Quando seleciona uma tabela na Trusted Cloud consola, o separador Pré-visualizar não pode mostrar pré-visualizações de tabelas com políticas de acesso ao nível da linha. Para ver o conteúdo da tabela, execute uma consulta.
Antes de começar
Conceda funções de gestão de identidade e acesso (IAM) que dão aos utilizadores as autorizações necessárias para realizar cada tarefa neste documento. As autorizações necessárias para realizar uma tarefa (se existirem) estão listadas na secção "Autorizações necessárias" da tarefa.
Crie ou atualize uma política de acesso ao nível da linha
Pode criar ou atualizar uma política de acesso ao nível da linha numa tabela no BigQuery com uma declaração de linguagem de definição de dados (LDD).
Autorizações necessárias
Para criar uma política de acesso ao nível da linha numa tabela do BigQuery, precisa das seguintes autorizações de IAM:
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(na tabela de destino e em todas as tabelas referenciadas nas políticas de acesso ao nível da linha de subconsulta concedidas)bigquery.jobs.create
(para executar a tarefa de consulta LDD)
Para atualizar uma política de acesso ao nível da linha numa tabela do BigQuery, precisa das seguintes autorizações de IAM:
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(na tabela de destino e em todas as tabelas referenciadas nas políticas de acesso ao nível da linha de subconsulta concedidas)bigquery.jobs.create
(para executar a tarefa de consulta LDD)
Cada uma das seguintes funções de IAM predefinidas inclui as autorizações de que precisa para criar e atualizar uma política de acesso ao nível da linha:
roles/bigquery.admin
roles/bigquery.dataOwner
A função bigquery.filteredDataViewer
Quando cria uma política de acesso ao nível da linha, o BigQuery concede automaticamente a função bigquery.filteredDataViewer
aos membros da lista de beneficiários. Quando lista as políticas de acesso ao nível da linha de uma tabela na consola, esta função é apresentada em associação com os membros da lista de beneficiários da política. Trusted Cloud
Crie ou atualize políticas de acesso ao nível da linha
Para criar ou atualizar uma política de acesso ao nível da linha, use uma das seguintes declarações DDL:
O elemento
CREATE ROW ACCESS POLICY
cria uma nova política de acesso ao nível da linha.A declaração
CREATE ROW ACCESS POLICY IF NOT EXISTS
cria uma nova política de acesso ao nível da linha, se ainda não existir uma política de acesso ao nível da linha com o mesmo nome na tabela especificada.A declaração
CREATE OR REPLACE ROW ACCESS POLICY
atualiza uma política de acesso ao nível da linha existente com o mesmo nome na tabela especificada.
Exemplos
Crie uma nova política de acesso ao nível da linha. O acesso à tabela está restrito ao utilizador abc@example.com
. Apenas as linhas em que region = 'APAC'
são visíveis:
CREATE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'APAC');
Atualize a política de acesso para se aplicar à conta de serviço example@exampleproject.s3ns.iam.gserviceaccount.com
:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('serviceAccount:example@exampleproject.s3ns.iam.gserviceaccount.com') FILTER USING (region = 'APAC');
Crie uma política de acesso ao nível da linha que conceda acesso a um utilizador e a dois grupos:
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');
Crie uma política de acesso ao nível da linha com allAuthenticatedUsers
como beneficiários:
CREATE ROW ACCESS POLICY us_filter ON project.dataset.my_table GRANT TO ('allAuthenticatedUsers') FILTER USING (region = 'US');
Crie uma política de acesso ao nível da linha com um filtro baseado no utilizador atual:
CREATE ROW ACCESS POLICY my_row_filter ON dataset.my_table GRANT TO ('domain:example.com') FILTER USING (email = SESSION_USER());
Crie uma política de acesso ao nível da linha com um filtro numa coluna com um 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));
Crie uma política de acesso ao nível da linha com uma subconsulta para substituir várias políticas por uma comparação de regiões configurada por utilizador:
Considere a seguinte tabela, 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()));
A utilização da subconsulta em lookup_table
permite-lhe evitar a criação de várias políticas de acesso ao nível da linha. Por exemplo, a declaração anterior produz o mesmo resultado que a seguinte, com menos consultas:
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');
Para mais informações sobre a sintaxe e as opções disponíveis, consulte a referência da
CREATE ROW ACCESS POLICY
declaração DDL.
Combine políticas de acesso ao nível da linha
Se duas ou mais políticas de acesso ao nível da linha concederem a um utilizador ou a um grupo acesso à mesma tabela, o utilizador ou o grupo tem acesso a todos os dados abrangidos por qualquer uma das políticas.
Por exemplo, as seguintes políticas concedem ao utilizador
abc@example.com
acesso a linhas especificadas na tabela 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');
No exemplo anterior, o utilizador abc@example.com
tem acesso às linhas
na tabela my_table
que têm o campo product_category
definido como shoes
, e abc@example.com
também tem acesso às linhas que têm o campo color
definido como blue
.
Por exemplo, abc@example.com
poderia aceder a linhas com informações
sobre sapatos vermelhos e carros azuis.
Este acesso é equivalente ao acesso fornecido pela seguinte política de acesso ao nível da linha única:
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');
Por outro lado, para especificar o acesso que depende de mais do que uma condição ser verdadeira, use um filtro com um operador AND
. Por exemplo, a seguinte política de acesso ao nível da linha
concede acesso abc@example.com
apenas a linhas que tenham o campo product_category
definido como shoes
e o campo color
definido como 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');
Com a política de acesso ao nível da linha anterior, abc@example.com
poderia aceder a informações sobre sapatos azuis, mas não sobre sapatos vermelhos ou carros azuis.
Indique políticas de acesso ao nível da linha da tabela
Pode listar e ver todas as políticas de acesso ao nível da linha numa tabela
através da Trusted Cloud consola, da ferramenta de linhas de comando bq ou do método da API RowAccessPolicies.List
.
Autorizações necessárias
Para listar as políticas de acesso ao nível da linha numa tabela do BigQuery, precisa da autorização de IAM bigquery.rowAccessPolicies.list
.
Para ver os membros de uma política de acesso ao nível da linha numa tabela do BigQuery, precisa da autorização de IAM.bigquery.rowAccessPolicies.getIamPolicy
Cada uma das seguintes funções de IAM predefinidas inclui as autorizações de que precisa para listar e ver políticas de acesso ao nível da linha:
roles/bigquery.admin
roles/bigquery.dataOwner
Para mais informações acerca das funções e autorizações do IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.
Indique políticas de acesso ao nível da linha da tabela
Para listar as políticas de acesso ao nível da linha, faça o seguinte:
Consola
Para ver as políticas de acesso ao nível da linha, aceda à página do BigQuery na Trusted Cloud consola.
Clique no nome da tabela para ver os respetivos detalhes e, de seguida, clique em Ver políticas de acesso ao nível da linha.
Quando o painel Políticas de acesso ao nível da linha é aberto, é apresentada uma lista de todas as políticas de acesso ao nível da linha na tabela, por nome, e o
filter_expression
para cada política.Para ver todas as funções e utilizadores afetados por uma política de acesso ao nível da linha, clique em VER junto à política. Por exemplo, na imagem seguinte, pode ver no painel Ver autorizações que os membros da lista de beneficiários têm a função
bigquery.filteredDataViewer
.
bq
Introduza o comando bq ls
e forneça a flag --row_access_policies
.
Os nomes do conjunto de dados e da tabela são obrigatórios.
bq ls --row_access_policies dataset.table
Por exemplo, o comando seguinte apresenta informações sobre as políticas de acesso ao nível da linha numa tabela denominada my_table
num conjunto de dados com o ID my_dataset
:
bq ls --row_access_policies my_dataset.my_table
API
Use o
método RowAccessPolicies.List
na secção de referência da API REST.
Elimine políticas de acesso ao nível da linha
Pode eliminar uma ou todas as políticas de acesso ao nível da linha numa tabela através de uma declaração LDD, se tiver as autorizações para o fazer.
Autorizações necessárias
Para eliminar uma política de acesso ao nível da linha, precisa das seguintes autorizações do IAM:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.jobs.create
(para executar a tarefa de consulta LDD)
Para eliminar todas as políticas de acesso ao nível da linha numa tabela em simultâneo, precisa das seguintes autorizações de IAM:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
bigquery.jobs.create
(para executar a tarefa de consulta LDD)
Cada uma das seguintes funções de IAM predefinidas inclui as autorizações de que precisa para eliminar políticas de acesso ao nível da linha:
roles/bigquery.admin
roles/bigquery.dataOwner
Para mais informações acerca das funções e autorizações do IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.
Elimine políticas de acesso ao nível da linha
Para eliminar uma política de acesso ao nível da linha de uma tabela, use as seguintes declarações LDD:
A declaração
DROP ROW ACCESS POLICY
elimina uma política de acesso ao nível da linha na tabela especificada.A declaração
DROP ROW ACCESS POLICY IF EXISTS
elimina uma política de acesso ao nível da linha se a política de acesso à linha existir na tabela especificada.A declaração
DROP ALL ROW ACCESS POLICIES
elimina todas as políticas de acesso ao nível da linha na tabela especificada.
Exemplos
Elimine uma política de acesso ao nível da linha de uma tabela:
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
Elimine todas as políticas de acesso ao nível da linha de uma tabela:
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
Para mais informações sobre a eliminação de uma política de acesso ao nível da linha, consulte a referência da
DROP ROW ACCESS POLICY
declaração DDL.
Consultar tabelas com políticas de acesso ao nível da linha
Um utilizador tem de ter primeiro acesso a uma tabela do BigQuery para poder consultá-la, mesmo que esteja no grantee_list
de uma política de acesso ao nível da linha nessa tabela. Sem essa autorização, a consulta falha com um erro access
denied
.
Autorizações necessárias
Para consultar uma tabela do BigQuery com políticas de acesso ao nível da linha, tem de ter a autorização bigquery.tables.getData
na tabela. Também precisa da autorização bigquery.rowAccessPolicies.getFilteredData
.
Para obter estas autorizações com funções predefinidas, tem de lhe ser atribuída a função
roles/bigquery.dataViewer
na tabela através do IAM, e tem de lhe ser atribuída a função
roles/bigquery.filteredDataViewer
do IAM na tabela através da política de acesso ao nível da linha.
Tem de ter a autorização datacatalog.categories.fineGrainedGet
em todas as colunas relevantes com segurança ao nível da coluna. Para obter esta autorização
com funções predefinidas, precisa da função datacatalog.categoryFineGrainedReader
.
Veja os resultados da consulta
Na Trusted Cloud consola, quando consulta uma tabela com uma política de acesso ao nível da linha, o BigQuery apresenta um aviso em faixa a indicar que os seus resultados podem ser filtrados por uma política de acesso ao nível da linha. Este aviso é apresentado mesmo que seja membro da lista de beneficiários da política.
Estatísticas de tarefas
Quando consulta uma tabela com uma política de acesso ao nível da linha através da API Jobs, o BigQuery indica se a consulta lê tabelas com políticas de acesso às linhas no objeto de resposta Job
:
Exemplo
Esta resposta de objeto Job
foi truncada para simplificar:
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
O que se segue?
Para obter informações sobre como a segurança ao nível da linha funciona com outras funcionalidades e serviços do BigQuery, consulte o artigo Usar a segurança ao nível da linha com outras funcionalidades do BigQuery.
Para informações sobre as práticas recomendadas para a segurança ao nível da linha, consulte o artigo Práticas recomendadas para a segurança ao nível da linha no BigQuery.