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. É possível adicionar condições do IAM nos níveis de recursos da organização, pasta, projeto e conjunto de dados. As políticas de permissão com condições são herdadas por recursos filhos. Para mais informações sobre os níveis de recursos, consulte Hierarquias de recursos.

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

  1. Atribua aos usuários papéis do IAM que contenham as permissões necessárias para realizar cada tarefa neste documento.
  2. Ative a API IAM.

Funções exigidas

Para receber as permissões necessárias para aplicar as Condições do IAM aos recursos do BigQuery, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esses papéis predefinidos contêm as permissões necessárias para aplicar condições do IAM aos recursos do BigQuery. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para aplicar as condições do IAM aos recursos do BigQuery:

  • Defina o acesso condicional do IAM no nível do projeto: resourcemanager.projects.setIamPolicy
  • Defina o acesso condicional do IAM em conjuntos de dados:
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

Essas permissões também podem ser concedidas com funções personalizadas 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.

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 comando gcloud services enable:

gcloud services enable iam.googleapis.com

Conferir a política de acesso condicional em um conjunto de dados

Selecione uma das seguintes opções:

Console

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorer, expanda o projeto e selecione um conjunto de dados.

  3. Clique em Compartilhamento > Permissões.

  4. Ao lado da função associada, clique em condição:TITLE para conferir a condição dessa função.

bq

Para visualizar ou atualizar políticas de acesso condicional no Cloud Shell, é necessário usar a versão 503.0.0 ou mais recente do Cloud Shell.

Para receber uma política de acesso atual e enviá-la para um arquivo local em JSON, use o comando bq show no Cloud Shell:

bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE

Substitua:

  • PROJECT_ID: ID do projeto
  • DATASET: o nome do conjunto de dados
  • PATH_TO_FILE: o caminho para o arquivo JSON na máquina local.

A propriedade access no arquivo JSON do recurso de conjunto de dados contém a política de acesso.

API

Para conferir a política de acesso de um conjunto de dados com condições, chame datasets.get com accessPolicyVersion=3 como um parâmetro de solicitação. A propriedade access no recurso do conjunto de dados contém a política de acesso.

Modificar o acesso condicional a recursos

As seções a seguir descrevem como adicionar ou remover o acesso condicional a diferentes recursos.

Adicionar condições a uma organização, pasta ou projeto

Para adicionar acesso condicional a uma organização, pasta ou projeto no BigQuery, consulte Permitir políticas com condições. Ao criar suas condições, consulte as tabelas de formato de atributos.

Adicionar acesso condicional ao conjunto de dados

Para adicionar condições a um conjunto de dados, selecione um dos métodos a seguir. Ao criar suas condições, consulte as tabelas de formato de atributos.

Console

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorer, expanda o projeto e selecione um conjunto de dados.

  3. No painel de detalhes, clique em Compartilhamento > Permissões.

  4. Clique em Adicionar principal.

  5. No campo Novos principais, digite um principal..

  6. Na lista Selecionar papel, escolha uma função predefinida ou personalizada..

  7. Clique em Adicionar condição do IAM.

  8. Adicione condições ao campo condition usando os atributos de condição.

  9. No painel Adicionar condição do IAM, clique em Salvar.

  10. No painel Conceder acesso a DATASET, clique em Salvar.

bq

Para visualizar ou atualizar políticas de acesso condicional no Cloud Shell, é necessário usar a versão 503.0.0 ou mais recente do Cloud Shell.

Para conceder acesso condicional a um conjunto de dados usando o Cloud Shell, siga as instruções para conceder acesso a um conjunto de dados. É possível adicionar as condições de acesso condicional à seção access do arquivo JSON do conjunto de dados.

Por exemplo, a seguinte adição à seção access do arquivo JSON de um conjunto de dados concede o papel roles/bigquery.dataViewer a cloudysanfrancisco@gmail.com até 31 de dezembro de 2032:

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

Para conceder acesso condicional a um conjunto de dados usando a API BigQuery, siga as instruções para conceder acesso a um conjunto de dados com accessPolicyVersion=3 no parâmetro de solicitação.

É possível adicionar entradas com condições de acesso à propriedade access.condition do recurso do conjunto de dados.

Para conjuntos de dados com políticas de acesso condicional, os usuários podem atualizar as configurações de acesso incondicional usando os fluxos de leitura, modificação e atualização padrão sem especificar o parâmetro de solicitação accessPolicyVersion.

Remover o acesso condicional de conjuntos de dados

Para remover condições de um conjunto de dados, selecione um dos métodos a seguir. Ao criar suas condições, consulte as tabelas de formato de atributos.

Console

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorer, expanda o projeto e selecione um conjunto de dados.

  3. No painel de detalhes, clique em Compartilhamento > Permissões.

  4. Selecione o principal cujo acesso você quer revogar.

  5. Clique em Excluir.

  6. Na caixa de diálogo Excluir principal?, clique em Excluir.

bq

Para visualizar ou atualizar políticas de acesso condicional no Cloud Shell, é necessário usar a versão 503.0.0 ou mais recente do Cloud Shell.

Para remover o acesso condicional a um conjunto de dados usando o Cloud Shell, siga as instruções em Revogar o acesso a um conjunto de dados. Remova a entrada com a condição da seção access do arquivo JSON do conjunto de dados.

API

Para revogar o acesso condicional a um conjunto de dados usando a API BigQuery, siga as instruções para revogar o acesso a um conjunto de dados com accessPolicyVersion=3 no parâmetro de solicitação.

É possível remover entradas com condições da propriedade access do recurso do conjunto de dados.

Para conjuntos de dados com políticas de acesso condicional, os usuários podem atualizar as configurações de acesso incondicional usando os fluxos de leitura, modificação e atualização padrão sem especificar o parâmetro de solicitação accessPolicyVersion.

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 Google Cloud serviço 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, visualizações 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 e visualizações 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 ou visualização 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.

Práticas recomendadas de condições

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

  • Recomendamos o uso de condições positivas para resource.type, resource.name e resource.service para maior precisão. Como os tipos sem suporte são representados por uma string vazia, as condições negativas podem corresponder a uma ampla gama de recursos. Para mais informações, consulte condições negativas.
  • As condições do IAM no nível do conjunto de dados só devem ser usadas para papéis que se aplicam a recursos no conjunto de dados, como tabelas, visualizações, modelos e rotinas. Elas não podem ser usadas para conceder papéis que operam no nível do conjunto de dados ou do projeto, como bigquery.user ou bigquery.jobUser.
  • Não use a condição resource.type == 'bigquery.googleapis.com/Dataset' para políticas no nível do conjunto de dados, porque ela não tem efeito na autorização. Esse atributo tem como objetivo controlar o acesso a recursos de subconjuntos de dados, como tabelas, visualizações, rotinas e modelos.
  • 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.
  • Use resource.name.startsWith com cuidado. Os caminhos da tabela e da visualização do BigQuery são prefixados pelo ID do projeto pai e do conjunto de dados. Condições insuficientemente específicas podem conceder acesso excessivo. No entanto, é possível usar o atributo resource.name.startsWith para permitir que os usuários executem consultas com caracteres curinga em tabelas. Por exemplo, o acesso concedido usando 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, visualizações, 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.
  • Se um accessPolicyVersion incompatível for usado ao visualizar um recurso com condições, as vinculações poderão conter withcond seguido por um valor de hash. Para mais informações, consulte Solução de problemas de withcond em políticas e vinculações de função.
  • Os usuários com acesso condicional a um conjunto de dados ou uma tabela não podem modificar as permissões para esse recurso no console do Google Cloud. As modificações de permissão são compatíveis apenas com a ferramenta bq e a API BigQuery.
  • 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