Controla el acceso a los recursos con la IAM

En este documento, se describe cómo ver la política de acceso actual de un recurso, cómo otorgar acceso a un recurso y cómo revocar el acceso a un recurso.

En este documento, se supone que estás familiarizado con el sistema de Identity and Access Management (IAM) en Google Cloud.

Roles obligatorios

Para obtener los permisos que necesitas para cambiar las políticas de IAM para los recursos, pídele a tu administrador que te otorgue el rol de IAM Propietario de datos de BigQuery (roles/bigquery.dataOwner) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para cambiar las políticas de IAM de los recursos. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para cambiar las políticas de IAM para los recursos:

  • Para configurar la política de acceso de un conjunto de datos: bigquery.datasets.get
  • Para configurar la política de acceso de un conjunto de datos: bigquery.datasets.update
  • Para obtener la política de acceso de un conjunto de datos (solo en la consola de Google Cloud): bigquery.datasets.getIamPolicy
  • Para configurar la política de acceso de un conjunto de datos (solo en la consola): bigquery.datasets.setIamPolicy
  • Para obtener la política de una tabla o vista: bigquery.tables.getIamPolicy
  • Para establecer la política de una tabla o vista: bigquery.tables.setIamPolicy
  • Para crear la herramienta o los trabajos de BigQuery de SQL bigquery.jobs.create (opcional):

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Visualiza la política de acceso de un recurso

En las siguientes secciones, se describe cómo ver las políticas de acceso de diferentes recursos.

Visualiza la política de acceso de un conjunto de datos

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. Haz clic en Compartir > Permisos.

    Las políticas de acceso al conjunto de datos aparecen en el panel Permisos del conjunto de datos.

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 obtener una política existente y enviarla a un archivo local en JSON, usa el comando bq show en Cloud Shell:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local.

API

Para ver la política de acceso de un conjunto de datos, llama al método datasets.get con un recurso dataset definido.

La política está disponible en la propiedad access del recurso dataset que se muestra.

Visualiza la política de acceso de una tabla o vista

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige una tabla o vista.

  3. Haz clic en Compartir

    Las políticas de acceso a la tabla o la vista aparecen en el panel Compartir.

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 obtener una política de acceso existente y enviarla a un archivo local en JSON, usa el comando bq get-iam-policy en Cloud Shell:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • RESOURCE: el nombre de la tabla o vista cuya política deseas ver
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local.

API

Para recuperar la política actual, llama al método tables.getIamPolicy.

Otorga acceso a un recurso

En las siguientes secciones, se describe cómo conceder el acceso a diferentes recursos.

Otorga acceso a un conjunto de datos

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos para compartir.

  3. Haz clic en Compartir > Permisos.

  4. Haz clic en Agregar principal.

  5. En el campo Principales nuevos, escribe un principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Guardar.

  8. Para volver a la información del conjunto de datos, haz clic en Cerrar.

SQL

Para otorgar a las principales acceso a los conjuntos de datos, usa la declaración DCL GRANT:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: Un rol o lista de roles separados por comas que deseas otorgar
    • RESOURCE_NAME: el nombre del recurso en el que deseas otorgar el permiso.
    • USER_LIST: una lista separada por comas de los usuarios a los que se otorga el rol.

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se otorga la función de visualizador de datos en el conjunto de datos myDataset:

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. Para escribir la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq show:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local.
  3. Realiza cambios a la sección access del archivo JSON. Puedes agregar a cualquiera de las entradas specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes agregar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección access de un archivo JSON de un conjunto de datos se vería de la siguiente manera:

    {
     "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. Cuando tus ediciones estén completas, usa el comando bq update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: PROJECT_ID:DATASET.

    bq update \
    --source PATH_TO_FILE \
    PROJECT_ID:DATASET
  5. Para verificar los cambios del control de acceso, usa otra vez el comando bq show sin escribir la información en un archivo.

    bq show --format=prettyjson PROJECT_ID:DATASET

Terraform

Usa los recursos google_bigquery_dataset_iam para actualizar el acceso a una conjunto de datos.

Configura la política de control de acceso de un recurso

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_policy para establecer la política de IAM para el conjunto de datos mydataset. Esto reemplaza cualquier política existente que ya esté adjunta al conjunto de datos:

# 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
}

Establece la membresía de roles para un conjunto de datos

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_binding para establecer la membresía en un rol determinado para el conjunto de datos mydataset. Esto reemplaza cualquier membresía existente en ese rol. Se conservan otros roles dentro de la política de IAM para el conjunto de datos:

# 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"
  ]
}

Establece la membresía de roles para un solo principal

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_dataset_iam_member para actualizar la política de IAM del conjunto de datos mydataset para otorgar un rol a un principal. La actualización de esta política de IAM no afecta el acceso de ningún otro principal al que se le haya otorgado ese rol para el conjunto de datos.

# 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"
}

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

Prepara el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

API

Para aplicar los controles de acceso cuando se crea el conjunto de datos, llama al método datasets.insert con un recurso de conjunto de datos definido. Para actualizar tus controles de acceso, llama al método datasets.patch y usa la propiedad access en el recurso Dataset.

Debido a que el método datasets.update reemplaza todo el recurso de conjunto de datos, es preferible usar el método datasets.patch para actualizar los controles de acceso.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

Configura la propiedad dataset.access_entries con los controles de acceso para un conjunto de datos. Luego, llama a la función client.update_dataset() para actualizar la propiedad.

# 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)
)

Otorga acceso a una tabla o vista

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige una tabla o vista para compartir.

  3. Haz clic en Compartir

  4. Haz clic en Agregar principal.

  5. En el campo Principales nuevos, escribe un principal.

  6. En la lista Elegir un rol, elige un rol predefinido o una rol personalizado.

  7. Haz clic en Guardar.

  8. Para volver a la tabla o ver los detalles, haz clic en Cerrar.

SQL

Para otorgar a las principales acceso a tablas o vistas, usa la declaración DCL GRANT:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    GRANT `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: Un rol o lista de roles separados por comas que deseas otorgar
    • RESOURCE_TYPE: El tipo de recurso al que se aplica el rol

      Los valores admitidos son TABLE, VIEW, MATERIALIZED VIEW y EXTERNAL TABLE.

    • RESOURCE_NAME: el nombre del recurso en el que deseas otorgar el permiso.
    • USER_LIST: una lista separada por comas de los usuarios a los que se otorga el rol.

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se otorga la función de visualizador de datos en la tabla myTable:

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. Para otorgar acceso a una tabla o vista, usa el comando bq add-iam-policy-binding:

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

    Reemplaza lo siguiente:

    • MEMBER_TYPE: Es el tipo de miembro, como user, group, serviceAccount o domain.
    • MEMBER: La dirección de correo electrónico o el nombre de dominio del miembro.
    • ROLE: Es el rol que deseas otorgar al miembro.
    • RESOURCE: El nombre de la tabla o vista cuya política deseas actualizar.

Terraform

Usa los recursos google_bigquery_table_iam para actualizar el acceso a una tabla.

Configura la política de acceso para una tabla

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_policy para establecer la política de IAM para la tabla mytable. Esto reemplaza cualquier política existente que ya esté adjunta a la tabla:

# 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
}

Establece la membresía de roles para una tabla

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_binding para establecer la membresía en un rol determinado para la tabla mytable. Esto reemplaza cualquier membresía existente en ese rol. Se conservan otros roles dentro de la política de IAM para la tabla.

# 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",
  ]
}

Establece la membresía de roles para un solo principal

En el siguiente ejemplo, se muestra cómo usar el recurso google_bigquery_table_iam_member para actualizar la política de IAM de la tabla mytable para otorgar un rol a una principal. La actualización de esta política de IAM no afecta el acceso de ningún otro principal al que se le haya otorgado ese rol para el conjunto de datos.

# 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"
}

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

Prepara el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

API

  1. Para recuperar la política actual, llama al método tables.getIamPolicy.
  2. Edita la política para agregar miembros, vinculaciones o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

  3. Llama a tables.setIamPolicy para escribir la política actualizada. Nota: Las vinculaciones vacías sin miembros no están permitidas y generan un error.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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))

Revoca el acceso a un recurso

En las siguientes secciones, se describe cómo revocar el acceso a diferentes recursos.

Revoca el acceso a un conjunto de datos

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige un conjunto de datos.

  3. En el panel de detalles, haz clic en Compartir > Permisos.

  4. En el cuadro de diálogo Permisos del conjunto de datos, expande la principal cuyo acceso deseas revocar.

  5. Haz clic en Quitar principal.

  6. En el cuadro de diálogo ¿Quieres quitar el rol del principal?, haz clic en Quitar.

  7. Para volver a los detalles del conjunto de datos, haz clic en Cerrar.

SQL

Para quitar el acceso a los conjuntos de datos de las principales, usa la declaración DCL REVOKE:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    REVOKE `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    FROM "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: un rol o una lista de roles separados por comas que deseas revocar
    • RESOURCE_NAME: Es el nombre del recurso en el que deseas revocar el permiso.
    • USER_LIST: una lista separada por comas de usuarios a los que se les revocarán los roles

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se revoca la función de administrador en el conjunto de datos 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. Para escribir la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON, usa el comando bq show:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto
    • DATASET: nombre del conjunto de datos.
    • PATH_TO_FILE: la ruta al archivo JSON en tu máquina local.
  3. Realiza cambios a la sección access del archivo JSON. Puedes quitar cualquiera de las entradas de specialGroup: projectOwners, projectWriters, projectReaders y allAuthenticatedUsers. También puedes quitar cualquiera de los siguientes elementos: userByEmail, groupByEmail y domain.

    Por ejemplo, la sección access de un archivo JSON de un conjunto de datos se vería de la siguiente manera:

    {
     "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. Cuando tus ediciones estén completas, usa el comando bq update con la marca --source para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato: PROJECT_ID:DATASET.

    bq update \
        --source PATH_TO_FILE \
        PROJECT_ID:DATASET
  5. Para verificar los cambios del control de acceso, usa otra vez el comando show sin escribir la información en un archivo.

    bq show --format=prettyjson PROJECT_ID:DATASET

API

Realiza una llamada a datasets.patch y usa la propiedad access en el recurso Dataset para actualizar tus controles de acceso.

Debido a que el método datasets.update reemplaza todo el recurso de conjunto de datos, es preferible usar el método datasets.patch para actualizar los controles de acceso.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

Configura la propiedad dataset.access_entries con los controles de acceso para un conjunto de datos. Luego, llama a la función client.update_dataset() para actualizar la propiedad.

# 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}.'")

Revoca el acceso a una tabla o vista

Elige una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y elige una tabla o vista.

  3. En el panel de detalles, haz clic en Compartir.

  4. En el cuadro de diálogo Compartir, expande la principal cuyo acceso deseas revocar.

  5. Haz clic en Borrar.

  6. En el cuadro de diálogo ¿Quieres quitar el rol del principal?, haz clic en Quitar.

  7. Para volver a la tabla o ver los detalles, haz clic en Cerrar.

SQL

Para quitar el acceso a las tablas o vistas de las principales, usa la declaración DCL REVOKE:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    REVOKE `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    FROM "USER_LIST"

    Reemplaza lo siguiente:

    • ROLE_LIST: un rol o una lista de roles separados por comas que deseas revocar
    • RESOURCE_TYPE: el tipo de recurso del que se revoca el rol

      Los valores admitidos son TABLE, VIEW, MATERIALIZED VIEW y EXTERNAL TABLE.

    • RESOURCE_NAME: Es el nombre del recurso en el que deseas revocar el permiso.
    • USER_LIST: una lista separada por comas de usuarios a los que se les revocarán los roles

      Para obtener una lista de los formatos válidos, consulta user_list.

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

En el siguiente ejemplo, se revoca la función de administrador en la tabla 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. Para revocar el acceso a una tabla o vista, usa el comando bq remove-iam-policy-binding:

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

    Reemplaza lo siguiente:

    • MEMBER_TYPE: Es el tipo de miembro, como user, group, serviceAccount o domain.
    • MEMBER: La dirección de correo electrónico o el nombre de dominio del miembro.
    • ROLE: Es el rol que deseas revocar del miembro.
    • RESOURCE: El nombre de la tabla o vista cuya política deseas actualizar.

API

  1. Para recuperar la política actual, llama al método tables.getIamPolicy.
  2. Edita la política para quitar miembros, vinculaciones o ambos. Para obtener más información sobre el formato de una política, consulta el tema de referencia Política.

  3. Llama a tables.setIamPolicy para escribir la política actualizada. Nota: Las vinculaciones vacías sin miembros no están permitidas y generan un error.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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());
    }
  }
}

Cómo denegar el acceso a un recurso

Las políticas de denegación de IAM te permiten establecer límites en el acceso a los recursos de BigQuery. Puedes definir reglas de denegación que impidan a determinados principales usar ciertos permisos, sin importar los roles que tengan concedidos.

Para obtener información sobre cómo crear, actualizar y borrar políticas de denegación, consulta Cómo denegar el acceso a los recursos.

Casos especiales

Ten en cuenta las siguientes situaciones cuando crees políticas de denegación de IAM en algunos permisos de BigQuery:

  • El acceso a recursos autorizados (vistas, rutinas, conjuntos de datos o procedimientos almacenados) te permite crear, soltar o manipular una tabla, además de leer y modificar sus datos, incluso si no tienes permiso directo para realizar esas operaciones. También puede obtener datos o metadatos del modelo y invocar otros procedimientos almacenados en la tabla subyacente. Esta función implica que los recursos autorizados tienen los siguientes permisos:

    • 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

    Para denegar el acceso a estos recursos autorizados, agrega uno de los siguientes valores al campo deniedPrincipal cuando crees la política de denegación:

    Valor Caso de uso
    principalSet://goog/public:all Bloquea todas las principales, incluidos los recursos autorizados.
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* Bloquea todos los recursos autorizados de BigQuery en el proyecto especificado. PROJECT_NUMBER es un identificador único generado automáticamente para tu proyecto de tipo INT64.
  • Para eximir a ciertas principales de la política de denegación, especifícalas en el campo exceptionPrincipals de la política de denegación. Por ejemplo, exceptionPrincipals: "principalSet://bigquery.googleapis.com/projects/1234/*".

  • BigQuery almacena en caché los resultados de la consulta del propietario de un trabajo durante 24 horas, a los que puede acceder sin necesitar el permiso bigquery.tables.getData en la tabla que contiene los datos. Por lo tanto, agregar una política de denegación de IAM al permiso bigquery.tables.getData no bloquea el acceso a los resultados almacenados en caché para el propietario del trabajo hasta que venza la caché. Para bloquear el acceso del propietario del trabajo a los resultados almacenados en caché, crea una política de denegación independiente en el permiso bigquery.jobs.create.

  • Para evitar el acceso a los datos no deseado cuando se usan políticas de denegación para bloquear las operaciones de lectura de datos, te recomendamos que también revises y revoques las suscripciones existentes en el conjunto de datos.

  • Para crear una política de rechazo de IAM para ver los controles de acceso de los conjuntos de datos, rechaza los siguientes permisos:

    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
  • Para crear una política de IAM de rechazo para actualizar los controles de acceso de los conjuntos de datos, rechaza los siguientes permisos:

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