Controle o acesso com as condições da IAM

Este documento descreve como usar as condições do IAM para controlar o acesso aos recursos do BigQuery.

As condições de IAM permitem-lhe conceder acesso a recursos do BigQuery apenas se forem cumpridas as condições especificadas. Por exemplo, pode conceder acesso a um recurso durante um período limitado ou periodicamente durante determinadas horas do dia. Pode adicionar condições do IAM aos níveis de organização, pasta, projeto e conjunto de dados dos recursos. As políticas com condições são herdadas pelos recursos subordinados. Para mais informações sobre os níveis de recursos, consulte as hierarquias de recursos.

As condições da IAM são úteis para conceder autorizações de acesso à Identity and Access Management (IAM) a muitos recursos relacionados em simultâneo, incluindo recursos que ainda não existem. Para conceder autorizações a grupos não relacionados de recursos do BigQuery, considere usar etiquetas de IAM.

Antes de começar

  1. Conceda funções de IAM aos utilizadores que contenham as autorizações necessárias para realizar cada tarefa neste documento.
  2. Ative a API IAM.

Funções necessárias

Para receber as autorizações de que precisa para aplicar condições de IAM a recursos do BigQuery, peça ao seu administrador que lhe conceda as seguintes funções de IAM:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para aplicar condições de IAM a recursos do BigQuery. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

As seguintes autorizações são necessárias para aplicar condições de IAM a recursos do BigQuery:

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

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Se planeia usar as condições do IAM na sua organização, também precisa de autorizações para gerir políticas da organização.

Para mais informações acerca das funções e autorizações do IAM no BigQuery, consulte o artigo Introdução ao IAM.

Ative a API IAM

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

Consola

Aceda à página da API Identity and Access Management (IAM) e ative a API.

Ative a API

gcloud

Execute o comando gcloud services enable:

gcloud services enable iam.googleapis.com

Veja a política de acesso condicional num conjunto de dados

Selecione uma das seguintes opções:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

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

  3. Clique em Partilha > Autorizações.

  4. Junto à função associada, clique em condição:TITLE para ver a condição dessa função.

bq

Para ver ou atualizar políticas de acesso condicional no Cloud Shell, tem de usar a versão 503.0.0 ou posterior do Cloud Shell.

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

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

Substitua o seguinte:

  • PROJECT_ID: o ID do seu projeto
  • DATASET: o nome do seu conjunto de dados
  • PATH_TO_FILE: o caminho para o ficheiro JSON no seu computador local

A propriedade access no ficheiro JSON do recurso dataset contém a política de acesso.

API

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

Modifique o acesso condicional aos recursos

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

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

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

Adicione acesso condicional ao conjunto de dados

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

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

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

  3. No painel de detalhes, clique em Partilha > Autorizações.

  4. Clique em Adicionar diretor.

  5. No campo Novos membros, introduza um membro.

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

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

  8. Adicione condições ao campo condition através dos atributos de condição.

  9. No painel Adicionar condição de IAM, clique em Guardar.

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

bq

Para ver ou atualizar políticas de acesso condicional no Cloud Shell, tem de usar a versão 503.0.0 ou posterior do Cloud Shell.

Para conceder acesso condicional a um conjunto de dados através do Cloud Shell, siga as direções para conceder acesso a um conjunto de dados. Pode adicionar as condições de acesso condicional à secção access do ficheiro JSON do conjunto de dados.

Por exemplo, a seguinte adição à secção access de um ficheiro JSON de um conjunto de dados concederia a função 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 através da API BigQuery, siga as instruções para conceder acesso a um conjunto de dados com accessPolicyVersion=3 no parâmetro de pedido.

Pode adicionar entradas com condições de acesso à propriedade access.condition do recurso dataset.

Para conjuntos de dados que tenham políticas de acesso condicional, os utilizadores podem atualizar as definições de acesso incondicional através dos fluxos de leitura, modificação e atualização padrão sem especificar o parâmetro de pedido accessPolicyVersion.

Remova o acesso condicional de conjuntos de dados

Para remover condições de um conjunto de dados, selecione um dos seguintes métodos. Quando criar as suas condições, consulte as tabelas de formatos de atributos.

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

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

  3. No painel de detalhes, clique em Partilha > Autorizações.

  4. Selecione o principal cujo acesso quer revogar.

  5. Clique em Eliminar.

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

bq

Para ver ou atualizar políticas de acesso condicional no Cloud Shell, tem de usar a versão 503.0.0 ou posterior do Cloud Shell.

Para remover o acesso condicional a um conjunto de dados através do Cloud Shell, siga as direções em Revogue o acesso a um conjunto de dados. Pode remover a entrada com a condição da secção access do ficheiro JSON do conjunto de dados.

API

Para revogar o acesso condicional a um conjunto de dados através da API BigQuery, siga as instruções para revogar o acesso a um conjunto de dados com accessPolicyVersion=3 no parâmetro de pedido.

Pode remover entradas com condições da propriedade access do recurso dataset.

Para conjuntos de dados que tenham políticas de acesso condicional, os utilizadores podem atualizar as definições de acesso incondicional através dos fluxos de leitura, modificação e atualização padrão sem especificar o parâmetro de pedido accessPolicyVersion.

Atributos de condição

Pode definir condições de IAM nos seus recursos do BigQuery, com base nos seguintes atributos:

  • request.time: a hora em que o utilizador tenta aceder a um recurso do BigQuery. Para mais detalhes e exemplos, consulte o 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 de 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 etiquetas anexadas ao recurso do BigQuery. As etiquetas só são suportadas em recursos de conjuntos de dados, tabelas e vistas do BigQuery. Para o formato, consulte as tabelas em Formatos de atributos e nos documentos do IAM.

Formatos de atributos

Quando cria 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 Suporta hasTagKey, hasTagKeyId, matchTag e matchTagId. Para mais informações, consulte o artigo Etiquetas de recursos.

Quando cria condições para tabelas e vistas 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 Suporta hasTagKey, hasTagKeyId, matchTag e matchTagId. Para mais informações, consulte o artigo Etiquetas de recursos.

Quando cria 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

Quando cria 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 o seguinte:

  • PROJECT_ID: o ID do projeto que contém os recursos aos quais está a conceder acesso
  • DATASET_ID: o ID do conjunto de dados ao qual está a conceder acesso
  • TABLE_ID: o ID da tabela ou da vista à qual está a conceder acesso
  • ROUTINE_ID: o ID da rotina à qual está a conceder acesso
  • MODEL_ID: o ID do modelo ao qual está a conceder acesso

Práticas recomendadas para as condições

Quando cria condições no BigQuery, use as seguintes práticas recomendadas:

  • Recomendamos que use condições positivas para resource.type, resource.name e resource.service para maior precisão. Uma vez que os tipos não suportados são representados por uma string vazia, as condições negativas podem corresponder a uma vasta gama de recursos. Para mais informações, consulte as condições negativas.
  • As condições da IAM ao nível do conjunto de dados só devem ser usadas para funções que se aplicam a recursos no conjunto de dados, como tabelas, vistas, modelos e rotinas. Não devem ser usados para conceder funções que operam ao 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 ao nível do conjunto de dados, porque não tem efeito na autorização. Este atributo destina-se a controlar o acesso a recursos de subconjuntos de dados, como tabelas, vistas, 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. Esta prática ajuda a manter as suas condições à medida que os recursos no seu fluxo de trabalho mudam, para que outros recursos não sejam incluídos involuntariamente no futuro.
  • Ao conceder autorizações, inclua o conjunto de autorizações mais restrito possível para garantir que não concede inadvertidamente um acesso excessivamente permissivo.
  • Use resource.name.startsWith com cuidado. Os caminhos das tabelas e das vistas do BigQuery têm como prefixo o ID do projeto principal e o ID do conjunto de dados. As condições insuficientemente específicas podem conceder demasiado acesso. No entanto, pode usar o atributo resource.name.startsWith para permitir que os utilizadores executem consultas com carateres universais em tabelas. Por exemplo, o acesso concedido através da condição resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") permite que os utilizadores 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, vistas, rotinas e modelos.
  • Verifique se está a conceder as autorizações corretas no recurso correto. Por exemplo, a autorização para listar recursos (bigquery.RESOURCE.list) tem de ser concedida ao nível principal, mas a autorização para eliminar recursos (bigquery.RESOURCE.delete) tem de ser concedida ao nível do recurso. A eliminação do conjunto de dados, em que todos os recursos contidos também são eliminados, requer autorizações de eliminação de tabelas, modelos e rotinas no conjunto de dados.
  • Tenha em atenção que as capturas instantâneas de tabelas e a viagem no tempo não têm qualquer efeito nas autorizações.

Condições negativas

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

Além disso, as condições negativas criam problemas quando os utilizadores executam consultas com carateres universais. Por exemplo, considere a condição negativa resource.name != /projects/my_project/datasets/my_dataset/tables/secret. Esta condição parece conceder acesso a todos os recursos, exceto a uma tabela denominada secret. No entanto, o utilizador continua a poder consultar essa tabela através de uma consulta com carateres universais, como SELECT * from my_project.my_dataset.secre*;.

Além disso, as condições negativas em tabelas, rotinas e modelos podem conceder acesso excessivamente permissivo aos respetivos conjuntos de dados principais. Os utilizadores podem, então, eliminar esses recursos, uma vez que as autorizações de eliminação são geridas ao nível do conjunto de dados.

Limitações

  • Não pode adicionar concessões de vista autorizada, rotina autorizada ou conjunto de dados autorizado com condições de IAM.
  • Se for usado um accessPolicyVersion incompatível ao ver um recurso com condições, as associações podem conter withcond seguido de um valor hash. Para mais informações, consulte o artigo Resolução de problemas de withcond em políticas e associações de funções.
  • Os utilizadores com acesso condicional a um conjunto de dados ou a uma tabela não podem modificar as autorizações desse recurso através da Google Cloud consola. As modificações de autorizações só são suportadas através da ferramenta bq e da API BigQuery.
  • O controlo de acesso ao nível da linha e da coluna não é suportado diretamente através das condições do IAM. No entanto, um utilizador com acesso condicional pode conceder a si próprio a função de administrador do BigQuery (roles/bigquery.admin) na tabela e, em seguida, modificar as políticas de acesso a linhas e colunas.
  • As alterações às políticas de IAM podem demorar até cinco minutos a entrar em vigor.
  • Os utilizadores com acesso condicional podem não conseguir consultar as visualizações de INFORMATION_SCHEMA.
  • Os utilizadores com acesso apenas a tabelas condicionais não podem executar funções de carateres universais de tabelas.

Exemplos

Seguem-se exemplos de utilizações das condições da IAM no BigQuery.

Conceda acesso de leitura a uma tabela específica

Este exemplo concede a cloudysanfrancisco@gmail.com a função de visualizador de dados do BigQuery para a tabela table_1 no conjunto de dados dataset_1. Com esta função, o utilizador pode consultar a tabela e aceder à mesma através da ferramenta bq. O utilizador não consegue ver a tabela na Google Cloud consola porque não tem a autorizaçã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
  }
}

Conceda acesso à lista a um conjunto de dados específico

Este exemplo concede à conta cloudysanfrancisco@gmail.com a função de leitor de metadados do BigQuery no conjunto de dados dataset_2. Com esta função, o utilizador pode listar todos os recursos no conjunto de dados, mas não pode executar 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 a função de proprietário de dados do BigQuery em todas as tabelas de 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 tenham um prefixo específico

Este exemplo concede a cloudysanfrancisco@gmail.com a função 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
  }
}

O que se segue?