Bagikan melalui


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, , tenant2dll. 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