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.
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 berikanDATASET_ID
: ID set data yang aksesnya Anda berikanTABLE_ID
: ID tabel yang Anda beri aksesROUTINE_ID
: ID rutinitas yang Anda beri aksesMODEL_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
, atauresource.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
, danresource.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, frasaresource.name.startsWith
berguna jika Anda ingin memungkinkan pengguna menjalankan kueri karakter pengganti. Misalnya, kondisiresource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix")
memungkinkan pengguna menjalankan kueriSELECT * 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
- Pelajari lebih lanjut cara mengonfigurasi akses sementara menggunakan IAM Conditions.
- Pelajari lebih lanjut cara mengonfigurasi akses berbasis resource menggunakan IAM Conditions.