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:

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

  1. Untuk melihat kebijakan akses tingkat baris, buka halaman BigQuery di konsol Google Cloud.

    Buka BigQuery

  2. Klik nama tabel untuk melihat detailnya, lalu klik Lihat kebijakan akses baris.

    Lihat kebijakan akses baris

  3. 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.

    Detail kebijakan akses baris

  4. 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.

    Detail kebijakan akses baris

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.

Hasil kueri pada tabel dengan kebijakan akses tingkat baris

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