Controlla l'accesso alle risorse con IAM

Questo documento descrive come visualizzare il criterio di accesso corrente di una risorsa, come concedere l'accesso a una risorsa e come revocare l'accesso a una risorsa.

Questo documento presuppone la conoscenza del sistema Identity and Access Management (IAM) in Google Cloud.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per modificare i criteri IAM per le risorse, chiedi all'amministratore di concederti il ruolo IAM Proprietario dati BigQuery (roles/bigquery.dataOwner) nel progetto. Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per modificare i criteri IAM per le risorse. Per visualizzare le autorizzazioni esatte richieste, espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

Per modificare i criteri IAM per le risorse sono necessarie le seguenti autorizzazioni:

  • Per ottenere i criteri di accesso di un set di dati: bigquery.datasets.get
  • Per impostare i criteri di accesso di un set di dati: bigquery.datasets.update
  • Per ottenere il criterio di accesso di un set di dati (solo console Google Cloud): bigquery.datasets.getIamPolicy
  • Per impostare i criteri di accesso di un set di dati (solo console): bigquery.datasets.setIamPolicy
  • Per ottenere il criterio di una tabella o di una vista: bigquery.tables.getIamPolicy
  • Per impostare il criterio di una tabella o di una vista: bigquery.tables.setIamPolicy
  • Per creare lo strumento bq o i job BigQuery SQL (facoltativo): bigquery.jobs.create

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Visualizzare il criterio di accesso di una risorsa

Le seguenti sezioni descrivono come visualizzare i criteri di accesso di diverse risorse.

Visualizzare il criterio di accesso di un set di dati

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto e seleziona un set di dati.

  3. Fai clic su Condivisione > Autorizzazioni.

    I criteri di accesso ai set di dati vengono visualizzati nel riquadro Autorizzazioni set di dati.

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. Per recuperare un criterio esistente e stamparlo in un file locale in JSON, utilizza il comando bq show in Cloud Shell:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • DATASET: il nome del set di dati
    • PATH_TO_FILE: il percorso del file JSON sul computer locale

API

Per visualizzare il criterio di accesso di un set di dati, chiama il metodo datasets.get con una risorsa dataset definita.

Il criterio è disponibile nella proprietà access della risorsa dataset rimessa.

Visualizzare il criterio di accesso di una tabella o una visualizzazione

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto e seleziona una tabella o una vista.

  3. Fai clic su Condividi.

    I criteri di accesso alla tabella o alla visualizzazione vengono visualizzati nel riquadro Condividi.

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. Per recuperare un criterio di accesso esistente e stamparlo in un file locale in JSON, utilizza il comando bq get-iam-policy in Cloud Shell:

    bq get-iam-policy \
       --table=true \
       PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • DATASET: il nome del set di dati
    • RESOURCE: il nome della tabella o della vista di cui vuoi visualizzare il criterio
    • PATH_TO_FILE: il percorso del file JSON sul computer locale

API

Per recuperare il criterio corrente, chiama il metodo tables.getIamPolicy.

Concedere l'accesso a una risorsa

Le seguenti sezioni descrivono come concedere l'accesso a risorse diverse.

Concedere l'accesso a un set di dati

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto e seleziona un set di dati da condividere.

  3. Fai clic su Condivisione > Autorizzazioni.

  4. Fai clic su Aggiungi entità.

  5. Nel campo Nuovi principali, inserisci un principale.

  6. Nell'elenco Seleziona un ruolo, seleziona un ruolo predefinito o un ruolo personalizzato.

  7. Fai clic su Salva.

  8. Per tornare alle informazioni del set di dati, fai clic su Chiudi.

SQL

Per concedere ai principali l'accesso ai set di dati, utilizza l'istruzione DCL GRANT:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    Sostituisci quanto segue:

    • ROLE_LIST: un ruolo o un elenco di ruoli separati da virgole che vuoi concedere
    • RESOURCE_NAME: il nome della risorsa su cui vuoi concedere l'autorizzazione
    • USER_LIST: un elenco separato da virgole di utenti a cui viene concesso il ruolo

      Per un elenco dei formati validi, consulta user_list.

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

Nell'esempio seguente viene concesso il ruolo Visualizzatore dati al set di datimyDataset:

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:raha@example-pet-store.com", "user:sasha@example-pet-store.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. Per scrivere le informazioni esistenti del set di dati (inclusi i controlli di accesso) in un file JSON, utilizza il comando bq show:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • DATASET: il nome del set di dati
    • PATH_TO_FILE: il percorso del file JSON sul computer locale
  3. Apporta modifiche alla sezione access del file JSON. Puoi aggiungere a una delle voci specialGroup: projectOwners, projectWriters, projectReaders e allAuthenticatedUsers. Puoi anche aggiungere uno dei seguenti valori: userByEmail, groupByEmail e domain.

    Ad esempio, la sezione access del file JSON di un set di dati sarà simile alla seguente:

    {
     "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. Al termine delle modifiche, utilizza il comando bq update e includi il file JSON utilizzando il flag --source. Se il set di dati si trova in un progetto diverso da quello predefinito, aggiungi l'ID progetto al nome del set di dati nel seguente formato: PROJECT_ID:DATASET.

    bq update \
    --source PATH_TO_FILE \
    PROJECT_ID:DATASET
  5. Per verificare le modifiche controllo dell'accesso, utilizza di nuovo il comando bq show senza scrivere le informazioni in un file:

    bq show --format=prettyjson PROJECT_ID:DATASET

Terraform

Utilizza le risorse google_bigquery_dataset_iam per aggiornare l'accesso a un set di dati.

Impostare i criteri di accesso per un set di dati

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_dataset_iam_policy per impostare il criterio IAM per il mydataset set di dati. Questo sostituisce qualsiasi criterio esistente già associato al set di dati:

# 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:hao@altostrat.com",
    ]
  }
  binding {
    role = "roles/bigquery.dataOwner"
    members = [
      "group:dba@altostrat.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
}

Impostare l'appartenenza a un ruolo per un set di dati

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_dataset_iam_binding per impostare l'appartenenza a un determinato ruolo per il mydataset set di dati. Verrà sostituito qualsiasi appartenenza esistente a quel ruolo. Gli altri ruoli all'interno del criterio IAM per il set di dati vengono conservati:

# 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:raha@altostrat.com",
    "group:analysts@altostrat.com"
  ]
}

Impostare l'appartenenza al ruolo per un singolo principale

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_dataset_iam_member per aggiornare il criterio IAM per il mydataset set di dati in modo da concedere un ruolo a un'entità. L'aggiornamento di questo criterio IAM non influisce sull'accesso di altri principali a cui è stato concesso questo ruolo per il set di dati.

# 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:yuri@altostrat.com"
}

Per applicare la configurazione Terraform in un progetto Google Cloud, completa i passaggi nelle seguenti sezioni.

Prepara Cloud Shell

  1. Avvia Cloud Shell.
  2. Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.

    Devi eseguire questo comando una sola volta per progetto e puoi farlo in qualsiasi directory.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

Prepara la directory

Ogni file di configurazione di Terraform deve avere una propria directory (chiamata anche modulo principale).

  1. In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione .tf, ad esempio main.tf. In questo tutorial, il file è denominato main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.

    Copia il codice campione nel main.tf appena creato.

    Se vuoi, copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

  3. Esamina e modifica i parametri di esempio da applicare al tuo ambiente.
  4. Salva le modifiche.
  5. Inizializza Terraform. Devi eseguire questa operazione una sola volta per directory.
    terraform init

    Se vuoi, per utilizzare la versione più recente del provider Google, includi l'opzione -upgrade:

    terraform init -upgrade

Applica le modifiche

  1. Rivedi la configurazione e verifica che le risorse che Terraform sta per creare o aggiornare corrispondano alle tue aspettative:
    terraform plan

    Apporta le correzioni necessarie alla configurazione.

  2. Applica la configurazione di Terraform eseguendo il seguente comando e inserendo yes al prompt:
    terraform apply

    Attendi che Terraform mostri il messaggio "Applicazione completata".

  3. Apri il tuo progetto Google Cloud per visualizzare i risultati. Nella console Google Cloud, vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.

API

Per applicare i controlli di accesso al momento della creazione del set di dati, chiama il metodo datasets.insert con una risorsa set di dati definita. Per aggiornare i controlli di accesso, chiama il metodo datasets.patch e utilizza la proprietà access nella risorsa Dataset.

Poiché il metodo datasets.update sostituisce l'intera risorsa del set di dati, datasets.patch è il metodo preferito per aggiornare i controlli di accesso.

Vai

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
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 java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    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();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

Imposta la proprietà dataset.access_entries con i controlli di accesso per un set di dati. Quindi, chiama la funzione client.update_dataset() per aggiornare la proprietà.

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom
# you are adding access. Alternatively, to the JSON REST API representation
# of the entity, such as a view's table reference.
entity_id = "user-or-group-to-add@example.com"

from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Set entity_type to the type of entity you are granting access to.
# Common types include:
#
# * "userByEmail" -- A single user or service account. For example "fred@example.com"
# * "groupByEmail" -- A group of users. For example "example@googlegroups.com"
# * "view" -- An authorized view. For example
#       {"projectId": "p", "datasetId": "d", "tableId": "v"}
#
# For a complete reference, see the REST API reference documentation:
# https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#Dataset.FIELDS.access
entity_type = EntityTypes.GROUP_BY_EMAIL

# TODO(developer): Set role to a one of the "Basic roles for datasets"
# described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
role = "READER"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

Concedere l'accesso a una tabella o una vista

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto e seleziona una tabella o una vista da condividere.

  3. Fai clic su Condividi.

  4. Fai clic su Aggiungi entità.

  5. Nel campo Nuovi principali, inserisci un principale.

  6. Nell'elenco Seleziona un ruolo, seleziona un ruolo predefinito o un ruolo personalizzato.

  7. Fai clic su Salva.

  8. Per tornare alla tabella o visualizzare i dettagli, fai clic su Chiudi.

SQL

Per concedere ai principali l'accesso a tabelle o viste, utilizza GRANT l'istruzione DCL:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    GRANT `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"

    Sostituisci quanto segue:

    • ROLE_LIST: un ruolo o un elenco di ruoli separati da virgole che vuoi concedere
    • RESOURCE_TYPE: il tipo di risorsa a cui viene applicato il ruolo

      I valori supportati includono TABLE, VIEW, MATERIALIZED VIEW e EXTERNAL TABLE.

    • RESOURCE_NAME: il nome della risorsa su cui vuoi concedere l'autorizzazione
    • USER_LIST: un elenco separato da virgole di utenti a cui viene concesso il ruolo

      Per un elenco dei formati validi, consulta user_list.

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

L'esempio seguente concede il ruolo Visualizzatore dati alla tabellamyTable:

GRANT `roles/bigquery.dataViewer`
ON TABLE `myProject`.myDataset.myTable
TO "user:raha@example-pet-store.com", "user:sasha@example-pet-store.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. Per concedere l'accesso a una tabella o una vista, utilizza il comando bq add-iam-policy-binding:

    bq add-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
     --table=true RESOURCE

    Sostituisci quanto segue:

    • MEMBER_TYPE: il tipo di membro, ad esempio user, group, serviceAccount o domain.
    • MEMBER: l'indirizzo email o il nome di dominio del membro.
    • ROLE: il ruolo che vuoi assegnare al membro.
    • RESOURCE: il nome della tabella o della vista di cui vuoi aggiornare il criterio.

Terraform

Utilizza le risorse google_bigquery_table_iam per aggiornare l'accesso a una tabella.

Impostare il criterio di accesso per una tabella

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_table_iam_policy per impostare il criterio IAM per la tabellamytable. Questo sostituisce qualsiasi criterio esistente già associato alla tabella:

# This file sets the IAM policy for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

data "google_iam_policy" "iam_policy" {
  binding {
    role = "roles/bigquery.dataOwner"
    members = [
      "user:raha@altostrat.com",
    ]
  }
}

resource "google_bigquery_table_iam_policy" "table_iam_policy" {
  dataset_id  = google_bigquery_table.default.dataset_id
  table_id    = google_bigquery_table.default.table_id
  policy_data = data.google_iam_policy.iam_policy.policy_data
}

Impostare l'appartenenza ai ruoli per una tabella

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_table_iam_binding per impostare l'appartenenza a un determinato ruolo per la tabella mytable. Verrà sostituito qualsiasi appartenenza esistente a quel ruolo. Gli altri ruoli all'interno del criterio IAM per la tabella vengono conservati.

# This file sets membership in an IAM role for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

resource "google_bigquery_table_iam_binding" "table_iam_binding" {
  dataset_id = google_bigquery_table.default.dataset_id
  table_id   = google_bigquery_table.default.table_id
  role       = "roles/bigquery.dataOwner"

  members = [
    "group:analysts@altostrat.com",
  ]
}

Impostare l'appartenenza al ruolo per un singolo principale

L'esempio seguente mostra come utilizzare la risorsa google_bigquery_table_iam_member per aggiornare il criterio IAM per la tabella mytable in modo da concedere un ruolo a un'entità. L'aggiornamento di questo criterio IAM non influisce sull'accesso di altri principali a cui è stato concesso questo ruolo per il set di dati.

# This file adds a member to an IAM role for the table created by
# https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/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" table resource with a table_id of "mytable".

resource "google_bigquery_table_iam_member" "table_iam_member" {
  dataset_id = google_bigquery_table.default.dataset_id
  table_id   = google_bigquery_table.default.table_id
  role       = "roles/bigquery.dataEditor"
  member     = "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com"
}

Per applicare la configurazione Terraform in un progetto Google Cloud, completa i passaggi nelle seguenti sezioni.

Prepara Cloud Shell

  1. Avvia Cloud Shell.
  2. Imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform.

    Devi eseguire questo comando una sola volta per progetto e puoi farlo in qualsiasi directory.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

Prepara la directory

Ogni file di configurazione di Terraform deve avere una propria directory (chiamata anche modulo principale).

  1. In Cloud Shell, crea una directory e un nuovo file al suo interno. Il nome file deve avere l'estensione .tf, ad esempio main.tf. In questo tutorial, il file è denominato main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se stai seguendo un tutorial, puoi copiare il codice campione in ogni sezione o passaggio.

    Copia il codice campione nel main.tf appena creato.

    Se vuoi, copia il codice da GitHub. Questa opzione è consigliata quando lo snippet Terraform fa parte di una soluzione end-to-end.

  3. Esamina e modifica i parametri di esempio da applicare al tuo ambiente.
  4. Salva le modifiche.
  5. Inizializza Terraform. Devi eseguire questa operazione una sola volta per directory.
    terraform init

    Se vuoi, per utilizzare la versione più recente del provider Google, includi l'opzione -upgrade:

    terraform init -upgrade

Applica le modifiche

  1. Rivedi la configurazione e verifica che le risorse che Terraform sta per creare o aggiornare corrispondano alle tue aspettative:
    terraform plan

    Apporta le correzioni necessarie alla configurazione.

  2. Applica la configurazione di Terraform eseguendo il seguente comando e inserendo yes al prompt:
    terraform apply

    Attendi che Terraform mostri il messaggio "Applicazione completata".

  3. Apri il tuo progetto Google Cloud per visualizzare i risultati. Nella console Google Cloud, vai alle risorse nell'interfaccia utente per assicurarti che Terraform le abbia create o aggiornate.

API

  1. Per recuperare il criterio corrente, chiama il metodo tables.getIamPolicy.
  2. Modifica il criterio per aggiungere membri o associazioni o entrambi. Per il formato richiesto per le norme, consulta l'argomento di riferimento Norme.

  3. Chiama tables.setIamPolicy per scrivere il criterio aggiornato. Nota: le associazioni vuote senza membri non sono consentite e generano un errore.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

from google.cloud import bigquery

bqclient = bigquery.Client()

policy = bqclient.get_iam_policy(
    your_table_id,  # e.g. "project.dataset.table"
)

analyst_email = "example-analyst-group@google.com"
binding = {
    "role": "roles/bigquery.dataViewer",
    "members": {f"group:{analyst_email}"},
}
policy.bindings.append(binding)

updated_policy = bqclient.set_iam_policy(
    your_table_id,  # e.g. "project.dataset.table"
    policy,
)

for binding in updated_policy.bindings:
    print(repr(binding))

Revocare l'accesso a una risorsa

Le seguenti sezioni descrivono come revocare l'accesso a diverse risorse.

Revocare l'accesso a un set di dati

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Spazio di esplorazione, espandi il progetto e seleziona un set di dati.

  3. Nel riquadro dei dettagli, fai clic su Condivisione > Autorizzazioni.

  4. Nella finestra di dialogo Autorizzazioni set di dati, espandi l'entità di cui vuoi revocare l'accesso.

  5. Fai clic su Rimuovi proprietario.

  6. Nella finestra di dialogo Vuoi rimuovere il ruolo dall'entità?, fai clic su Rimuovi.

  7. Per tornare ai dettagli del set di dati, fai clic su Chiudi.

SQL

Per rimuovere l'accesso ai set di dati dai principali, utilizza l'istruzione DCL REVOKE:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    REVOKE `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    FROM "USER_LIST"

    Sostituisci quanto segue:

    • ROLE_LIST: un ruolo o un elenco di ruoli separati da virgole che vuoi revocare
    • RESOURCE_NAME: il nome della risorsa per la quale vuoi revocare l'autorizzazione
    • USER_LIST: un elenco separato da virgole di utenti a cui verranno revocati i ruoli

      Per un elenco dei formati validi, consulta user_list.

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

L'esempio seguente revoca il ruolo Amministratore nel set di dati myDataset:

REVOKE `roles/bigquery.admin`
ON SCHEMA `myProject`.myDataset
FROM "group:example-team@example-pet-store.com", "serviceAccount:user@test-project.iam.gserviceaccount.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. Per scrivere le informazioni esistenti del set di dati (inclusi i controlli di accesso) in un file JSON, utilizza il comando bq show:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • DATASET: il nome del set di dati
    • PATH_TO_FILE: il percorso del file JSON sul computer locale
  3. Apporta modifiche alla sezione access del file JSON. Puoi rimuovere una delle voci specialGroup: projectOwners, projectWriters, projectReaders e allAuthenticatedUsers. Puoi anche rimuovere uno dei seguenti elementi: userByEmail,groupByEmail e domain.

    Ad esempio, la sezione access del file JSON di un set di dati sarà simile alla seguente:

    {
     "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. Al termine delle modifiche, utilizza il comando bq update e includi il file JSON utilizzando il flag --source. Se il set di dati si trova in un progetto diverso da quello predefinito, aggiungi l'ID progetto al nome del set di dati nel seguente formato: PROJECT_ID:DATASET.

    bq update \
        --source PATH_TO_FILE \
        PROJECT_ID:DATASET
  5. Per verificare le modifiche controllo dell'accesso, utilizza di nuovo il comando show senza scrivere le informazioni in un file:

    bq show --format=prettyjson PROJECT_ID:DATASET

API

Chiama datasets.patch e utilizza la proprietà access nella risorsa Dataset per aggiornare i controlli dell'accesso.

Poiché il metodo datasets.update sostituisce l'intera risorsa del set di dati, datasets.patch è il metodo preferito per aggiornare i controlli di accesso.

Vai

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// revokeDatasetAccess updates the access control on a dataset to remove all
// access entries that reference a specific entity.
func revokeDatasetAccess(projectID, datasetID, entity string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}

	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {

		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
			return err
		}
	}
	return nil
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

Imposta la proprietà dataset.access_entries con i controlli di accesso per un set di dati. Quindi, chiama la funzione client.update_dataset() per aggiornare la proprietà.

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom you are revoking access.
entity_id = "user-or-group-to-remove@example.com"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
dataset.access_entries = [
    entry for entry in entries if entry.entity_id != entity_id
]

dataset = client.update_dataset(
    dataset,
    # Update just the `access_entries` property of the dataset.
    ["access_entries"],
)  # Make an API request.

full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")

Revocare l'accesso a una tabella o una visualizzazione

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto e seleziona una tabella o una vista.

  3. Nel riquadro dei dettagli, fai clic su Condividi.

  4. Nella finestra di dialogo Condividi, espandi l'entità di cui vuoi revocare l'accesso.

  5. Fai clic su Elimina.

  6. Nella finestra di dialogo Vuoi rimuovere il ruolo dall'entità?, fai clic su Rimuovi.

  7. Per tornare alla tabella o visualizzare i dettagli, fai clic su Chiudi.

SQL

Per rimuovere l'accesso a tabelle o viste dai principali, utilizza l'istruzione DCL REVOKE:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    REVOKE `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    FROM "USER_LIST"

    Sostituisci quanto segue:

    • ROLE_LIST: un ruolo o un elenco di ruoli separati da virgole che vuoi revocare
    • RESOURCE_TYPE: il tipo di risorsa da cui viene revocato il ruolo

      I valori supportati includono TABLE, VIEW, MATERIALIZED VIEW e EXTERNAL TABLE.

    • RESOURCE_NAME: il nome della risorsa per la quale vuoi revocare l'autorizzazione
    • USER_LIST: un elenco separato da virgole di utenti a cui verranno revocati i ruoli

      Per un elenco dei formati validi, consulta user_list.

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

L'esempio seguente revoca il ruolo Amministratore per la tabella myTable:

REVOKE `roles/bigquery.admin`
ON TABLE `myProject`.myDataset.myTable
FROM "group:example-team@example-pet-store.com", "serviceAccount:user@test-project.iam.gserviceaccount.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. Per revocare l'accesso a una tabella o una vista, utilizza il comando bq remove-iam-policy-binding:

    bq remove-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE
     --table=true RESOURCE

    Sostituisci quanto segue:

    • MEMBER_TYPE: il tipo di membro, ad esempio user, group, serviceAccount o domain.
    • MEMBER: l'indirizzo email o il nome di dominio del membro.
    • ROLE: il ruolo che vuoi revocare al membro.
    • RESOURCE: il nome della tabella o della vista di cui vuoi aggiornare il criterio.

API

  1. Per recuperare il criterio corrente, chiama il metodo tables.getIamPolicy.
  2. Modifica il criterio per rimuovere membri o associazioni o entrambi. Per il formato richiesto per le norme, consulta l'argomento di riferimento Norme.

  3. Chiama tables.setIamPolicy per scrivere il criterio aggiornato. Nota: le associazioni vuote senza membri non sono consentite e generano un errore.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}

Rifiutare l'accesso a una risorsa

I criteri di rifiuto IAM ti consentono di impostare sistemi di protezione per gli accessi alle risorse BigQuery. Puoi definire regole di negazione che impediscono a determinate entità di utilizzare determinate autorizzazioni, indipendentemente dai ruoli loro concessi.

Per informazioni su come creare, aggiornare ed eliminare i criteri di rifiuto, consulta Negare l'accesso alle risorse.

Casi speciali

Considera i seguenti scenari quando crei criteri di rifiuto IAM su alcune autorizzazioni BigQuery:

  • L'accesso alle risorse autorizzate (visualizzazioni, routine, set di dati o procedure archiviate) ti consente di creare, eliminare o manipolare una tabella, nonché di leggere e modificare i dati della tabella, anche se non disponi dell'autorizzazione diretta per eseguire queste operazioni. Inoltre, può recuperare i dati o i metadati del modello e richiamare altre procedure memorizzate sulla tabella sottostante. Questa funzionalità implica che le risorse autorizzate dispongano delle seguenti autorizzazioni:

    • bigquery.tables.get
    • bigquery.tables.list
    • bigquery.tables.getData
    • bigquery.tables.updateData
    • bigquery.tables.create
    • bigquery.tables.delete
    • bigquery.routines.get
    • bigquery.routines.list
    • bigquery.datasets.get
    • bigquery.models.getData
    • bigquery.models.getMetadata

    Per negare l'accesso a queste risorse autorizzate, aggiungi uno dei seguenti valori al campo deniedPrincipal quando crei il criterio di rifiuto:

    Valore Caso d'uso
    principalSet://goog/public:all Blocca tutti i principali, incluse le risorse autorizzate.
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* Blocca tutte le risorse BigQuery autorizzate nel progetto specificato. PROJECT_NUMBER è un identificatore univoco generato automaticamente per il tuo progetto di tipo INT64.
  • Per esentare determinate entità dal criterio di rifiuto, specificale nel campo exceptionPrincipals del criterio di rifiuto. Ad esempio: exceptionPrincipals: "principalSet://bigquery.googleapis.com/projects/1234/*".

  • BigQuery memorizza nella cache i risultati delle query di un proprietario di job per 24 ore, a cui il proprietario può accedere senza dover disporre dell'autorizzazione bigquery.tables.getData per la tabella contenente i dati. Di conseguenza, l'aggiunta di un criterio di negazione IAM all'autorizzazione bigquery.tables.getData non blocca l'accesso ai risultati memorizzati nella cache per il proprietario del job fino alla scadenza della cache. Per bloccare l'accesso del proprietario del job ai risultati memorizzati nella cache, crea un criterio di rifiuto separato per l'autorizzazione bigquery.jobs.create.

  • Per impedire l'accesso non intenzionale ai dati quando utilizzi i criteri di rifiuto per bloccare le operazioni di lettura dei dati, ti consigliamo di esaminare e revocare anche eventuali iscrizioni esistenti al set di dati.

  • Per creare un criterio di rifiuto IAM per la visualizzazione dei controlli di accesso ai set di dati, rifiuta le seguenti autorizzazioni:

    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
  • Per creare un criterio di rifiuto IAM per aggiornare i controlli dell'accesso ai set di dati, nega le seguenti autorizzazioni:

    • bigquery.datasets.update
    • bigquery.datasets.setIamPolicy