„RLS” i „multi-tenant” występują obok siebie w prawie wszystkich treściach już opublikowanych na ten temat – jest to uzasadniony wybór w przypadku wielu architektur SaaS, ale nie jest to decyzja Aurabase mająca na celu oddzielenie od siebie własnych klientów. W tym poście wyjaśniono różnicę w stosunku do prawdziwego mechanizmu udostępniania i faktycznie zastosowanych zasad RLS, a nie uproszczony opis marketingowy. Aby zapoznać się z przeglądem funkcjonalności zarządzanego silnika Postgres firmy Aurabase poza izolacją, zobacz dokumentację bazy danych .
Najważniejsze
- Pomiędzy projektami Aurabase izoluje za pomocą dedykowanej bazy Postgres, nigdy za pomocą samego RLS — każdy projekt ma swoją własną bazę fizyczną, w dedykowanym klastrze CNPG (poziom firmy) lub w klastrze CNPG własnej organizacji (free/pro/team), nigdy nie współdzielonym z inną organizacją.
- RLS (
auth.uid(),auth.role(),auth.jwt()) pozostaje aktywny i zalecany w twojej bazie, aby odizolować własnych użytkowników - taka sama konwencja jak Supabase. service_rolei role administracyjne oparte na projektach omijają RLS z założenia (BYPASSRLS): przyjęty wybór architektury dla operacji serwera, a nie wada.- Regresja już poprawiona w tym repozytorium - prawa
PUBLICprzyznane błędnie na starych wspólnych schematach - konkretnie ilustruje, dlaczego granica na poziomie podstawowym jest bardziej odporna niż granica czysto aplikacyjna.
Skrót używany przez większość przewodników RLS dla wielu dzierżawców
Najbardziej udokumentowany wzorzec dla Postgres z wieloma dzierżawcami składa się z trzech linii: pojedynczej podstawy, kolumny tenant_id w każdej tabeli, polityki RLS, która porównuje tę kolumnę z wartością wyodrębnioną z JWT. Jest ekonomiczne — pula połączeń, diagram, pojedyncza instancja do uruchomienia — i sprawdza się dobrze, gdy najemcy są liczni, mali i mają niski indywidualny udział.
Kompromis jest prawdziwy: granica między dwoma klientami staje się wyrażeniem SQL, ocenianym tabela po tabeli. Zapomniana polityka na nowym stole, połączenie działające z rolą superużytkownika, uruchomiony na żywo skrypt debugowania – każdy z tych incydentów, niezależnie od tego, jak banalny jest w działaniu, może po cichu ujawnić linie wszystkich najemców jednocześnie. Granica bezpieczeństwa i granica techniczna (podstawa) są zatem dokładnie tym samym.
Nie jest to sam w sobie zły wybór – to właściwy kompromis w przypadku wielu produktów. Cel tego postu jest inny: nie jest to kompromis, jaki Aurabase poczyniła, aby oddzielić od siebie swoich klientów (całe projekty, potencjalnie z różnymi wymaganiami dotyczącymi zgodności).
Dwie architektury, nigdy baza współdzielona pomiędzy projektami
Od czasu niedawnej konsolidacji dostawcy usług (oznaczonego w kodzie jako „Zadanie 12”), aktywny projekt Postgres w Aurabase podlega dokładnie dwóm architekturom - stare modele z bazą faktycznie współdzieloną pomiędzy kilkoma projektami zostały usunięte ze ścieżki udostępniania.
Poziom projektu decyduje, który z nich ma zastosowanie — i to kod decyduje, a nie pole zaznaczone na pulpicie nawigacyjnym:
| Wymiary | W pełni dedykowany (firma) | SharedClusterDedykowany (bezpłatny/pro/zespół) |
|---|---|---|
| klaster CNPG | Poświęcony temu jednemu projektowi | Wspólne, ale nigdy pomiędzy dwiema organizacjami |
| Baza danych Postgresa | app, tylko projektuj na niej | projekt_<uuid>, jeden na projekt w klastrze |
| Logowanie do PostgreSQL | Pojedynczy projekt w klastrze: brak ryzyka wzajemnego członkostwa | Zaloguj się do projektu (F-013), członek jego jedynych ról najemca_<uuid> |
W obu architekturach baza lub klaster nigdy nie obsługują dwóch różnych organizacji — więc pytanie nie brzmi „czy dane są izolowane”, ale „czy Twój projekt ma obliczenia CloudNativePG tylko dla siebie, czy też udostępnia je innym projektom w tej samej organizacji”.
Ta konsolidacja dwóch architektur nastąpiła niedawno: kod prowadził wcześniej dwie dodatkowe ścieżki – „wspólny wzorzec”, w którym kilka projektów współistniało w tej samej bazie danych, izolowanych jedynie za pomocą diagramu, oraz wariant postgrest_dedicated_shared_db. Dedykowana migracja usunęła je i zaostrzyła ograniczenie tabeli projects tylko do dwóch pozostałych wartości, właśnie dlatego, że źródłem błędu opisanego poniżej był wspólny model schematu.
Dlaczego dedykowana baza przewyższa EPIRB współdzielony przez klientów
Oddzielna baza danych Postgres stanowi granicę na poziomie połączenia, a nie na poziomie wiersza. Rola aplikacji połączona z bazą danych projektu A po prostu nie może wysyłać zapytań do tabel projektu B — nie ma dla niej otwartej sesji. Ta właściwość obowiązuje nawet wtedy, gdy polityka RLS jest źle napisana, nie ma jej w tabeli lub jest pomijana przez dużą rolę: najgorszy przypadek pozostaje zamknięty w jednej bazie danych.
Depozyt ten nosi także ślad prawdziwego błędu, który ilustruje ryzyko odwrotne. W starym modelu schematu współdzielonego (od czasu wycofania) provision_postgres_schema błędnie przyznał GRANT ALL ... TO PUBLIC prawa do każdego schematu projektu - PUBLIC stosując się do wszystkich ról w bazie danych bez warunków członkostwa, login izolowany dla każdego projektu mógł czytać i zapisywać w schemacie innego. Migracja naprawcza (066) usunęła te prawa z istniejących.
Łatka nie dodała jeszcze jednej polityki RLS, aby załatać wyciek — usunęła samą możliwość współdzielenia bazy danych przez dwa projekty. Na temat dwóch obecnych architektur komentarz provisioning.rs dokumentuje to czarno na białym: „każdy projekt ma już własną fizyczną bazę danych Postgres”. Granica na poziomie podstawowym sprawia, że cała klasa takich błędów jest po prostu nieosiągalna, zamiast polegać na tym, że każda polityka jest zawsze pisana poprawnie.
Łatka z 23 sierpnia 2026 roku idzie w tym samym kierunku: REVOKE ALL ON SCHEMA public umieszczony bezwarunkowo przez dostawcę usług został uzależniony od topologii, ponieważ zapewniał rzeczywistą izolację tylko na starym modelu współdzielonej bazy danych — w dwóch obecnych architekturach blokował bez korzyści import zrzutów SQL, które jawnie odwołują się do public.<table>.
EPIRB pozostaje tam — w Twojej bazie danych, dla Twoich użytkowników
Żadne z powyższych nie sprawia, że EPIRB jest bezużyteczny — po prostu zmienia piętra. Po wejściu do bazy danych projektu, Aurabase udostępnia dokładnie konwencję PostgREST przyjętą przez Supabase: trzy funkcje SQL, które odczytują oświadczenia JWT ustawione przez bramę w request.jwt.claims.
Pomocnicy ci są wykorzystywani w rzeczywistych politykach samego Aurabase — nie tylko udokumentowanych dla Ciebie. Oto polityka, która chroni storage_objects, gdy jest umieszczona w repozytorium (przeformatowana w kilku wierszach do odczytu):
W Twoim własnym schemacie project_<uuid>, tym, który zawiera tabele aplikacji, Aurabase celowo nie umieszcza żadnych polityk w Twoim imieniu — kod dokumentuje to jako „model Supabase”: za RLS Twoich tabel pozostaje Twoja odpowiedzialność, z tymi samymi funkcjami i tą samą składnią.
service_role omija RLS — zgodnie z projektem, a nie przez przypadek
Postgres natywnie oferuje atrybut roli , BYPASSRLS, który ignoruje wszystkie zasady. Aurabase dobrowolnie używa go w dwóch rodzinach ról: aura_service_role (rola serwera, nigdy nie ujawniana po stronie przeglądarki) i rola administracyjna specyficzna dla każdego projektu, używana podczas operacji DDL, takich jak ALTER SCHEMA ... OWNER TO.
Rola obsługująca Twoje żądania anon/authenticated — tenant_<uuid> — nie ma żadnego BYPASSRLS: RLS ma do niej zastosowanie normalnie, bez wyjątku. Jako bonus, diagramy systemu specyficzne dla każdego projektu (_auth, _storage, _platform) otrzymują aktywowany RLS bez polityki — zatem domyślnie całkowita odmowa dla jakiejkolwiek roli nieobejściowej, dogłębna obrona na wypadek, gdyby ścieżka aplikacji pewnego dnia przez pomyłkę uzyskała do niej dostęp.
Omijanie RLS z podwyższoną rolą serwera nie jest charakterystyczne dla Aurabase — jest to ta sama konstrukcja, co service_role po stronie Supabase. Nie chodzi o to, aby unikać BYPASSRLS, chodzi o to, aby nigdy nie przypisywać jej roli dostępnej z poziomu klienta i ograniczyć ją do jednego projektu.
Ta rola serwera jest częścią szerszej sytuacji — wstępnie zdefiniowanych ról, niestandardowego RBAC, dzienników inspekcji — szczegółowo opisano na stronie Bezpieczeństwo i RBAC.
W klastrze współdzielonym baza danych nie wykonuje całej pracy samodzielnie
Na poziomie SharedClusterDedicatedkilka projektów tej samej organizacji współistnieje w jednym klastrze CNPG. Fizyczna baza danych oddziela już projekty od siebie, ale role PostgreSQL — one — są obiektami globalnymi dla klastra, a nie dla bazy danych. Dlatego Aurabase dodaje warstwę: oddzielny login PostgreSQL dla każdego projektu.
Każdy projekt łączy się za pomocą własnego loginu i jest członkiem tylko swoich ról tenant_<uuid> / tenant_<uuid>_admin — nigdy ról innego projektu w tym samym klastrze. Baza danych już izoluje dane; Ten login dla projektu izoluje również tożsamość, która się z nim łączy, więc incydent w projekcie nie powoduje, że jego login może odziedziczyć inny.
Sam RLS czy dedykowana baza: jak zdecydować się na własny SaaS
Wybór Aurabase nie jest uniwersalną zasadą – jest to kompromis w konkretnym przypadku: izolowanie od siebie klientów, potencjalnie mających różne wymagania zgodności, na platformie, nad którą nie mają kontroli. Jeśli budujesz własny SaaS, pojawia się to samo pytanie, w innej skali.
- RLS z
tenant_idwe wspólnej bazie — istotne, gdy twoi najemcy są liczni, indywidualnie o niskiej stawce, a koszt bazy na dzierżawcę byłby nieproporcjonalny. Przetestuj każdą zasadę za pomocąpg_provew każdej tabeli, bez wyjątku. - Dedykowana baza lub diagram — ma zastosowanie w przypadku, gdy najemca ma własne problemy związane ze zgodnością (zdrowie, HR, sektor publiczny), wolumen uzasadniający izolację wydajności lub koszt wycieku pomiędzy dwoma konkretnymi klientami byłby nieproporcjonalny do kosztu dodatkowej infrastruktury.
Poziom cenowy Aurabase stosuje ten sam arbitraż do swoich własnych klientów: domyślnie współdzielona baza dla organizacji, dedykowany klaster, gdy uzasadnia to wyzwanie związane z projektem. W przypadku wzorców RLS we własnej bazie danych — własność, wielu dzierżawców według organizacji, hierarchia ról — przewodnik RLS w środowisku produkcyjnym szczegółowo opisuje trzy przypadki z testami pgTAP. A jeśli automatycznie wygenerowany interfejs API na Twoim diagramie interesuje Cię poza REST, porównanie pg_graphql z Hasurą i PostGraphile obejmuje drugą połowę powierzchni Postgres odsłoniętej przez Aurabase.