DBAtlas · Veritabanı operasyon atlası

Row-level security ile kiracı (tenant) izolasyonu kur

PostgreSQLGüvenlik

Komut

ALTER TABLE app.siparis ENABLE ROW LEVEL SECURITY;
-- Tablo sahibi de politikaya tabi olsun
ALTER TABLE app.siparis FORCE ROW LEVEL SECURITY;

CREATE POLICY siparis_tenant_isolation ON app.siparis
  FOR ALL
  TO app_readwrite
  USING (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::int)
  WITH CHECK (tenant_id = NULLIF(current_setting('app.tenant_id', true), '')::int);

-- Uygulama her transaction başında kiracıyı belirler (pooler ile uyumlu)
BEGIN;
SET LOCAL app.tenant_id = '42';
SELECT * FROM app.siparis;
COMMIT;

-- Tanımlı politikalar
SELECT schemaname, tablename, policyname, roles, cmd, qual, with_check
FROM pg_policies
WHERE tablename = 'siparis';

Ne yapar?

Tabloda RLS'i etkinleştirir ve oturum değişkenindeki kiracı kimliğine göre satırları filtreleyen (USING) ve başka kiracıya yazmayı engelleyen (WITH CHECK) bir politika tanımlar.

Ne zaman kullanılır?

Çok kiracılı (multi-tenant) uygulamalarda veri izolasyonunu uygulama koduna bırakmadan veritabanında zorlamak için.

Dikkat

Superuser'lar ve BYPASSRLS özniteliğine sahip roller politikaları her zaman atlar; tablo sahibi yalnızca FORCE ROW LEVEL SECURITY ile tabi olur. RLS açık olup eşleşen politika yoksa sonuç boş döner (hata vermez). current_setting(..., true) değişken tanımsızsa NULL döner; NULLIF, RESET sonrası boş string'in ''::int hatası vermesini önler. Kullanıcı app.tenant_id'yi SET ile değiştirebilir; değeri yalnızca güvenilir uygulama katmanı ayarlamalı, son kullanıcıya SQL erişimi verilmemeli. Pooler (transaction modu) kullanılıyorsa SET yerine SET LOCAL kullan. Politika ifadesindeki tenant_id kolonuna index ekle. RLS'ye tabi bir kullanıcıyla pg_dump hata verir; yedeği BYPASSRLS'li rolle al.

DBAtlas'ta aç →

İlgili