Controlar o acesso com as condições do IAM

Neste documento, descrevemos como usar as Condições do IAM para controlar o acesso aos recursos do BigQuery.

As condições do IAM permitem conceder acesso aos recursos do BigQuery somente se as condições especificadas forem atendidas. Por exemplo, é possível conceder acesso a um recurso por uma duração limitada ou periodicamente em determinadas horas do dia. As condições do IAM são aceitas no nível do projeto, da pasta e da organização e podem ser aplicadas a conjuntos de dados, tabelas, rotinas e modelos do BigQuery.

As condições do IAM são úteis para conceder permissões do Identity and Access Management (IAM) a muitos recursos relacionados ao mesmo tempo, incluindo recursos que ainda não existem. Para conceder permissões a grupos não relacionados de recursos do BigQuery, use tags do IAM.

Antes de começar

Ative a API IAM e conceda papéis do IAM que dão aos usuários as permissões necessárias para executar cada tarefa neste documento.

Ativar a API IAM

Para ativar a API IAM, selecione uma das seguintes opções:

Console

Acesse a página API Identity and Access Management (IAM) e ative a API.

Ativar a API

gcloud

Execute o gcloud services enable comando:

gcloud services enable iam.googleapis.com

Permissões necessárias

Para receber a permissão necessária para aplicar as Condições do IAM aos recursos do BigQuery, peça ao administrador para conceder a você o papel de Administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin) do IAM. Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esse papel predefinido contém a permissão resourcemanager.projects.setIamPolicy, que é necessária para aplicar condições do IAM aos recursos do BigQuery.

Também é possível conseguir essa permissão com papéis personalizados ou outros papéis predefinidos.

Se você planeja usar condições do IAM em toda a organização, também precisará de permissões para gerenciar as políticas da organização.

Para mais informações sobre os papéis e as permissões do IAM no BigQuery, consulte Introdução ao IAM.

Atributos de condição

É possível definir condições do IAM nos recursos do BigQuery com base nos seguintes atributos:

  • request.time: o momento em que o usuário tenta acessar um recurso do BigQuery. Para mais detalhes e exemplos, consulte Atributo de data/hora.
  • resource.name: o caminho do recurso do BigQuery. Para o formato, consulte as tabelas em Formatos de atributos.
  • resource.type: o tipo do recurso do BigQuery. Para o formato, consulte as tabelas em Formatos de atributos.
  • resource.service: o serviço do Google Cloud que o recurso do BigQuery usa. Para o formato, consulte as tabelas em Formatos de atributos.
  • resource.tags: as tags anexadas ao recurso do BigQuery. As tags são compatíveis apenas com os recursos de tabelas e conjuntos de dados do BigQuery. Para o formato, consulte as tabelas em Formatos de atributos e documentos do IAM.

Formatos de atributos

Ao criar condições para conjuntos de dados do BigQuery, use os seguintes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags É compatível comhasTagKey, hasTagKeyId, matchTag e matchTagId. Para mais informações, consulte Tags de recurso.

Ao criar condições para tabelas do BigQuery, use os seguintes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags É compatível comhasTagKey, hasTagKeyId, matchTag e matchTagId. Para mais informações, consulte Tags de recurso.

Ao criar condições para rotinas do BigQuery, use os seguintes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

Ao criar condições para modelos do BigQuery, use os seguintes formatos:

Atributo Valor
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

Substitua:

  • PROJECT_ID: o ID do projeto que contém os recursos a que você está concedendo acesso.
  • DATASET_ID: o ID do conjunto de dados a que você está concedendo acesso.
  • TABLE_ID: o ID da tabela a que você está concedendo acesso.
  • ROUTINE_ID: o ID da rotina a que você está concedendo acesso.
  • MODEL_ID: o ID do modelo ao qual você está concedendo acesso.

Adicionar condições a um recurso

Para adicionar uma condição a um conjunto de dados, tabela, rotina ou modelo no BigQuery, consulte Permitir políticas com condições. Ao criar suas condições, consulte as tabelas de formato de atributos.

Práticas recomendadas de condições

Ao criar condições no BigQuery, use as seguintes práticas recomendadas:

  • Não use condições negativas para resource.type, resource.name ou resource.service, porque os tipos não compatíveis usam a string vazia e correspondem a quase todas as condições negativas. Para mais detalhes, consulte condições negativas.
  • Inclua resource.type, resource.name e resource.service na sua condição, mesmo quando esse nível de especificidade não for necessário. Essa prática ajuda a manter suas condições à medida que os recursos do fluxo de trabalho mudam para que outros recursos não sejam incluídos acidentalmente no futuro.
  • Ao conceder permissões, inclua o conjunto mais restrito possível para garantir que você não conceda acidentalmente acessos excessivamente permissivos.
  • Tenha cuidado ao usar a frase resource.name.startsWith na condição, porque os caminhos da tabela do BigQuery são prefixados pelo ID do projeto pai e pelo ID do conjunto de dados. Condições que não são específicas o suficiente podem conceder acesso excessivamente permissivo. No entanto, a frase resource.name.startsWith é útil se você quer oferecer aos usuários a capacidade de executar consultas com caracteres curinga. Por exemplo, a condição resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") permite que os usuários executem a consulta SELECT * FROM my_dataset.table_prefix*.
  • Não adicione condições para recursos do BigQuery que não sejam conjuntos de dados, tabelas, rotinas e modelos.
  • Verifique se você está concedendo as permissões corretas no recurso. Por exemplo, a permissão para listar recursos (bigquery.RESOURCE.list) precisa ser concedida no nível pai, mas a permissão para criar recursos (bigquery.RESOURCE.delete) precisa ser concedido no nível do recurso. Exclusão de conjunto de dados, em que todos os recursos contidos também são excluídos, requer permissões de exclusão de tabela, modelo e rotinas no conjunto de dados.
  • Saiba que os snapshots da tabela e a viagem no tempo não afetam as permissões.

Condições negativas

Condições negativas, como resource.name != resource, podem conceder acesso excessivamente permissivo inadvertidamente. Os recursos incompatíveis do BigQuery têm atributos vazios, o que significa que correspondem a todas as condições negativas. Recursos em serviços fora do BigQuery também podem corresponder a condições negativas.

Além disso, condições negativas criam problemas quando os usuários executam consultas com caracteres curinga. Por exemplo, considere a condição negativa resource.name != /projects/my_project/datasets/my_dataset/tables/secret. Essa condição parece conceder acesso a todos os recursos, exceto uma tabela chamada secret. No entanto, o usuário ainda pode consultar essa tabela usando uma consulta de caractere curinga, como SELECT * from my_project.my_dataset.secre*;.

Além disso, condições negativas em tabelas, rotinas e modelos podem fornecer acesso excessivamente permissivo aos conjuntos de dados pais. Os usuários podem, então, excluir esses recursos porque as permissões de exclusão são gerenciadas no nível do conjunto de dados.

Limitações

  • Não é possível adicionar concessões de visualização autorizada, rotina autorizada ou conjunto de dados autorizado com as Condições do IAM.
  • Quando um usuário tem acesso condicional a um conjunto de dados ou uma tabela, ele não pode modificar as permissões desse recurso por meio do console do Google Cloud. Somente a ferramenta bq e a API são compatíveis.
  • O controle de acesso no nível da linha e da coluna não é compatível diretamente com as Condições do IAM. No entanto, um usuário com acesso condicional pode conceder a si mesmo o papel de Administrador do BigQuery (roles/bigquery.admin) na tabela e, em seguida, modificar as políticas de acesso de linha e coluna.
  • As alterações nas políticas do IAM podem levar até cinco minutos para entrar em vigor.
  • Usuários com acesso condicional podem não conseguir consultar as visualizações INFORMATION_SCHEMA.
  • Usuários com acesso apenas a tabelas condicionais não podem executar funções de caractere curinga de tabela.

Exemplos

Veja a seguir exemplos de casos de uso das condições do IAM no BigQuery.

Conceder acesso de leitura a uma tabela específica

Neste exemplo, concedemos a cloudysanfrancisco@gmail.com o papel de Leitor de dados do BigQuery à tabela table_1 no conjunto de dados dataset_1. Com esse papel, o usuário pode consultar a tabela e acessá-la pela ferramenta bq. O usuário não pode ver a tabela no console do Google Cloud porque não tem a permissão bigquery.tables.list no conjunto de dados.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

Conceder acesso de lista a um conjunto de dados específico

Este exemplo concede a cloudysanfrancisco@gmail.com o papel de Leitor de metadados do BigQuery no conjunto de dados dataset_2. Com esse papel, o usuário pode listar todos os recursos no conjunto de dados, mas não pode realizar consultas nesses recursos.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

Conceder acesso de proprietário a todas as tabelas em todos os conjuntos de dados com um prefixo específico

Este exemplo concede a cloudysanfrancisco@gmail.com o papel de proprietário de dados do BigQuery em todas as tabelas em todos os conjuntos de dados que começam com o prefixo public_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

Conceder acesso de proprietário a todas as tabelas, modelos e rotinas em todos os conjuntos de dados que têm um prefixo específico

Neste exemplo, concedemos a cloudysanfrancisco@gmail.com o papel de proprietário de dados do BigQuery em todas as tabelas, modelos e rotinas em todos os conjuntos de dados que começam com o prefixo general_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

A seguir