Mengontrol akses ke resource dengan IAM

Dokumen ini menjelaskan cara melihat kebijakan akses resource saat ini, cara memberikan akses ke resource, dan cara mencabut akses ke resource.

Dokumen ini mengasumsikan Anda telah memahami sistem Identity and Access Management (IAM) di Google Cloud.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk mengubah kebijakan IAM untuk resource, minta administrator untuk memberi Anda peran IAM BigQuery Data Owner (roles/bigquery.dataOwner) pada project. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran yang telah ditentukan ini berisi izin yang diperlukan untuk mengubah kebijakan IAM untuk resource. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan guna mengubah kebijakan IAM untuk resource:

  • Untuk mendapatkan kebijakan akses set data: bigquery.datasets.get
  • Untuk menetapkan kebijakan akses set data: bigquery.datasets.update
  • Untuk mendapatkan kebijakan akses set data (khusus konsol Google Cloud): bigquery.datasets.getIamPolicy
  • Untuk menetapkan kebijakan akses set data (khusus konsol): bigquery.datasets.setIamPolicy
  • Untuk mendapatkan kebijakan tabel atau tabel virtual: bigquery.tables.getIamPolicy
  • Untuk menyetel kebijakan tabel atau tabel virtual: bigquery.tables.setIamPolicy
  • Untuk membuat alat bq atau tugas BigQuery SQL (opsional): bigquery.jobs.create

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Melihat kebijakan akses resource

Bagian berikut menjelaskan cara melihat kebijakan akses dari berbagai resource.

Melihat kebijakan akses set data

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih set data.

  3. Klik Sharing > Permissions.

    Kebijakan akses set data akan muncul di panel Dataset Permissions.

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mendapatkan kebijakan yang ada dan menghasilkannya ke file lokal di JSON, gunakan perintah bq show di Cloud Shell:

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

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • DATASET: nama set data Anda
    • PATH_TO_FILE: jalur ke file JSON di komputer lokal Anda

API

Untuk melihat kebijakan akses set data, panggil metode datasets.get dengan resource dataset yang ditentukan.

Kebijakan tersedia di properti access dari resource dataset yang ditampilkan.

Melihat kebijakan akses tabel atau tabel virtual

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih tabel atau tabel virtual.

  3. Klik Share.

    Kebijakan akses tabel atau tabel virtual akan muncul di panel Share.

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mendapatkan kebijakan akses yang ada dan menghasilkannya ke file lokal di JSON, gunakan perintah bq get-iam-policy di Cloud Shell:

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

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • DATASET: nama set data Anda
    • RESOURCE: nama tabel atau tabel virtual yang kebijakannya ingin Anda lihat
    • PATH_TO_FILE: jalur ke file JSON di komputer lokal Anda

API

Untuk mengambil kebijakan saat ini, panggil metode tables.getIamPolicy.

Memberikan akses ke resource

Bagian berikut menjelaskan cara memberikan akses ke berbagai resource.

Memberikan akses ke set data

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih set data untuk dibagikan.

  3. Klik Sharing > Permissions.

  4. Klik Add principal.

  5. Di kolom New principals, masukkan akun utama.

  6. Di daftar Select a role, pilih peran yang telah ditetapkan atau peran khusus.

  7. Klik Save.

  8. Untuk kembali ke info set data, klik Close.

SQL

Untuk memberikan akses ke set data kepada akun utama, gunakan pernyataan DCL GRANT:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    GRANT `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    TO "USER_LIST"

    Ganti kode berikut:

    • ROLE_LIST: peran atau daftar peran yang dipisahkan koma yang ingin Anda berikan
    • RESOURCE_NAME: nama resource yang ingin Anda beri izin
    • USER_LIST: daftar pengguna yang dipisahkan koma yang diberi peran

      Untuk daftar format yang valid, lihat user_list.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Contoh berikut memberikan peran Data Viewer pada set data myDataset:

GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:raha@example-pet-store.com", "user:sasha@example-pet-store.com"

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk menulis informasi set data yang ada (termasuk kontrol akses) ke file JSON, gunakan perintah bq show:

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

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • DATASET: nama set data Anda
    • PATH_TO_FILE: jalur ke file JSON di komputer lokal Anda
  3. Buat perubahan pada bagian access pada file JSON. Anda dapat menambahkan ke salah satu entri specialGroup: projectOwners, projectWriters, projectReaders, dan allAuthenticatedUsers. Anda juga dapat menambahkan salah satu dari: userByEmail, groupByEmail, dan domain.

    Misalnya, bagian access pada file JSON set data akan terlihat seperti berikut:

    {
     "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. Setelah pengeditan selesai, gunakan perintah bq update dan sertakan file JSON menggunakan flag --source. Jika set data berada dalam project selain project default Anda, tambahkan project ID ke nama set data dalam format berikut: PROJECT_ID:DATASET.

    bq update \
    --source PATH_TO_FILE \
    PROJECT_ID:DATASET
  5. Untuk memverifikasi perubahan kontrol akses, gunakan kembali perintah bq show tanpa perlu menulis informasi tersebut ke file:

    bq show --format=prettyjson PROJECT_ID:DATASET

Terraform

Gunakan resource google_bigquery_dataset_iam untuk memperbarui akses ke set data.

Menetapkan kebijakan akses untuk set data

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_dataset_iam_policy untuk menetapkan kebijakan IAM untuk set data mydataset. Tindakan ini akan menggantikan kebijakan apa pun yang sudah ada dan telah dilampirkan ke set data:

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

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
}

Menetapkan keanggotaan peran untuk set data

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_dataset_iam_binding untuk menetapkan keanggotaan dalam peran tertentu untuk set data mydataset. Tindakan ini akan menggantikan keanggotaan yang ada dalam peran tersebut. Peran lain dalam kebijakan IAM untuk set data dipertahankan:

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

Menetapkan keanggotaan peran untuk satu akun utama

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_dataset_iam_member untuk memperbarui kebijakan IAM untuk set data mydataset guna memberikan peran kepada satu akun utama. Memperbarui kebijakan IAM ini tidak akan memengaruhi akses untuk akun utama lain yang telah diberi peran tersebut untuk set data.

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

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

API

Untuk menerapkan kontrol akses saat set data dibuat, panggil metode datasets.insert dengan resource set data yang ditentukan. Untuk memperbarui kontrol akses, panggil metode datasets.patch dan gunakan properti access di resource Dataset.

Karena metode datasets.update menggantikan seluruh resource set data, datasets.patch adalah metode yang lebih disukai untuk memperbarui kontrol akses.

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Tetapkan properti dataset.access_entries dengan kontrol akses untuk set data. Kemudian, panggil fungsi client.update_dataset() untuk memperbarui properti.

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

Memberikan akses ke tabel atau tabel virtual

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih tabel atau tabel virtual untuk dibagikan.

  3. Klik Share.

  4. Klik Add principal.

  5. Di kolom New principals, masukkan akun utama.

  6. Di daftar Select a role, pilih peran yang telah ditetapkan atau peran khusus.

  7. Klik Save.

  8. Untuk kembali ke tabel atau melihat detail, klik Close.

SQL

Untuk memberikan akses ke tabel atau tabel virtual kepada akun utama, gunakan pernyataan DCL GRANT:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    GRANT `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"

    Ganti kode berikut:

    • ROLE_LIST: peran atau daftar peran yang dipisahkan koma yang ingin Anda berikan
    • RESOURCE_TYPE: jenis resource tempat peran diterapkan

      Nilai yang didukung mencakup TABLE, VIEW, MATERIALIZED VIEW, dan EXTERNAL TABLE.

    • RESOURCE_NAME: nama resource yang ingin Anda beri izin
    • USER_LIST: daftar pengguna yang dipisahkan koma yang diberi peran

      Untuk daftar format yang valid, lihat user_list.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Contoh berikut memberikan peran Data Viewer pada tabel 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. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk memberikan akses ke tabel atau tampilan, gunakan perintah bq add-iam-policy-binding:

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

    Ganti kode berikut:

    • MEMBER_TYPE: jenis anggota, seperti user, group, serviceAccount, atau domain.
    • MEMBER: alamat email atau nama domain anggota.
    • ROLE: peran yang ingin Anda berikan kepada anggota.
    • RESOURCE: nama tabel atau tampilan yang kebijakannya ingin Anda perbarui.

Terraform

Gunakan resource google_bigquery_table_iam untuk memperbarui akses ke tabel.

Menetapkan kebijakan akses untuk tabel

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_table_iam_policy untuk menetapkan kebijakan IAM untuk tabel mytable. Tindakan ini akan menggantikan kebijakan apa pun yang sudah ada dan telah dilampirkan ke tabel:

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

Menetapkan keanggotaan peran untuk tabel

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_table_iam_binding untuk menetapkan keanggotaan dalam peran tertentu untuk tabel mytable. Tindakan ini akan menggantikan keanggotaan yang ada dalam peran tersebut. Peran lain dalam kebijakan IAM untuk tabel dipertahankan.

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

Menetapkan keanggotaan peran untuk satu akun utama

Contoh berikut menunjukkan cara menggunakan resource google_bigquery_table_iam_member untuk memperbarui kebijakan IAM untuk tabel mytable guna memberikan peran kepada satu akun utama. Memperbarui kebijakan IAM ini tidak akan memengaruhi akses untuk akun utama lain yang telah diberi peran tersebut untuk set data.

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

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

API

  1. Untuk mengambil kebijakan saat ini, panggil metode tables.getIamPolicy.
  2. Edit kebijakan untuk menambahkan anggota atau binding, atau keduanya. Untuk format yang diperlukan untuk kebijakan, lihat topik referensi Kebijakan.

  3. Panggil tables.setIamPolicy untuk menulis kebijakan yang diperbarui. Catatan: Binding kosong tanpa anggota tidak diizinkan dan akan menghasilkan error.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Mencabut akses ke resource

Bagian berikut menjelaskan cara mencabut akses ke berbagai resource.

Mencabut akses ke set data

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih set data.

  3. Di panel detail, klik Sharing > Permissions.

  4. Pada dialog Dataset Permissions, luaskan akun utama yang aksesnya ingin Anda cabut.

  5. Klik Remove principal.

  6. Pada dialog Hapus peran dari akun utama?, klik Hapus.

  7. Untuk kembali ke detail set data, klik Close.

SQL

Untuk menghapus akses ke set data dari akun utama, gunakan pernyataan DCL REVOKE:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    REVOKE `ROLE_LIST`
    ON SCHEMA RESOURCE_NAME
    FROM "USER_LIST"

    Ganti kode berikut:

    • ROLE_LIST: peran atau daftar peran yang dipisahkan koma yang ingin Anda cabut
    • RESOURCE_NAME: nama resource yang izinnya ingin Anda cabut
    • USER_LIST: daftar pengguna yang dipisahkan koma yang perannya akan dicabut

      Untuk daftar format yang valid, lihat user_list.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Contoh berikut mencabut peran Admin pada set data myDataset:

REVOKE `roles/bigquery.admin`
ON SCHEMA `myProject`.myDataset
FROM "group:example-team@example-pet-store.com", "serviceAccount:user@test-project."

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk menulis informasi set data yang ada (termasuk kontrol akses) ke file JSON, gunakan perintah bq show:

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

    Ganti kode berikut:

    • PROJECT_ID: project ID Anda
    • DATASET: nama set data Anda
    • PATH_TO_FILE: jalur ke file JSON di komputer lokal Anda
  3. Buat perubahan pada bagian access pada file JSON. Anda dapat menghapus salah satu entri specialGroup: projectOwners, projectWriters, projectReaders, dan allAuthenticatedUsers. Anda juga dapat menghapus salah satu dari: userByEmail, groupByEmail, dan domain.

    Misalnya, bagian access pada file JSON set data akan terlihat seperti berikut:

    {
     "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. Setelah pengeditan selesai, gunakan perintah bq update dan sertakan file JSON menggunakan flag --source. Jika set data berada dalam project selain project default Anda, tambahkan project ID ke nama set data dalam format berikut: PROJECT_ID:DATASET.

    bq update \
        --source PATH_TO_FILE \
        PROJECT_ID:DATASET
  5. Untuk memverifikasi perubahan kontrol akses, gunakan kembali perintah show tanpa perlu menulis informasi tersebut ke file:

    bq show --format=prettyjson PROJECT_ID:DATASET

API

Panggil datasets.patch dan gunakan properti access di resource Dataset untuk memperbarui kontrol akses.

Karena metode datasets.update menggantikan seluruh resource set data, datasets.patch adalah metode yang lebih disukai untuk memperbarui kontrol akses.

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Tetapkan properti dataset.access_entries dengan kontrol akses untuk set data. Kemudian, panggil fungsi client.update_dataset() untuk memperbarui properti.

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

Mencabut akses ke tabel atau tabel virtual

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda dan pilih tabel atau tabel virtual.

  3. Di panel detail, klik Share.

  4. Pada dialog Share, luaskan akun utama yang aksesnya ingin Anda cabut.

  5. Klik Delete.

  6. Pada dialog Hapus peran dari akun utama?, klik Hapus.

  7. Untuk kembali ke tabel atau melihat detail, klik Close.

SQL

Untuk menghapus akses ke tabel atau tabel virtual dari akun utama, gunakan pernyataan DCL REVOKE:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    REVOKE `ROLE_LIST`
    ON RESOURCE_TYPE RESOURCE_NAME
    FROM "USER_LIST"

    Ganti kode berikut:

    • ROLE_LIST: peran atau daftar peran yang dipisahkan koma yang ingin Anda cabut
    • RESOURCE_TYPE: jenis resource tempat peran dicabut

      Nilai yang didukung mencakup TABLE, VIEW, MATERIALIZED VIEW, dan EXTERNAL TABLE.

    • RESOURCE_NAME: nama resource yang izinnya ingin Anda cabut
    • USER_LIST: daftar pengguna yang dipisahkan koma yang perannya akan dicabut

      Untuk daftar format yang valid, lihat user_list.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Contoh berikut mencabut peran Admin pada tabel myTable:

REVOKE `roles/bigquery.admin`
ON TABLE `myProject`.myDataset.myTable
FROM "group:example-team@example-pet-store.com", "serviceAccount:user@test-project."

bq

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mencabut akses ke tabel atau tabel virtual, gunakan perintah bq remove-iam-policy-binding:

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

    Ganti kode berikut:

    • MEMBER_TYPE: jenis anggota, seperti user, group, serviceAccount, atau domain.
    • MEMBER: alamat email atau nama domain anggota.
    • ROLE: peran yang ingin Anda cabut dari anggota.
    • RESOURCE: nama tabel atau tampilan yang kebijakannya ingin Anda perbarui.

API

  1. Untuk mengambil kebijakan saat ini, panggil metode tables.getIamPolicy.
  2. Edit kebijakan untuk menghapus anggota atau binding, atau keduanya. Untuk format yang diperlukan untuk kebijakan, lihat topik referensi Kebijakan.

  3. Panggil tables.setIamPolicy untuk menulis kebijakan yang diperbarui. Catatan: Binding kosong tanpa anggota tidak diizinkan dan akan menghasilkan error.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menolak akses ke resource

Kebijakan tolak IAM dapat Anda gunakan untuk menetapkan batasan pada akses ke resource BigQuery. Anda dapat menentukan aturan tolak yang mencegah akun utama yang dipilih menggunakan izin tertentu, terlepas dari peran yang diberikan.

Untuk informasi tentang cara membuat, memperbarui, dan menghapus kebijakan tolak, lihat Menolak akses ke resource.

Kasus khusus

Pertimbangkan skenario berikut saat Anda membuat kebijakan penolakan IAM pada beberapa izin BigQuery:

  • Akses ke resource yang diotorisasi (tampilan, routines, set data, atau prosedur tersimpan) memungkinkan Anda create, menghapus, atau memanipulasi tabel, beserta membaca dan mengubah data tabel, meskipun Anda tidak memiliki izin langsung untuk melakukan operasi tersebut. Fungsi ini juga dapat mendapatkan data atau metadata model dan memanggil prosedur tersimpan lainnya di tabel pokok. Kemampuan ini menyiratkan bahwa resource yang diotorisasi memiliki izin berikut:

    • 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

    Untuk menolak akses ke resource yang diotorisasi ini, tambahkan salah satu nilai berikut ke kolom deniedPrincipal saat Anda membuat kebijakan penolakan:

    Nilai Kasus penggunaan
    principalSet://goog/public:all Memblokir semua akun utama termasuk resource yang diotorisasi.
    principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/* Memblokir semua resource BigQuery yang diotorisasi dalam project yang ditentukan. PROJECT_NUMBER adalah ID unik yang dibuat secara otomatis untuk project Anda dari jenis INT64.
  • BigQuery meng-cache hasil kueri pemilik tugas selama 24 jam, yang dapat diakses oleh pemilik tugas tanpa memerlukan izin bigquery.tables.getData di tabel yang berisi data. Oleh karena itu, menambahkan kebijakan penolakan IAM ke izin bigquery.tables.getData tidak memblokir akses ke hasil yang di-cache untuk pemilik tugas hingga masa berlaku cache berakhir. Untuk memblokir akses pemilik tugas ke hasil yang di-cache, buat kebijakan tolak terpisah pada izin bigquery.jobs.create.

  • Untuk mencegah akses data yang tidak diinginkan saat menggunakan kebijakan tolak untuk memblokir operasi pembacaan data, sebaiknya Anda juga meninjau dan mencabut langganan yang ada di set data.

  • Untuk membuat kebijakan penolakan IAM guna melihat kontrol akses set data, tolak izin berikut:

    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
  • Untuk membuat kebijakan penolakan IAM guna memperbarui kontrol akses set data, tolak izin berikut:

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