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:

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

  1. Para ver as políticas de acesso ao nível da linha, aceda à página do BigQuery na Trusted Cloud consola.

    Aceda ao BigQuery

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

    Veja as políticas de acesso ao nível da linha

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

    Detalhes das políticas de acesso ao nível da linha

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

    Detalhes das políticas de acesso ao nível da linha

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.

Consultar resultado na tabela com política de acesso ao nível da linha

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?