Keamanan tingkat baris di Azure Cosmos DB for PostgreSQL
BERLAKU UNTUK: Azure Cosmos DB for PostgreSQL (didukung oleh ekstensi database Citus ke PostgreSQL)
Kebijakan keamanan tingkat baris PostgreSQL membatasi pengguna mana yang dapat mengubah atau mengakses baris tabel tertentu. Keamanan tingkat baris dapat sangat berguna dalam kluster multi-penyewa. Ini memungkinkan penyewa individu untuk memiliki akses SQL penuh ke database sambil menyembunyikan informasi masing-masing penyewa dari penyewa lain.
Menerapkan untuk aplikasi multi-penyewa
Kita dapat menerapkan pemisahan data penyewa dengan menggunakan konvensi penamaan untuk peran database yang mengikat ke dalam kebijakan keamanan tingkat baris tabel. Kami akan menetapkan peran database kepada setiap penyewa dalam urutan bernomor: tenant1
, , tenant2
dll. Penyewa akan terhubung ke Azure Cosmos DB for PostgreSQL menggunakan peran terpisah ini. Kebijakan keamanan tingkat baris dapat membandingkan nama peran dengan nilai di tenant_id
kolom distribusi untuk memutuskan apakah akan mengizinkan akses.
Berikut cara menerapkan pendekatan tersebut pada tabel peristiwa yang disederhanakan yang didistribusikan oleh tenant_id
. Pertama buat peran tenant1
dan tenant2
. Kemudian jalankan perintah SQL berikut sebagai pengguna administrator citus
:
CREATE TABLE events(
tenant_id int,
id int,
type text
);
SELECT create_distributed_table('events','tenant_id');
INSERT INTO events VALUES (1,1,'foo'), (2,2,'bar');
-- assumes that roles tenant1 and tenant2 exist
GRANT select, update, insert, delete
ON events TO tenant1, tenant2;
Saat ini, siapa pun dengan izin terpilih untuk tabel ini dapat melihat kedua baris. Pengguna dari penyewa mana pun dapat melihat dan memperbarui baris penyewa lain. Kita dapat menyelesaikan kebocoran data dengan kebijakan keamanan tabel tingkat baris.
Setiap kebijakan terdiri dari dua klausul: USING dan WITH CHECK. Saat pengguna mencoba membaca atau menulis baris, database mengevaluasi setiap baris terhadap klausul ini. PostgreSQL memeriksa baris tabel yang ada terhadap ekspresi yang ditentukan dalam klausul USING, dan baris yang akan dibuat melalui INSERT atau UPDATE terhadap klausul WITH CHECK.
-- first a policy for the system admin "citus" user
CREATE POLICY admin_all ON events
TO citus -- apply to this role
USING (true) -- read any existing row
WITH CHECK (true); -- insert or update any row
-- next a policy which allows role "tenant<n>" to
-- access rows where tenant_id = <n>
CREATE POLICY user_mod ON events
USING (current_user = 'tenant' || tenant_id::text);
-- lack of CHECK means same condition as USING
-- enforce the policies
ALTER TABLE events ENABLE ROW LEVEL SECURITY;
Sekarang peran tenant1
dan tenant2
mendapatkan hasil yang berbeda untuk kueri mereka:
Tersambung sebagai penyewa1:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 1 │ 1 │ foo │
└───────────┴────┴──────┘
Tersambung sebagai penyewa2:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 2 │ 2 │ bar │
└───────────┴────┴──────┘
INSERT INTO events VALUES (3,3,'surprise');
/*
ERROR: new row violates row-level security policy for table "events_102055"
*/
Langkah berikutnya
- Pelajari cara membuat peran dalam kluster.
- Lihat konsep keamanan di Azure Cosmos DB for PostgreSQL