Controle o acesso aos recursos com a IAM

Este documento descreve como ver, conceder e revogar controlos de acesso para conjuntos de dados do BigQuery e para os recursos nos conjuntos de dados: tabelas, vistas e rotinas. Embora os modelos também sejam recursos ao nível do conjunto de dados, não pode conceder acesso a modelos individuais através de funções de IAM.

Pode conceder acesso a Google Cloud recursos através de políticas de autorização, também conhecidas como políticas de gestão de identidade e de acesso (IAM), que são anexadas a recursos. Só pode anexar uma política de autorização a cada recurso. A política de autorização controla o acesso ao próprio recurso, bem como a todos os descendentes desse recurso que herdam a política de autorização.

Para mais informações sobre as políticas de autorização, consulte a secção Estrutura das políticas na documentação da IAM.

Este documento pressupõe familiaridade com a gestão de identidade e de acesso (IAM) no Google Cloud.

Limitações

  • As listas de controlo de acesso (ACLs) de rotina não estão incluídas nas rotinas replicadas.
  • As rotinas em conjuntos de dados externos ou associados não suportam controlos de acesso.
  • As tabelas em conjuntos de dados externos ou associados não suportam controlos de acesso.
  • Não é possível definir controlos de acesso de rotina com o Terraform.
  • Não é possível definir controlos de acesso de rotina com o SDK Cloud da Google.
  • Não é possível definir controlos de acesso de rotina através da linguagem de controlo de dados (DCL) do BigQuery.
  • O catálogo de dados não suporta controlos de acesso de rotina. Se um utilizador tiver concedido condicionalmente acesso ao nível da rotina, não vê as respetivas rotinas no painel lateral do BigQuery. Como solução alternativa, conceda acesso ao nível do conjunto de dados.
  • A vista INFORMATION_SCHEMA.OBJECT_PRIVILEGES não mostra os controlos de acesso para rotinas.

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.

Funções necessárias

Para obter as autorizações de que precisa para modificar as políticas de IAM para recursos, peça ao seu administrador que lhe conceda a função de IAM proprietário de dados do BigQuery (roles/bigquery.dataOwner) no projeto. 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.

Esta função predefinida contém as autorizações necessárias para modificar as políticas de IAM para recursos. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para modificar as políticas de IAM para recursos:

  • Para obter a política de acesso de um conjunto de dados: bigquery.datasets.get
  • Para definir a política de acesso de um conjunto de dados: bigquery.datasets.update
  • Para obter a política de acesso de um conjunto de dados (Google Cloud apenas na consola): bigquery.datasets.getIamPolicy
  • Para definir a política de acesso de um conjunto de dados (apenas na consola): bigquery.datasets.setIamPolicy
  • Para obter a política de uma tabela ou de uma vista: bigquery.tables.getIamPolicy
  • Para definir uma política de tabela ou vista: bigquery.tables.setIamPolicy
  • Para obter a política de acesso de uma rotina: bigquery.routines.getIamPolicy
  • Para definir a política de acesso de uma rotina: bigquery.routines.setIamPolicy
  • Para criar a ferramenta bq ou tarefas SQL do BigQuery (opcional): bigquery.jobs.create

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

Trabalhe com controlos de acesso ao conjunto de dados

Pode conceder acesso a um conjunto de dados atribuindo a um principal do IAM uma função predefinida ou personalizada que determina o que o principal pode fazer com o conjunto de dados. Isto também é conhecido como anexar uma política de autorização a um recurso. Depois de conceder acesso, pode ver os controlos de acesso do conjunto de dados e revogar o acesso ao conjunto de dados.

Conceda acesso a um conjunto de dados

Não pode conceder acesso a um conjunto de dados quando o cria através da IU Web do BigQuery ou da ferramenta de linha de comandos bq. Primeiro, tem de criar o conjunto de dados e, em seguida, conceder-lhe acesso. A API permite-lhe conceder acesso durante a criação do conjunto de dados chamando o métododatasets.insert com um recurso de conjunto de dados definido.

Um projeto é o recurso principal de um conjunto de dados, e um conjunto de dados é o recurso principal de tabelas e vistas, rotinas e modelos. Quando atribui uma função ao nível do projeto, a função e as respetivas autorizações são herdadas pelo conjunto de dados e pelos recursos do conjunto de dados. Da mesma forma, quando concede uma função ao nível do conjunto de dados, a função e as respetivas autorizações são herdadas pelos recursos no conjunto de dados.

Pode conceder acesso a um conjunto de dados concedendo uma autorização de função de IAM para aceder ao conjunto de dados ou concedendo acesso condicionalmente através de uma condição de IAM. Para mais informações sobre a concessão de acesso condicional, consulte o artigo Controle o acesso com as condições da IAM.

Para conceder a uma função do IAM acesso a um conjunto de dados sem usar condições, selecione uma das seguintes opções:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

  2. No painel esquerdo, clique em Explorador:

    Botão realçado para o painel do explorador.

    Se não vir o painel do lado esquerdo, clique em Expandir painel do lado esquerdo para o abrir.

  3. No painel Explorador, expanda o seu projeto, clique em Conjuntos de dados e, de seguida, selecione um conjunto de dados.

  4. Clique em Partilha > Autorizações.

  5. Clique em Adicionar responsável.

  6. No campo Novos diretores, introduza um diretor.

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

  8. Clique em Guardar.

  9. Para regressar às informações do conjunto de dados, clique em Fechar.

SQL

Para conceder aos principais acesso a conjuntos de dados, use a GRANT declaração DCL:

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    Substitua o seguinte:

    • ROLE_LIST: uma função ou uma lista de funções separadas por vírgulas que quer conceder
    • RESOURCE_NAME: o nome do conjunto de dados ao qual está a conceder acesso
    • USER_LIST: uma lista de utilizadores separada por vírgulas aos quais a função é concedida

      Para ver uma lista de formatos válidos, consulte user_list.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

O exemplo seguinte concede a função de visualizador de dados do BigQuery a myDataset:

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para escrever as informações do conjunto de dados existente (incluindo os controlos de acesso) num ficheiro JSON, use o comando bq show:

    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
  3. Faça alterações à secção access do ficheiro JSON. Pode adicionar a qualquer uma das entradas specialGroup: projectOwners, projectWriters, projectReaders e allAuthenticatedUsers. Também pode adicionar qualquer um dos seguintes elementos: userByEmail, groupByEmail e domain.

    Por exemplo, a secção access de um ficheiro JSON de um conjunto de dados teria o seguinte aspeto:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
  4. Quando as edições estiverem concluídas, use o comando bq update e inclua o ficheiro JSON com a flag --source. Se o conjunto de dados estiver num projeto que não seja o seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

      bq update 
    --source PATH_TO_FILE
    PROJECT_ID:DATASET

  5. Para validar as alterações ao controlo de acesso, use novamente o comando bq show sem escrever as informações num ficheiro:

    bq show --format=prettyjson PROJECT_ID:DATASET
  6. Terraform

    Use os recursos google_bigquery_dataset_iam para atualizar o acesso a um conjunto de dados.

    Defina a política de acesso para um conjunto de dados

    O exemplo seguinte mostra como usar o recurso google_bigquery_dataset_iam_policy para definir a política de IAM para o conjunto de dados mydataset. Esta ação substitui qualquer política existente já anexada ao conjunto de dados:

    # This file sets the IAM policy for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    data "google_iam_policy" "iam_policy" {
      binding {
        role = "roles/bigquery.admin"
        members = [
          "user:user@example.com",
        ]
      }
      binding {
        role = "roles/bigquery.dataOwner"
        members = [
          "group:data.admin@example.com",
        ]
      }
      binding {
        role = "roles/bigquery.dataEditor"
        members = [
          "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com",
        ]
      }
    }
    
    resource "google_bigquery_dataset_iam_policy" "dataset_iam_policy" {
      dataset_id  = google_bigquery_dataset.default.dataset_id
      policy_data = data.google_iam_policy.iam_policy.policy_data
    }

    Defina a associação de funções para um conjunto de dados

    O exemplo seguinte mostra como usar o recurso google_bigquery_dataset_iam_binding para definir a associação a uma determinada função para o conjunto de dados mydataset. Esta ação substitui qualquer registo de membro existente nessa função. Outras funções na política IAM para o conjunto de dados são preservadas:

    # This file sets membership in an IAM role for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    resource "google_bigquery_dataset_iam_binding" "dataset_iam_binding" {
      dataset_id = google_bigquery_dataset.default.dataset_id
      role       = "roles/bigquery.jobUser"
    
      members = [
        "user:user@example.com",
        "group:group@example.com"
      ]
    }

    Defina a associação de funções para um único principal

    O exemplo seguinte mostra como usar o recurso google_bigquery_dataset_iam_member para atualizar a política de IAM do conjunto de dados mydataset para conceder uma função a um principal. A atualização desta política de IAM não afeta o acesso de outros responsáveis que tenham recebido essa função para o conjunto de dados.

    # This file adds a member to an IAM role for the dataset created by
    # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf.
    # You must place it in the same local directory as that main.tf file,
    # and you must have already applied that main.tf file to create
    # the "default" dataset resource with a dataset_id of "mydataset".
    
    resource "google_bigquery_dataset_iam_member" "dataset_iam_member" {
      dataset_id = google_bigquery_dataset.default.dataset_id
      role       = "roles/bigquery.user"
      member     = "user:user@example.com"
    }

    Para aplicar a configuração do Terraform num Google Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Google Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do fornecedor Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Reveja a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expetativas:
      terraform plan

      Faça correções à configuração conforme necessário.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Google Cloud projeto para ver os resultados. Na Google Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

    API

    Para aplicar controlos de acesso quando o conjunto de dados é criado, chame o método datasets.insert com um recurso de conjunto de dados definido. Para atualizar os controlos de acesso, chame o método datasets.patch e use a propriedade access no recurso Dataset.

    Uma vez que o método datasets.update substitui o recurso do conjunto de dados completo, o método datasets.patch é o preferencial para atualizar os controlos de acesso.

    Ir

    Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Defina a nova lista de acesso anexando a nova entrada à lista existente com o tipo DatasetMetadataToUpdate . Em seguida, chame a função dataset.Update() para atualizar a propriedade.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // grantAccessToDataset creates a new ACL conceding the READER role to the group "example-analyst-group@google.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func grantAccessToDataset(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create BigQuery handler.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Create dataset handler
    	dataset := client.Dataset(datasetID)
    
    	// Get metadata
    	meta, err := dataset.Metadata(ctx)
    	if err != nil {
    		return fmt.Errorf("bigquery.Dataset.Metadata: %w", err)
    	}
    
    	// Find more details about BigQuery Entity Types here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#EntityType
    	//
    	// Find more details about BigQuery Access Roles here:
    	// https://pkg.go.dev/cloud.google.com/go/bigquery#AccessRole
    
    	entityType := bigquery.GroupEmailEntity
    	entityID := "example-analyst-group@google.com"
    	roleType := bigquery.ReaderRole
    
    	// Append a new access control entry to the existing access list.
    	update := bigquery.DatasetMetadataToUpdate{
    		Access: append(meta.Access, &bigquery.AccessEntry{
    			Role:       roleType,
    			EntityType: entityType,
    			Entity:     entityID,
    		}),
    	}
    
    	// Leverage the ETag for the update to assert there's been no modifications to the
    	// dataset since the metadata was originally read.
    	meta, err = dataset.Update(ctx, update, meta.ETag)
    	if err != nil {
    		return err
    	}
    
    	fmt.Fprintf(w, "Details for Access entries in dataset %v.\n", datasetID)
    	for _, access := range meta.Access {
    		fmt.Fprintln(w)
    		fmt.Fprintf(w, "Role: %s\n", access.Role)
    		fmt.Fprintf(w, "Entities: %v\n", access.Entity)
    	}
    
    	return nil
    }
    

    Java

    Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.Acl.Entity;
    import com.google.cloud.bigquery.Acl.Group;
    import com.google.cloud.bigquery.Acl.Role;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import com.google.cloud.bigquery.DatasetId;
    import java.util.ArrayList;
    import java.util.List;
    
    public class GrantAccessToDataset {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        // Project and dataset from which to get the access policy
        String projectId = "MY_PROJECT_ID";
        String datasetName = "MY_DATASET_NAME";
        // Group to add to the ACL
        String entityEmail = "group-to-add@example.com";
    
        grantAccessToDataset(projectId, datasetName, entityEmail);
      }
    
      public static void grantAccessToDataset(
          String projectId, String datasetName, String entityEmail) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create datasetId with the projectId and the datasetName.
          DatasetId datasetId = DatasetId.of(projectId, datasetName);
          Dataset dataset = bigquery.getDataset(datasetId);
    
          // Create a new Entity with the corresponding type and email
          // "user-or-group-to-add@example.com"
          // For more information on the types of Entities available see:
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity
          // and
          // https://cloud.google.com/java/docs/reference/google-cloud-bigquery/latest/com.google.cloud.bigquery.Acl.Entity.Type
          Entity entity = new Group(entityEmail);
    
          // Create a new ACL granting the READER role to the group with the entity email
          // "user-or-group-to-add@example.com"
          // For more information on the types of ACLs available see:
          // https://cloud.google.com/storage/docs/access-control/lists
          Acl newEntry = Acl.of(entity, Role.READER);
    
          // Get a copy of the ACLs list from the dataset and append the new entry.
          List<Acl> acls = new ArrayList<>(dataset.getAcl());
          acls.add(newEntry);
    
          // Update the ACLs by setting the new list.
          Dataset updatedDataset = bigquery.update(dataset.toBuilder().setAcl(acls).build());
          System.out.println(
              "ACLs of dataset \""
                  + updatedDataset.getDatasetId().getDataset()
                  + "\" updated successfully");
        } catch (BigQueryException e) {
          System.out.println("ACLs were not updated \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Defina a nova lista de acesso anexando a nova entrada à lista existente através do método Dataset#metadata. Em seguida, chame a função Dataset#setMetadata() para atualizar a propriedade.
    
    /**
     * TODO(developer): Update and un-comment below lines.
     */
    
    // const datasetId = "my_project_id.my_dataset_name";
    
    // ID of the user or group from whom you are adding access.
    // const entityId = "user-or-group-to-add@example.com";
    
    // One of the "Basic roles for datasets" described here:
    // https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    // const role = "READER";
    
    const {BigQuery} = require('@google-cloud/bigquery');
    
    // Instantiate a client.
    const client = new BigQuery();
    
    // Type of entity you are granting access to.
    // Find allowed allowed entity type names here:
    // https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#resource:-dataset
    const entityType = 'groupByEmail';
    
    async function grantAccessToDataset() {
      const [dataset] = await client.dataset(datasetId).get();
    
      // The 'access entries' array is immutable. Create a copy for modifications.
      const entries = [...dataset.metadata.access];
    
      // Append an AccessEntry to grant the role to a dataset.
      // Find more details about the AccessEntry object in the BigQuery documentation:
      // https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
      entries.push({
        role,
        [entityType]: entityId,
      });
    
      // Assign the array of AccessEntries back to the dataset.
      const metadata = {
        access: entries,
      };
    
      // Update will only succeed if the dataset
      // has not been modified externally since retrieval.
      //
      // See the BigQuery client library documentation for more details on metadata updates:
      // https://cloud.google.com/nodejs/docs/reference/bigquery/latest
    
      // Update just the 'access entries' property of the dataset.
      await client.dataset(datasetId).setMetadata(metadata);
    
      console.log(
        `Role '${role}' granted for entity '${entityId}' in '${datasetId}'.`
      );
    }

    Python

    Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Defina a propriedade dataset.access_entries com os controlos de acesso para um conjunto de dados. Em seguida, chame a função client.update_dataset() para atualizar a propriedade.
    from google.api_core.exceptions import PreconditionFailed
    from google.cloud import bigquery
    from google.cloud.bigquery.enums import EntityTypes
    
    # TODO(developer): Update and uncomment the lines below.
    
    # ID of the dataset to grant access to.
    # dataset_id = "my_project_id.my_dataset"
    
    # ID of the user or group receiving access to the dataset.
    # Alternatively, the JSON REST API representation of the entity,
    # such as the view's table reference.
    # entity_id = "user-or-group-to-add@example.com"
    
    # One of the "Basic roles for datasets" described here:
    # https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
    # role = "READER"
    
    # Type of entity you are granting access to.
    # Find allowed allowed entity type names here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/enums#class-googlecloudbigqueryenumsentitytypesvalue
    entity_type = EntityTypes.GROUP_BY_EMAIL
    
    # Instantiate a client.
    client = bigquery.Client()
    
    # Get a reference to the dataset.
    dataset = client.get_dataset(dataset_id)
    
    # The `access_entries` list is immutable. Create a copy for modifications.
    entries = list(dataset.access_entries)
    
    # Append an AccessEntry to grant the role to a dataset.
    # Find more details about the AccessEntry object here:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.dataset.AccessEntry
    entries.append(
        bigquery.AccessEntry(
            role=role,
            entity_type=entity_type,
            entity_id=entity_id,
        )
    )
    
    # Assign the list of AccessEntries back to the dataset.
    dataset.access_entries = entries
    
    # Update will only succeed if the dataset
    # has not been modified externally since retrieval.
    #
    # See the BigQuery client library documentation for more details on `update_dataset`:
    # https://cloud.google.com/python/docs/reference/bigquery/latest/google.cloud.bigquery.client.Client#google_cloud_bigquery_client_Client_update_dataset
    try:
        # Update just the `access_entries` property of the dataset.
        dataset = client.update_dataset(
            dataset,
            ["access_entries"],
        )
    
        # Show a success message.
        full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
        print(
            f"Role '{role}' granted for entity '{entity_id}'"
            f" in dataset '{full_dataset_id}'."
        )
    except PreconditionFailed:  # A read-modify-write error
        print(
            f"Dataset '{dataset.dataset_id}' was modified remotely before this update. "
            "Fetch the latest version and retry."
        )

Funções predefinidas que concedem acesso a conjuntos de dados

Pode conceder às seguintes funções predefinidas de IAM acesso a um conjunto de dados.

Função Descrição
Proprietário dos dados do BigQuery (roles/bigquery.dataOwner) Quando concedida num conjunto de dados, esta função concede as seguintes autorizações:
  • Todas as autorizações para o conjunto de dados e para todos os recursos no conjunto de dados: tabelas e vistas, modelos e rotinas.
Editor de dados do BigQuery (roles/bigquery.dataEditor) Quando concedida num conjunto de dados, esta função concede as seguintes autorizações:
  • Obtenha metadados e autorizações para o conjunto de dados.
  • Para tabelas e vistas:
    • Criar, atualizar, obter, listar e eliminar as tabelas e as vistas do conjunto de dados.
    • Ler (consultar), exportar, replicar e atualizar dados de tabelas.
    • Criar, atualizar e eliminar índices.
    • Criar e restaurar instantâneos.
  • Todas as autorizações para as rotinas e os modelos do conjunto de dados.
Visualizador de dados do BigQuery (roles/bigquery.dataViewer) Quando concedida num conjunto de dados, esta função concede as seguintes autorizações:
  • Obtenha metadados e autorizações para o conjunto de dados.
  • Liste as tabelas, as vistas e os modelos de um conjunto de dados.
  • Obter metadados e controlos de acesso para as tabelas e as vistas do conjunto de dados.
  • Ler (consultar), replicar e exportar dados de tabelas, bem como criar instantâneos.
  • Listar e invocar as rotinas do conjunto de dados.
Visualizador de metadados do BigQuery (roles/bigquery.metadataViewer) Quando concedida num conjunto de dados, esta função concede as seguintes autorizações:
  • Obtenha metadados e controlos de acesso para o conjunto de dados.
  • Obtenha metadados e controlos de acesso para tabelas e vistas.
  • Obtenha metadados dos modelos e das rotinas do conjunto de dados.
  • Liste tabelas, vistas, modelos e rotinas no conjunto de dados.

Autorizações do conjunto de dados

A maioria das autorizações que começam com bigquery.datasets aplica-se ao nível do conjunto de dados. O bigquery.datasets.create não. Para criar conjuntos de dados, tem de conceder autorização bigquery.datasets.create a uma função no contentor principal, ou seja, o projeto.

A tabela seguinte apresenta todas as autorizações para conjuntos de dados e o recurso de nível mais baixo ao qual a autorização pode ser aplicada.

Autorização Recurso Ação
bigquery.datasets.create Projeto Criar novos conjuntos de dados no projeto.
bigquery.datasets.get Conjunto de dados Obtenha metadados e controlos de acesso para o conjunto de dados. A visualização de autorizações na consola também requer a autorização bigquery.datasets.getIamPolicy.
bigquery.datasets.getIamPolicy Conjunto de dados Necessário pela consola para conceder ao utilizador autorização para obter os controlos de acesso de um conjunto de dados. Falha ao abrir. A consola também requer a autorização bigquery.datasets.get para ver o conjunto de dados.
bigquery.datasets.update Conjunto de dados Atualize os metadados e os controlos de acesso para o conjunto de dados. A atualização dos controlos de acesso na consola também requer a autorização bigquery.datasets.setIamPolicy.
bigquery.datasets.setIamPolicy Conjunto de dados Obrigatório pela consola para conceder ao utilizador autorização para definir os controlos de acesso de um conjunto de dados. Falha ao abrir. A consola também requer a autorização bigquery.datasets.update para atualizar o conjunto de dados.
bigquery.datasets.delete Conjunto de dados Eliminar um conjunto de dados.
bigquery.datasets.createTagBinding Conjunto de dados Associe etiquetas ao conjunto de dados.
bigquery.datasets.deleteTagBinding Conjunto de dados Desassocie etiquetas do conjunto de dados.
bigquery.datasets.listTagBindings Conjunto de dados Liste as etiquetas do conjunto de dados.
bigquery.datasets.listEffectiveTags Conjunto de dados Apresentar uma lista de etiquetas eficazes (aplicadas e herdadas) para o conjunto de dados.
bigquery.datasets.link Conjunto de dados Crie um conjunto de dados associado.
bigquery.datasets.listSharedDatasetUsage Projeto Apresenta estatísticas de utilização de conjuntos de dados partilhados para conjuntos de dados aos quais tem acesso no projeto. Esta autorização é necessária para consultar a vista INFORMATION_SCHEMA.SHARED_DATASET_USAGE.

Veja os controlos de acesso de um conjunto de dados

Pode ver os controlos de acesso definidos explicitamente para um conjunto de dados escolhendo uma das seguintes opções. Para ver funções herdadas, para um conjunto de dados, use a IU Web do BigQuery.

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

  2. No painel esquerdo, clique em Explorador:

    Botão realçado para o painel do explorador.

  3. No painel Explorador, expanda o seu projeto, clique em Conjuntos de dados e, de seguida, selecione um conjunto de dados.

  4. Clique em Partilhar > Autorizações.

    Os controlos de acesso do conjunto de dados aparecem no painel Autorizações do conjunto de dados.

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para obter uma política 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
  3. SQL

    Consulte a INFORMATION_SCHEMA.OBJECT_PRIVILEGES vista. As consultas para obter controlos de acesso para um conjunto de dados têm de especificar o object_name.

    1. Na Google Cloud consola, aceda à página BigQuery.

      Aceda ao BigQuery

    2. No editor de consultas, introduza a seguinte declaração:

      SELECT
      COLUMN_LIST
      FROM
        PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
      WHERE
      object_name = "DATASET";

      Substitua o seguinte:

    3. Clique em Executar.

    Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

    Exemplo:

    Esta consulta obtém controlos de acesso para mydataset.

    SELECT
    object_name, privilege_type, grantee
    FROM
    my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES
    WHERE
    object_name = "mydataset";

    O resultado deve ter o seguinte aspeto:

    +------------------+-----------------------------+-------------------------+
    |   object_name    |  privilege_type             | grantee                 |
    +------------------+-----------------------------+-------------------------+
    | mydataset        | roles/bigquery.dataOwner    | projectOwner:myproject  |
    | mydataset        | roles/bigquery.dataViwer    | user:user@example.com   |
    +------------------+-----------------------------+-------------------------+
    

    API

    Para ver os controlos de acesso de um conjunto de dados, chame o método datasets.get com um recurso dataset definido.

    Os controlos de acesso aparecem na propriedade access do recurso dataset.

    Ir

    Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Chama a função client.Dataset().Metadata(). A política de acesso está disponível na propriedade Access.
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // viewDatasetAccessPolicies retrieves the ACL for the given dataset
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    func viewDatasetAccessPolicies(w io.Writer, projectID, datasetID string) error {
    	// TODO(developer): uncomment and update the following lines:
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    
    	ctx := context.Background()
    
    	// Create new client.
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	// Get dataset's metadata.
    	meta, err