Mengontrol akses dengan IAM Conditions

Dokumen ini menjelaskan cara menggunakan IAM Conditions untuk mengontrol akses ke resource BigQuery.

Dengan IAM Conditions, Anda dapat memberikan akses ke resource BigQuery hanya jika kondisi tertentu terpenuhi. Misalnya, Anda dapat memberikan akses ke resource untuk durasi terbatas atau secara berkala selama jam-jam tertentu. Kondisi IAM didukung di level project, folder, dan organisasi serta dapat diterapkan pada set data, tabel, rutinitas, dan model BigQuery.

Kondisi IAM berguna untuk memberikan izin Identity and Access Management (IAM) ke banyak resource terkait secara bersamaan, termasuk resource yang belum ada. Untuk memberikan izin ke grup resource BigQuery yang tidak terkait, pertimbangkan untuk menggunakan tag IAM.

Sebelum memulai

Aktifkan IAM API dan berikan peran IAM yang memberi pengguna izin yang diperlukan untuk melakukan setiap tugas dalam dokumen ini.

Mengaktifkan IAM API

Untuk mengaktifkan IAM API, pilih salah satu opsi berikut:

Konsol

Buka halaman Identity and Access Management (IAM) API, lalu aktifkan API tersebut.

Mengaktifkan API

gcloud

Jalankan perintah gcloud services enable:

gcloud services enable iam.googleapis.com

Izin yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menerapkan Kondisi IAM ke resource BigQuery, minta administrator Anda untuk memberi Anda Admin IAM Project (roles/resourcemanager.projectIamAdmin) Peran IAM. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditetapkan ini berisi izin resourcemanager.projects.setIamPolicy, yang diperlukan untuk menerapkan Kondisi IAM ke resource BigQuery.

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

Jika berencana menggunakan IAM Conditions di seluruh organisasi, Anda juga memerlukan izin untuk mengelola kebijakan organisasi.

Untuk mengetahui informasi lebih lanjut tentang peran dan izin IAM di BigQuery, baca Pengantar IAM.

Atribut kondisi

Anda dapat menetapkan Kondisi IAM pada resource BigQuery, berdasarkan atribut berikut:

  • request.time: waktu saat pengguna mencoba mengakses resource BigQuery. Untuk mengetahui detail dan contoh selengkapnya, lihat Atribut tanggal/waktu.
  • resource.name: jalur resource BigQuery. Untuk formatnya, lihat tabel dalam Format atribut.
  • resource.type: jenis resource BigQuery. Untuk formatnya, lihat tabel dalam Format atribut.
  • resource.service: layanan Google Cloud yang digunakan resource BigQuery. Untuk mengetahui formatnya, lihat tabel dalam Format atribut.

Format atribut

Saat Anda membuat kondisi untuk set data BigQuery, gunakan format berikut:

Atribut Nilai
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com

Saat Anda membuat kondisi untuk tabel BigQuery, gunakan format berikut:

Atribut Nilai
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com

Saat Anda membuat kondisi untuk rutinitas BigQuery, gunakan format berikut:

Atribut Nilai
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

Saat Anda membuat kondisi untuk model BigQuery, gunakan format berikut:

Atribut Nilai
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

Ganti kode berikut:

  • PROJECT_ID: ID project yang berisi resource yang aksesnya Anda berikan
  • DATASET_ID: ID set data yang aksesnya Anda berikan
  • TABLE_ID: ID tabel yang Anda beri akses
  • ROUTINE_ID: ID rutinitas yang Anda beri akses
  • MODEL_ID: ID model yang Anda beri akses

Menambahkan kondisi ke resource

Untuk menambahkan kondisi ke set data, tabel, rutinitas, atau model di BigQuery, baca artikel Mengizinkan kebijakan dengan kondisi. Saat Anda membuat kondisi, lihat tabel format atribut.

Praktik terbaik kondisi

Saat Anda mem-build kondisi di BigQuery, gunakan praktik terbaik berikut:

  • Jangan gunakan kondisi negatif untuk resource.type, resource.name, atau resource.service, karena jenis yang tidak didukung menggunakan string kosong dan cocok dengan hampir semua kondisi negatif. Untuk mengetahui detail selengkapnya, lihat kondisi negatif.
  • Sertakan resource.type, resource.name, dan resource.service dalam kondisi Anda, meskipun tingkat kekhususan tersebut tidak diperlukan. Praktik ini membantu mempertahankan kondisi saat resource dalam alur kerja Anda berubah, sehingga resource lain tidak akan disertakan secara tidak sengaja di masa mendatang.
  • Saat memberikan izin, sertakan serangkaian izin sesedikit mungkin untuk memastikan Anda tidak memberikan akses yang terlalu permisif secara tidak sengaja.
  • Berhati-hatilah saat menggunakan frasa resource.name.startsWith dalam kondisi Anda, karena jalur tabel BigQuery diawali dengan project ID dan ID set data induknya. Kondisi yang tidak cukup spesifik dapat memberikan akses yang terlalu permisif. Namun, frasa resource.name.startsWith berguna jika Anda ingin memungkinkan pengguna menjalankan kueri karakter pengganti. Misalnya, kondisi resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") memungkinkan pengguna menjalankan kueri SELECT * FROM my_dataset.table_prefix*.
  • Jangan tambahkan kondisi untuk resource BigQuery selain set data, tabel, rutinitas, dan model.
  • Periksa kembali apakah Anda memberikan izin yang tepat pada resource yang benar. Misalnya, izin untuk membuat daftar resource (bigquery.RESOURCE.list ) harus diberikan di level induk, tetapi izin untuk membuat resource (bigquery.RESOURCE.create ) harus diberikan pada level resource. Penghapusan set data, tempat semua resource yang ada juga akan dihapus, memerlukan izin penghapusan tabel, model, dan rutin pada set data tersebut.
  • Perlu diketahui bahwa snapshot tabel dan perjalanan waktu tidak memengaruhi izin.

Kondisi negatif

Kondisi negatif seperti resource.name != resource dapat secara tidak sengaja memberikan akses yang terlalu permisif. Resource BigQuery yang tidak didukung memiliki atribut resource kosong, yang berarti resource tersebut cocok dengan semua kondisi negatif. Resource dalam layanan di luar BigQuery juga mungkin cocok dengan kondisi negatif.

Selain itu, kondisi negatif menimbulkan masalah saat pengguna menjalankan kueri dengan karakter pengganti. Misalnya, pertimbangkan kondisi negatif resource.name != /projects/my_project/datasets/my_dataset/tables/secret. Kondisi ini tampaknya memberikan akses ke semua resource, kecuali tabel bernama secret. Namun, pengguna tetap dapat membuat kueri tabel tersebut menggunakan kueri karakter pengganti, seperti SELECT * from my_project.my_dataset.secre*;.

Selain itu, kondisi negatif pada tabel, rutinitas, dan model mungkin memberikan akses yang terlalu permisif ke set data induknya. Kemudian, pengguna mungkin dapat menghapus resource tersebut karena izin penghapusan dikelola di tingkat set data.

Batasan

  • Anda tidak dapat menambahkan pemberian tampilan yang diizinkan atau pemberian izin rutinitas yang diotorisasi dengan Kondisi IAM.
  • Jika pengguna memiliki akses kondisional ke set data atau tabel, dia tidak dapat mengubah izin ke resource tersebut melalui konsol Google Cloud. Hanya alat bq dan API yang didukung.
  • Kontrol akses tingkat baris dan tingkat kolom tidak didukung secara langsung melalui Kondisi IAM. Namun, pengguna yang memiliki akses kondisional dapat memberikan perannya sebagai Admin BigQuery (roles/bigquery.admin) pada tabel, kemudian mengubah kebijakan akses baris dan kolom.
  • Perubahan pada kebijakan IAM dapat memerlukan waktu hingga lima menit untuk diterapkan.
  • Pengguna dengan akses kondisional mungkin tidak dapat membuat kueri tampilan INFORMATION_SCHEMA.

Contoh

Berikut adalah contoh kasus penggunaan untuk Kondisi IAM di BigQuery.

Memberikan akses baca ke tabel tertentu

Contoh ini memberikan peran BigQuery Data Viewer kepada cloudysanfrancisco@gmail.com untuk tabel table_1 di set data dataset_1. Dengan peran ini, pengguna dapat membuat kueri tabel dan mengaksesnya melalui alat bq. Pengguna tidak dapat melihat tabel di Google Cloud Console karena tidak memiliki izin bigquery.tables.list di set data tersebut.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

Memberikan akses daftar ke set data tertentu

Contoh ini memberikan peran BigQuery Metadata Viewer kepada cloudysanfrancisco@gmail.com di set data dataset_2. Dengan peran ini, pengguna dapat mencantumkan semua resource dalam set data, tetapi pengguna tidak dapat menjalankan kueri apa pun pada resource tersebut.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

Memberikan akses kepada pemilik ke semua tabel di semua set data dengan awalan tertentu

Contoh ini memberikan peran Pemilik Data BigQuery kepada cloudysanfrancisco@gmail.com pada semua tabel di semua set data yang dimulai dengan awalan public_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

Memberi pemilik akses ke semua tabel, model, dan rutinitas di semua set data yang memiliki awalan tertentu

Contoh ini memberikan peran Pemilik Data BigQuery kepada cloudysanfrancisco@gmail.com di semua tabel, model, dan rutinitas di semua set data yang dimulai dengan awalan general_:

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

Langkah selanjutnya