Memfilter data tabel sensitif menggunakan filter baris dan masker kolom

Penting

Fitur ini ada di Pratinjau Publik.

Artikel ini menyediakan panduan dan contoh untuk menggunakan filter baris, masker kolom, dan tabel pemetaan untuk memfilter data sensitif dalam tabel Anda.

Apa itu filter baris?

Filter baris memungkinkan Anda menerapkan filter ke tabel sehingga kueri berikutnya hanya mengembalikan baris yang predikat filternya dievaluasi ke true. Filter baris diimplementasikan sebagai fungsi yang ditentukan pengguna (UDF) SQL.

Untuk membuat filter baris, pertama-tama tulis SQL UDF untuk menentukan kebijakan filter lalu terapkan ke tabel dengan ALTER TABLE pernyataan. Atau, Anda dapat menentukan filter baris untuk tabel dalam pernyataan awal CREATE TABLE . Setiap tabel hanya dapat memiliki satu filter baris. Filter baris menerima parameter input nol atau lebih di mana setiap parameter input mengikat ke satu kolom tabel yang sesuai.

Apa perbedaan antara filter ini dan tampilan dinamis?

Tampilan dinamis adalah tampilan baca-saja yang abstrak dari satu atau beberapa tabel sumber. Pengguna dapat mengakses tampilan dinamis tanpa memiliki akses ke tabel sumber secara langsung. Membuat tampilan dinamis menentukan nama tabel baru yang tidak boleh cocok dengan nama tabel sumber atau tabel dan tampilan lain yang ada dalam skema yang sama.

Di sisi lain, mengaitkan filter baris atau masker kolom ke tabel target menerapkan logika yang sesuai langsung ke tabel itu sendiri tanpa memperkenalkan nama tabel baru. Kueri berikutnya dapat terus merujuk langsung ke tabel target menggunakan nama aslinya.

Tampilan dinamis dan filter baris dan masker kolom memungkinkan Anda menerapkan logika kompleks ke tabel dan memproses keputusan pemfilterannya pada runtime kueri.

Gunakan tampilan dinamis jika Anda perlu menerapkan logika transformasi seperti filter dan mask ke tabel baca-saja, dan jika dapat diterima pengguna untuk merujuk ke tampilan dinamis menggunakan nama yang berbeda. Gunakan filter baris dan masker kolom jika Anda ingin memfilter atau menghitung ekspresi atas data tertentu tetapi tetap memberikan pengguna akses ke tabel menggunakan nama aslinya.

Sintaks Filter Baris

Untuk membuat filter baris dan menambahkannya ke tabel yang sudah ada, gunakan sintaks berikut:

Buat filter baris:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {filter clause whose output must be a boolean};

Terapkan filter baris ke tabel:

ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);

Menghapus filter baris dari tabel:

ALTER TABLE <table_name> DROP ROW FILTER;

Ubah filter baris:

Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.

Menghapus filter baris:

ALTER TABLE <table_name> DROP ROW FILTER;
DROP FUNCTION <function_name>;

Catatan

Anda harus melakukan ALTER TABLE ... DROP ROW FILTER perintah sebelum menghilangkan fungsi atau tabel akan dalam keadaan tidak dapat diakses.

Jika tabel menjadi tidak dapat diakses dengan cara ini, ubah tabel dan letakkan referensi filter baris tanpa intim menggunakan ALTER TABLE <table_name> DROP ROW FILTER;.

Contoh filter baris

Buat fungsi yang ditentukan pengguna SQL yang diterapkan ke anggota grup admin di wilayah US.

Dengan fungsi ini, anggota admin grup dapat mengakses semua rekaman dalam tabel. Jika fungsi dipanggil oleh non-admin, RETURN_IF kondisi gagal dan region='US' ekspresi dievaluasi, memfilter tabel untuk hanya menampilkan rekaman di wilayah tersebut US .

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

Terapkan fungsi ke tabel sebagai filter baris. Kueri berikutnya dari sales tabel lalu mengembalikan subkumpulan baris.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

Nonaktifkan filter baris. Kueri pengguna di sales masa mendatang dari tabel lalu mengembalikan semua baris dalam tabel.

ALTER TABLE sales DROP ROW FILTER;

Buat tabel dengan fungsi yang diterapkan sebagai filter baris sebagai bagian dari pernyataan CREATE TABLE. Kueri mendatang sales dari tabel lalu masing-masing mengembalikan subkumpulan baris.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

Apa itu masker kolom?

Masker kolom memungkinkan Anda menerapkan fungsi masking ke kolom tabel. Fungsi masking dievaluasi pada runtime kueri, mengganti setiap referensi kolom target dengan hasil fungsi masking. Untuk sebagian besar kasus penggunaan, masker kolom menentukan apakah akan mengembalikan nilai kolom asli atau meredakannya berdasarkan identitas pengguna yang memanggil. Masker kolom adalah ekspresi yang ditulis sebagai UDF SQL.

Setiap kolom tabel dapat secara opsional memiliki satu fungsi masking yang diterapkan padanya. Fungsi masking mengambil nilai kolom yang tidak dimasak sebagai input dan mengembalikan nilai masked sebagai hasilnya. Nilai pengembalian fungsi masking harus berjenis sama dengan kolom yang diselubungi. Fungsi masking juga dapat mengambil kolom tambahan sebagai parameter input dan menggunakannya dalam logika maskingnya.

Untuk menerapkan masker kolom, buat fungsi dan terapkan ke kolom tabel menggunakan ALTER TABLE pernyataan. Atau, Anda dapat menerapkan fungsi masking saat membuat tabel.

Sintaksis masker kolom

MASK Dalam klausa, Anda dapat menggunakan salah satu fungsi runtime bawaan Azure Databricks atau memanggil fungsi lain yang ditentukan pengguna. Kasus penggunaan umum termasuk memeriksa identitas pengguna yang memanggil yang menjalankan fungsi menggunakan current_user( ) atau grup mana yang mereka adalah anggota menggunakan is_account_group_member( ).

Buat masker kolom:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {expression with the same type as the first parameter};

Terapkan masker kolom ke kolom dalam tabel yang sudah ada:

ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> [USING COLUMNS <additional_columns>];

Hapus masker kolom dari kolom dalam tabel:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;

Mengubah masker kolom:

Baik DROP fungsi yang ada, atau gunakan CREATE OR REPLACE TABLE.

Menghapus masker kolom:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
DROP FUNCTION <function_name>;

Catatan

Anda harus melakukan ALTER TABLE perintah sebelum menghilangkan fungsi atau tabel akan dalam keadaan tidak dapat diakses.

Jika tabel menjadi tidak dapat diakses dengan cara ini, ubah tabel dan hilangkan referensi referensi masker tanpa intim menggunakan ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Contoh masker kolom

Dalam contoh ini, Anda membuat fungsi yang ditentukan pengguna yang menutupi ssn kolom sehingga hanya pengguna yang merupakan anggota grup yang dapat melihat nilai di kolom tersebut HumanResourceDept .

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

Terapkan fungsi baru ke tabel sebagai masker kolom. Anda dapat menambahkan masker kolom saat membuat tabel atau setelahnya.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

Kueri pada tabel tersebut HumanResourceDept sekarang mengembalikan nilai kolom bertopeng ssn saat pengguna kueri bukan anggota grup:

SELECT * FROM users;
  James  ***-**-****

Untuk menonaktifkan masker kolom sehingga kueri mengembalikan nilai asli di ssn kolom:

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Menggunakan tabel pemetaan untuk membuat daftar kontrol akses

Untuk mencapai keamanan tingkat baris, pertimbangkan untuk menentukan tabel pemetaan (atau daftar kontrol akses). Setiap tabel pemetaan adalah tabel pemetaan komprehensif yang mengodekan baris data mana dalam tabel asli yang dapat diakses oleh pengguna atau grup tertentu. Tabel pemetaan berguna karena menawarkan integrasi sederhana dengan tabel fakta Anda melalui gabungan langsung.

Metodologi ini terbukti bermanfaat dalam mengatasi banyak kasus penggunaan dengan persyaratan kustom. Contohnya meliputi:

  • Memberlakukan pembatasan berdasarkan pengguna yang masuk sambil mengakomodasi aturan yang berbeda untuk grup pengguna tertentu.
  • Membuat hierarki yang rumit, seperti struktur organisasi, membutuhkan berbagai set aturan.
  • Mereplikasi model keamanan yang kompleks dari sistem sumber eksternal.

Dengan mengadopsi tabel pemetaan dengan cara ini, Anda dapat secara efektif mengatasi skenario menantang ini dan memastikan implementasi keamanan tingkat baris dan tingkat kolom yang kuat.

Contoh tabel pemetaan

Gunakan tabel pemetaan untuk memeriksa apakah pengguna saat ini berada dalam daftar:

USE CATALOG main;

Buat tabel pemetaan baru:

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

Buat filter baru:

Catatan

Semua filter berjalan dengan hak pendefinisi kecuali untuk fungsi yang memeriksa konteks pengguna (misalnya, CURRENT_USER fungsi dan IS_MEMBER ) yang berjalan sebagai pemanggil.

Dalam contoh ini fungsi memeriksa untuk melihat apakah pengguna saat ini berada dalam valid_users tabel. Jika pengguna ditemukan, fungsi akan mengembalikan true.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

Contoh di bawah ini menerapkan filter baris selama pembuatan tabel. Anda juga dapat menambahkan filter nanti menggunakan ALTER TABLE pernyataan. Saat menerapkan ke seluruh tabel, gunakan ON () sintaks. Untuk baris tertentu, gunakan ON (row);.

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

Pilih data dari tabel. Ini seharusnya hanya mengembalikan data jika pengguna berada dalam valid_users tabel.

SELECT * FROM data_table;

Buat tabel pemetaan yang terdiri dari akun yang harus selalu memiliki akses untuk melihat semua baris dalam tabel, terlepas dari nilai kolom:

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

Sekarang buat SQL UDF yang mengembalikan true jika nilai semua kolom dalam baris kurang dari lima, atau jika pengguna yang memanggil adalah anggota tabel pemetaan di atas.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

Terakhir, terapkan SQL UDF ke tabel sebagai filter baris:

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

Dukungan

  • Notebook Databricks SQL dan Databricks untuk beban kerja SQL didukung.
  • Perintah DML oleh pengguna dengan hak istimewa MODIFIKASI didukung. Filter dan masker diterapkan ke data yang dibaca oleh UPDATEs dan DELETEs dan tidak diterapkan ke data yang ditulis (termasuk data INSERTed).
  • Format yang didukung: Delta dan Parquet. Parquet hanya didukung untuk tabel terkelola atau eksternal.
  • Tampilan pada tabel dengan masker kolom atau filter baris didukung.
  • Umpan data perubahan Delta Lake didukung selama skema kompatibel dengan filter baris dan masker kolom yang mungkin berlaku untuk tabel target.
  • Tabel asing didukung.

Batasan

  • Versi Runtime Databricks di bawah 12.2 LTS tidak mendukung filter baris atau masker kolom. Runtime ini gagal dengan aman, yang berarti jika Anda mencoba mengakses tabel dari versi runtime ini yang tidak didukung, tidak ada data yang dikembalikan.
  • Tampilan terwujud Tabel Langsung Delta dan tabel streaming tidak mendukung filter baris atau masker kolom.
  • UDF Python dan Scala tidak didukung sebagai filter baris atau fungsi masker kolom secara langsung. Namun, dimungkinkan untuk merujuk ke ini di UDF SQL selama definisinya disimpan secara permanen dalam katalog (dengan kata lain, tidak sementara untuk sesi).
  • Berbagi Delta tidak berfungsi dengan keamanan tingkat baris atau masker kolom.
  • Perjalanan waktu tidak berfungsi dengan keamanan tingkat baris atau masker kolom.
  • Pengambilan sampel tabel tidak berfungsi dengan keamanan tingkat baris atau masker kolom.
  • Akses berbasis jalur ke file dalam tabel dengan kebijakan saat ini tidak didukung.
  • Kebijakan filter baris atau masker kolom dengan dependensi melingkar kembali ke kebijakan asli tidak didukung.
  • MERGE dan kloning dangkal tidak didukung.

Batasan kluster pengguna tunggal

Jangan tambahkan filter baris atau masker kolom ke tabel apa pun yang Anda akses dari kluster pengguna tunggal. Ini biasanya dilakukan dalam konteks Pekerjaan Azure Databricks. Selama pratinjau publik, Anda tidak akan dapat mengakses tabel dari satu kluster pengguna setelah filter atau masker diterapkan.