Menggunakan keamanan tingkat baris
Dokumen ini menjelaskan cara menggunakan keamanan tingkat baris di BigQuery untuk membatasi akses ke data di tingkat baris tabel. Sebelum membaca dokumen ini, pahami ringkasan keamanan tingkat baris dengan membaca Pengantar keamanan tingkat baris BigQuery.
Anda dapat melakukan tugas berikut dengan kebijakan akses tingkat baris:
- Membuat atau memperbarui kebijakan akses tingkat baris pada tabel
- Menggabungkan kebijakan akses tingkat baris pada tabel
- Mencantumkan kebijakan akses tingkat baris tabel
- Menghapus kebijakan akses tingkat baris dari tabel
- Mengkueri tabel dengan kebijakan akses tingkat baris
Sebelum memulai
Berikan peran Identity and access Management (IAM) yang memberi pengguna izin yang diperlukan untuk melakukan setiap tugas dalam dokumen ini. Izin yang diperlukan untuk melakukan tugas (jika ada) tercantum di bagian "Izin yang diperlukan" pada tugas.
Membuat atau memperbarui kebijakan akses tingkat baris
Anda dapat membuat atau memperbarui kebijakan akses level baris pada tabel di BigQuery dengan pernyataan bahasa definisi data (DDL).
Izin yang diperlukan
Untuk membuat kebijakan akses tingkat baris pada tabel BigQuery, Anda memerlukan izin IAM berikut:
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(di tabel target dan tabel yang dirujuk dalam kebijakan akses tingkat baris subkueri yang diberikan)bigquery.jobs.create
(untuk menjalankan tugas kueri DDL)
Untuk memperbarui kebijakan akses tingkat baris pada tabel BigQuery, Anda memerlukan izin IAM berikut:
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(di tabel target dan tabel yang dirujuk dalam kebijakan akses tingkat baris subkueri yang diberikan)bigquery.jobs.create
(untuk menjalankan tugas kueri DDL)
Setiap peran IAM yang telah ditetapkan berikut mencakup izin yang Anda perlukan untuk membuat dan memperbarui kebijakan akses tingkat baris:
roles/bigquery.admin
roles/bigquery.dataOwner
Peran bigquery.filteredDataViewer
Saat Anda membuat kebijakan akses tingkat baris, BigQuery
akan otomatis memberikan peran bigquery.filteredDataViewer
kepada anggota
daftar penerima akses. Saat Anda
mencantumkan kebijakan akses tingkat baris tabel
di konsol Google Cloud, peran ini akan ditampilkan terkait dengan anggota
daftar penerima akses kebijakan.
Jangan berikan bigquery.filteredDataViewer
secara manual dengan IAM.
Untuk mengetahui informasi selengkapnya, lihat
praktik terbaik untuk keamanan tingkat baris.
Membuat atau memperbarui kebijakan akses tingkat baris
Untuk membuat atau memperbarui kebijakan akses tingkat baris, gunakan salah satu pernyataan DDL berikut:
CREATE ROW ACCESS POLICY
membuat kebijakan akses tingkat baris yang baru.Pernyataan
CREATE ROW ACCESS POLICY IF NOT EXISTS
akan membuat kebijakan akses tingkat baris baru, jika kebijakan akses tingkat baris dengan nama yang sama belum ada di tabel yang ditentukan.Pernyataan
CREATE OR REPLACE ROW ACCESS POLICY
memperbarui kebijakan akses tingkat baris yang sudah ada dengan nama yang sama di tabel yang ditentukan.
Contoh
Membuat kebijakan akses baris baru. Akses ke tabel dibatasi untuk
pengguna abc@example.com
. Hanya baris tempat region = 'APAC'
terlihat:
CREATE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'APAC');
Memperbarui kebijakan akses untuk diterapkan ke akun layanan example@exampleproject.
:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('serviceAccount:example@exampleproject.') FILTER USING (region = 'APAC');
Membuat kebijakan akses baris yang memberikan akses kepada pengguna dan dua grup:
CREATE ROW ACCESS POLICY sales_us_filter ON project.dataset.my_table GRANT TO ('user:john@example.com', 'group:sales-us@example.com', 'group:sales-managers@example.com') FILTER USING (region = 'US');
Membuat kebijakan akses baris dengan allAuthenticatedUsers
sebagai penerima akses:
CREATE ROW ACCESS POLICY us_filter ON project.dataset.my_table GRANT TO ('allAuthenticatedUsers') FILTER USING (region = 'US');
Membuat kebijakan akses baris dengan filter berdasarkan pengguna saat ini:
CREATE ROW ACCESS POLICY my_row_filter ON dataset.my_table GRANT TO ('domain:example.com') FILTER USING (email = SESSION_USER());
Membuat kebijakan akses baris dengan filter pada kolom dengan
jenis ARRAY
:
CREATE ROW ACCESS POLICY my_reports_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));
Buat kebijakan akses baris dengan subkueri untuk mengganti beberapa kebijakan dengan perbandingan region yang dikonfigurasi per pengguna:
Untuk memberikan masukan atau meminta dukungan terkait fitur ini, kirim email ke bigquery-row-level-security-support@google.com.Pertimbangkan tabel berikut, lookup_table
:
+-----------------+--------------+ | email | region | +-----------------+--------------+ | xyz@example.com | europe-west1 | | abc@example.com | us-west1 | | abc@example.com | us-west2 | +-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (region IN ( SELECT region FROM lookup_table WHERE email = SESSION_USER()));
Dengan menggunakan subkueri di lookup_table
, Anda dapat menghindari pembuatan beberapa kebijakan akses
baris. Misalnya, pernyataan sebelumnya menghasilkan hasil yang sama dengan
berikut, dengan lebih sedikit kueri:
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'us-west1'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region IN 'us-west1', 'us-west2'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:xyz@example.com') FILTER USING (region = 'europe-west1');
Untuk mengetahui informasi selengkapnya tentang sintaksis dan opsi yang tersedia, lihat
referensi
Pernyataan DDL CREATE ROW ACCESS POLICY
.
Menggabungkan kebijakan akses tingkat baris
Jika dua atau lebih kebijakan akses tingkat baris memberi pengguna atau grup akses ke
tabel yang sama, pengguna atau grup tersebut akan memiliki akses ke semua data yang dicakup oleh
salah satu kebijakan tersebut.
Misalnya, kebijakan berikut memberi pengguna
abc@example.com
akses ke baris tertentu dalam tabel my_table
:
CREATE ROW ACCESS POLICY shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (color = 'blue');
Pada contoh sebelumnya, penggunaabc@example.com
memiliki akses ke baris
dalam tabel my_table
yang memiliki kolom product_category
yang ditetapkan ke shoes
, danabc@example.com
juga memiliki akses ke baris yang memiliki kolom color
yang ditetapkan keblue
.
Misalnya, abc@example.com
akan dapat mengakses baris yang berisi informasi
tentang sepatu merah dan mobil biru.
Akses ini sama dengan akses yang diberikan oleh kebijakan akses tingkat baris tunggal berikut:
CREATE ROW ACCESS POLICY shoes_and_blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' OR color = 'blue');
Di sisi lain, untuk menentukan akses yang bergantung pada lebih dari satu
kondisi yang benar, gunakan filter
dengan operator AND
. Misalnya, kebijakan akses tingkat baris berikut
hanya memberi abc@example.com
akses ke baris yang memiliki kolom
product_category
yang ditetapkan ke shoes
dan kolom color
yang ditetapkan ke blue
:
CREATE ROW ACCESS POLICY blue_shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' AND color = 'blue');
Dengan kebijakan akses tingkat baris sebelumnya, abc@example.com
akan dapat
mengakses informasi tentang sepatu biru, tetapi bukan tentang sepatu merah atau mobil biru.
Mencantumkan kebijakan akses tingkat baris tabel
Anda dapat mencantumkan dan melihat semua kebijakan akses tingkat baris pada tabel
menggunakan konsol Google Cloud, alat command line bq, atau metode API
RowAccessPolicies.List
.
Izin yang diperlukan
Untuk mencantumkan kebijakan akses level baris pada tabel BigQuery, Anda memerlukan
izin IAM bigquery.rowAccessPolicies.list
.
Untuk melihat anggota kebijakan akses tingkat baris di tabel
BigQuery, Anda memerlukan izin IAM
bigquery.rowAccessPolicies.getIamPolicy
.
Setiap peran IAM bawaan berikut mencakup izin yang Anda perlukan untuk mencantumkan dan melihat kebijakan akses tingkat baris:
roles/bigquery.admin
roles/bigquery.dataOwner
Untuk mengetahui informasi lebih lanjut tentang peran dan izin IAM di BigQuery, baca Peran dan izin bawaan.
Mencantumkan kebijakan akses tingkat baris tabel
Untuk mencantumkan kebijakan akses tingkat baris, lakukan tindakan berikut:
Konsol
Untuk melihat kebijakan akses tingkat baris, buka halaman BigQuery di konsol Google Cloud.
Klik nama tabel untuk melihat detailnya, lalu klik Lihat kebijakan akses baris.
Saat panel Kebijakan akses baris terbuka, Anda akan melihat daftar semua kebijakan akses tingkat baris pada tabel, berdasarkan nama, dan
filter_expression
untuk setiap kebijakan.Untuk melihat semua peran dan pengguna yang terpengaruh oleh kebijakan akses tingkat baris, klik LIHAT di samping kebijakan. Misalnya, pada gambar berikut, Anda dapat melihat di panel Lihat izin bahwa anggota daftar penerima akses memiliki peran
bigquery.filteredDataViewer
.
bq
Masukkan perintah bq ls
dan berikan flag --row_access_policies
.
Nama set data dan tabel wajib diisi.
bq ls --row_access_policies dataset.table
Misalnya, perintah berikut mencantumkan informasi tentang kebijakan akses
tingkat baris pada tabel bernama my_table
dalam set data dengan
ID my_dataset
:
bq ls --row_access_policies my_dataset.my_table
API
Gunakan
metode RowAccessPolicies.List
di bagian referensi REST API.
Menghapus kebijakan akses tingkat baris
Anda dapat menghapus satu atau semua kebijakan akses tingkat baris pada tabel menggunakan pernyataan DDL, jika Anda memiliki izin untuk melakukannya.
Izin yang diperlukan
Untuk menghapus kebijakan akses tingkat baris, Anda memerlukan izin IAM berikut:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.jobs.create
(untuk menjalankan tugas kueri DDL)
Untuk menghapus semua kebijakan akses tingkat baris pada tabel secara bersamaan, Anda memerlukan izin IAM berikut:
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
bigquery.jobs.create
(untuk menjalankan tugas kueri DDL)
Setiap peran IAM bawaan berikut mencakup izin yang Anda perlukan untuk menghapus kebijakan akses tingkat baris:
roles/bigquery.admin
roles/bigquery.dataOwner
Untuk mengetahui informasi lebih lanjut tentang peran dan izin IAM di BigQuery, baca Peran dan izin bawaan.
Menghapus kebijakan akses tingkat baris
Untuk menghapus kebijakan akses baris dari tabel, gunakan pernyataan DDL berikut:
Pernyataan
DROP ROW ACCESS POLICY
menghapus kebijakan akses tingkat baris pada tabel yang ditentukan.Pernyataan
DROP ROW ACCESS POLICY IF EXISTS
menghapus kebijakan akses tingkat baris jika ada kebijakan akses baris di tabel yang ditentukan.Pernyataan
DROP ALL ROW ACCESS POLICIES
menghapus semua kebijakan akses tingkat baris di tabel yang ditentukan.
Contoh
Menghapus kebijakan akses tingkat baris dari tabel
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
Menghapus semua kebijakan akses tingkat baris dari tabel:
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
Untuk informasi selengkapnya tentang penghapusan kebijakan akses tingkat baris, lihat
referensi
pernyataan DDL DROP ROW ACCESS POLICY
.
Mengkueri tabel dengan kebijakan akses baris
Pertama-tama, pengguna harus memiliki akses ke tabel BigQuery agar dapat
mengkuerinya, meskipun mereka menggunakan grantee_list
kebijakan akses baris pada
tabel tersebut. Tanpa izin tersebut, kueri akan gagal dengan error access
denied
.
Izin yang diperlukan
Untuk mengkueri tabel BigQuery dengan kebijakan akses level baris, Anda
memerlukan izin IAM bigquery.tables.getData
, dan
izin IAM bigquery.rowAccessPolicies.getFilteredData
. Anda
harus memiliki izin IAM bigquery.tables.getData
di semua
tabel yang relevan.
Untuk mendapatkan izin ini dengan peran bawaan, Anda perlu diberi
peran IAM
roles/bigquery.dataViewer
dan
roles/bigquery.filteredDataViewer
.
Anda harus memiliki izin datacatalog.categories.fineGrainedGet
di semua
kolom yang relevan dengan keamanan
tingkat kolom. Untuk mendapatkan izin ini dengan peran bawaan, Anda memerlukan peran datacatalog.categoryFineGrainedReader
.
Melihat hasil kueri
Di konsol Google Cloud, saat Anda membuat kueri tabel dengan kebijakan akses tingkat baris, BigQuery akan menampilkan pemberitahuan banner yang menunjukkan bahwa hasil Anda mungkin difilter oleh kebijakan akses tingkat baris. Pemberitahuan ini akan ditampilkan meskipun Anda adalah anggota daftar penerima akses untuk kebijakan tersebut.
Statistik tugas
Saat Anda mengkueri tabel dengan kebijakan akses tingkat baris menggunakan Job API,
BigQuery akan menunjukkan apakah kueri membaca tabel yang memiliki
kebijakan akses baris dalam objek respons Job
:
Contoh
Respons objek Job
ini telah dipotong agar lebih praktis:
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
Langkah berikutnya
Untuk mengetahui informasi tentang cara kerja keamanan tingkat baris dengan fitur dan layanan BigQuery lainnya, baca Menggunakan keamanan tingkat baris dengan fitur BigQuery lainnya.
Untuk mengetahui informasi tentang praktik terbaik terkait keamanan tingkat baris, lihat Praktik Terbaik untuk keamanan tingkat baris di BigQuery.