"RLS" ve "çok kiracılı", konuyla ilgili halihazırda yayınlanmış içeriğin neredeyse tamamında yan yana bulunuyor; birçok SaaS mimarisi için meşru bir seçim, ancak bu, Aurabase'in kendi müşterilerini birbirinden ayırma tercihi değil. Bu gönderide, basitleştirilmiş bir pazarlama açıklaması değil, gerçek provizyon motoru ile gerçekte uygulanan RLS politikaları arasındaki fark açıklanmaktadır. Aurabase'in Yönetilen Postgres motorunun izolasyonun ötesinde neler kapsadığına ilişkin genel bir bakış için veritabanıbelgelerine bakın.
Temeller
- Aurabase, projeler arasında özel Postgres tabanıyla izolasyon yapar, asla tek başına RLS tarafından değil; her projenin kendi fiziksel tabanı vardır, özel bir CNPG kümesinde (şirket düzeyinde) veya kendi kuruluşunun CNPG kümesinde (ücretsiz/profesyonel/ekip) asla başka bir kuruluşla paylaşılmaz.
- RLS (
auth.uid(),auth.role(),auth.jwt()) aktif kalır ve kendi kullanıcılarınızı izole etmek için tabanınızda önerilir; Supabase ile aynı kural. service_roleve proje tabanlı yönetim rolleri, tasarım gereği RLS'yi atlar (BYPASSRLS): sunucu işlemleri için varsayılan bir mimari tercihtir, bir kusur değildir.- Bu depoda zaten düzeltilmiş olan bir gerileme - eski paylaşılan şemalarda yanlışlıkla verilen
PUBLIChakları - temel düzeydeki bir sınırın neden salt uygulama sınırından daha iyi direnç gösterdiğini somut olarak göstermektedir.
Çok kiracılı RLS kılavuzlarının çoğunun kullandığı kısayol
Çok kiracılı Postgres için en çok belgelenen model üç satırdan oluşur: tek bir taban, her tabloda bir tenant_id sütunu, bu sütunu JWT'den çıkarılan bir değerle karşılaştıran bir RLS politikası. Ekonomiktir (bir bağlantı havuzu, bir diyagram, çalıştırılacak tek bir örnek) ve kiracılar çok sayıda, küçük ve bireysel riskin düşük olduğu durumlarda iyi çalışır.
Uzlaşma gerçektir: iki istemci arasındaki sınır, tablo tablo değerlendirilen bir SQL ifadesi haline gelir. Yeni bir tabloda unutulan bir politika, süper kullanıcı rolüyle çalışan bir bağlantı, canlı olarak başlatılan bir hata ayıklama komut dosyası; bu olayların her biri, operasyonda ne kadar önemsiz olursa olsun, tüm kiracıların hatlarını aynı anda sessizce açığa çıkarabilir. O halde güvenlik sınırı ve teknik sınır (temel) tamamen aynı şeydir.
Bu kendi başına kötü bir seçim değil; birçok ürün için doğru bir uzlaşmadır. Bu yazının amacı başka bir yerde: Bu, Aurabase'in kendi müşterilerini (potansiyel olarak farklı uyumluluk gereksinimlerine sahip tüm projeler) birbirinden ayırmak için yaptığı bir uzlaşma değildir.
İki mimari, asla projeler arasında paylaşılmayan bir temel
Provizyonun yakın zamanda birleştirilmesinden bu yana (kodda "Görev 12" olarak işaretlenmiştir), Aurabase'deki aktif bir Postgres projesi tam olarak iki mimarinin kapsamına girmektedir - aslında birkaç proje arasında paylaşılan bir tabanı olan eski modeller, provizyon yolundan kaldırılmıştır.
İkisinden hangisinin geçerli olduğuna proje düzeyi karar verir ve bunu kontrol panelinde işaretlenen kutu değil, kod belirler:
| Boyutlar | Tamamen Özel (şirket) | SharedClusterDedicated (ücretsiz/profesyonel/ekip) |
|---|---|---|
| CNPG kümesi | Bu tek projeye adanmış | Paylaşılır ancak asla iki kuruluş arasında paylaşılmaz |
| Postgres veritabanı | uygulama, yalnızca proje üzerinde | project_<uuid>, kümedeki proje başına bir tane |
| PostgreSQL Girişi | Kümede tek bir proje: çapraz üyelik riski yok | Proje başına oturum açma (F-013), tek rollerinin üyesi kiracı_<uuid> |
Her iki mimaride de taban veya küme hiçbir zaman iki farklı kuruluşa ev sahipliği yapmaz; dolayısıyla soru "verileriniz izole edilmiş mi" değil, "projeniz CloudNativePG hesaplamasına sahip mi, yoksa bunu aynı kuruluştaki diğer projelerle paylaşıyor mu?"
İki mimarinin bu şekilde birleştirilmesi yakın zamanda gerçekleşti: kod daha önce iki ek yol taşıyordu; birkaç projenin aynı veritabanında bir arada bulunduğu, yalnızca diyagramla izole edilmiş bir "paylaşılan ana" ve bir postgrest_dedicated_shared_dbçeşidi. Özel bir geçiş, bunları kaldırdı ve projects tablosunun kısıtlamasını yalnızca kalan iki değerle sıkılaştırdı; çünkü tam olarak paylaşılan şema modeli, aşağıda açıklanan hatanın kaynağıydı.
Özel bir taban neden müşteriler arasında paylaşılan bir EPIRB'den daha üstün?
Ayrı bir Postgres veritabanı, satır düzeyinde bir sınır değil, bağlantı düzeyinde bir sınırdır. A projesinin veritabanına bağlı bir uygulama rolü, B projesinin tablolarını sorgulayamaz; kendisine açık bir oturumu yoktur. Bu özellik, bir RLS politikası kötü yazılmış olsa, bir tabloda eksik olsa veya yüksek bir rol tarafından atlansa bile geçerlidir: en kötü durum, tek bir veritabanında sınırlı kalır.
Bu mevduat aynı zamanda tam tersi riski gösteren gerçek bir hatanın izini de taşıyor. Eski paylaşılan şema modelinde (geri çekildikten sonra), provision_postgres_schema yanlışlıkla her proje şemasına GRANT ALL ... TO PUBLIC hakları verdi - üyelik koşulları olmadan veritabanındaki tüm rollere uygulanan PUBLIC, proje başına yalıtılmış bir oturum açma işlemi, diğerinin şemasını okuyabilir ve yazabilir. Düzeltici bir geçiş (066), bu hakları mevcut haklardan kaldırdı.
Yama, sızıntıyı gidermek için bir RLS politikası daha eklemedi; iki projenin bir veritabanını paylaşma olasılığını ortadan kaldırdı. Mevcut iki mimariye ilişkin provisioning.rs'den gelen bir yorum bunu siyah beyaz olarak belgeliyor: "her projenin zaten kendi fiziksel Postgres veritabanı var". Temel düzeyde bir sınır, her politikanın her zaman doğru yazılmasına güvenmek yerine, bu tür hataların bulunduğu sınıfın tamamını erişilemez hale getirir.
23 Ağustos 2026 tarihli bir yama da aynı yönde ilerliyor: Provizyon sağlayıcı tarafından koşulsuz olarak yerleştirilen bir REVOKE ALL ON SCHEMA public topolojiye bağlı hale getirildi, çünkü yalnızca eski paylaşılan veritabanı modelinde gerçek izolasyon sağladı; mevcut iki mimaride, açıkça public.<table>referansına sahip SQL dökümlerinin içe aktarılmasını hiçbir fayda sağlamadan engelledi.
EPIRB, kullanıcılarınız için veritabanınızda orada kalır
Yukarıdakilerin hiçbiri EPIRB'i işe yaramaz hale getirmez; yalnızca katları değiştirir. proje veritabanınıza girdikten sonra Aurabase, Supabasetarafından alınan PostgREST kuralını tam olarak ortaya çıkarır: request.jwt.claimsiçindeki ağ geçidi tarafından ayarlanan JWT taleplerini okuyan üç SQL işlevi.
Bu yardımcılar, yalnızca sizin için belgelenmiş değil, Aurabase'in gerçek politikalarında da kullanılır. storage_objectsdeposuna yerleştirildiği şekliyle (okunması için birkaç satırda yeniden biçimlendirilmiş) koruyan politika aşağıdadır:
Uygulama tablolarınızı taşıyan kendi project_<uuid>şemanızda, Aurabase kasıtlı olarak sizin adınıza herhangi bir politika yerleştirmez; kod bunu bir "Supabase modeli" olarak belgelemektedir: tablolarınızın RLS'si, aynı işlevler ve aynı sözdizimiyle sizin sorumluluğunuzda kalır.
service_role RLS'yi atlıyor — tasarım gereği, tesadüf değil
Postgres yerel olarak tüm politikaları göz ardı eden , BYPASSRLSrol özelliğini sunar. Aurabase bunu gönüllü olarak iki rol ailesinde kullanır: aura_service_role (tarayıcı tarafında hiçbir zaman gösterilmeyen sunucu rolü) ve ALTER SCHEMA ... OWNER TOgibi DDL işlemleri sırasında kullanılan, her projeye özel yönetim rolü.
anon/authenticated — tenant_<uuid> — isteklerinize hizmet eden rolde herhangi bir BYPASSRLSyoktur: RLS, istisnasız olarak buna normal şekilde uygulanır. Bonus olarak, her projeye özel sistem diyagramları (_auth, _storage, _platform) politika olmadan etkinleştirilmiş bir RLS alır; dolayısıyla bypass olmayan herhangi bir rol için varsayılan olarak tamamen reddedilme, bir uygulama yolunun bir gün yanlışlıkla ona erişmesi durumunda derinlemesine bir savunma.
RLS'yi yükseltilmiş bir sunucu rolüyle atlamak Aurabase'e özgü değildir; Supabase tarafındaki service_role ile aynı yapıdır. Önemli olan BYPASSRLS'dan kaçınmak değil, onu hiçbir zaman istemciden erişilebilen bir role vermemek ve onu tek bir projeyle sınırlamaktır.
Bu sunucu rolü, Güvenlik ve RBACsayfasında ayrıntıları verilen önceden tanımlanmış roller, özel RBAC, denetim günlükleri gibi daha geniş bir duruşun parçasıdır.
Paylaşılan bir kümede veritabanı tüm işi tek başına yapmaz
SharedClusterDedicateddüzeyinde, aynı kuruluştan çeşitli projeler tek bir CNPG kümesinde bir arada bulunur. Fiziksel veritabanı zaten projeleri birbirinden ayırıyor ancak PostgreSQL rolleri (onlar) veritabanına değil kümeye yönelik küresel nesnelerdir. Bu nedenle Aurabase bir katman ekler: proje başına ayrı bir PostgreSQL girişi.
Her proje kendi oturum açma bilgileriyle bağlanır, yalnızca kendi tenant_<uuid> / tenant_<uuid>_admin rollerinin üyesidir; asla aynı kümedeki başka bir projenin üyeleri değildir. Veritabanı zaten verileri izole ediyor; Proje başına bu oturum açma işlemi aynı zamanda kendisine bağlanan kimliği de yalıtır, böylece bir projedeki bir olay, oturum açma bilgilerinin bir başkasına devralınacak herhangi bir üyeliğini vermez.
Tek başına RLS veya özel taban: kendi SaaS'ınıza nasıl karar verilir?
Aurabase'in seçimi evrensel bir kural değildir; belirli bir duruma yönelik bir uzlaşmadır: potansiyel olarak farklı uyumluluk gereksinimlerine sahip müşterileri, kontrol etmedikleri bir platformda birbirlerinden izole etmek. Kendi SaaS'ınızı oluşturuyorsanız, aynı soru farklı bir ölçekte sizin için de ortaya çıkıyor.
- Paylaşılan bir tabanda
tenant_idile RLS — kiracılarınız çok sayıda olduğunda, bireysel olarak düşük hisseye sahip olduğunda ve kiracı başına bir tabanın maliyeti orantısız olduğunda geçerlidir. İstisnasız her tablodaki her politikayıpg_proveile test edin. - Özel taban veya diyagram — kiracının kendi uyumluluk sorunu (sağlık, İK, kamu sektörü) olduğunda, performans izolasyonunu haklı çıkaran bir hacimde veya iki belirli müşteri arasındaki bir sızıntının maliyetinin ek altyapı maliyetiyle orantısız olacağı durumlarda geçerlidir.
Aurabase fiyatlandırma düzeyi aynı kararı kendi müşterilerine de uygular: varsayılan olarak kuruluşa göre paylaşılan taban, projenin zorluğu gerektirdiğinde özel küme. Kendi veritabanınızdaki RLS kalıpları için (sahiplik, kuruluşa göre çok kiracılı, rol hiyerarşisi) üretimdeki RLS kılavuzu, pgTAPtestleriyle üç durumu ayrıntılarıyla anlatır. Diyagramınızda otomatik olarak oluşturulan API, REST'in ötesinde ilginizi çekiyorsa, pg_graphql ile Hasura ve PostGraphile arasındaki karşılaştırma, Aurabase tarafından açığa çıkarılan Postgres yüzeyinin diğer yarısını kapsar.