“RLS” e “multi-tenant” são encontrados lado a lado em quase todo o conteúdo já publicado sobre o assunto – uma escolha legítima para muitas arquiteturas SaaS, mas que não é a escolha da Aurabase para separar seus próprios clientes uns dos outros. Esta postagem explica a diferença entre o mecanismo de provisionamento real e as políticas de RLS realmente aplicadas, e não uma descrição simplificada de marketing. Para uma visão geral do que o mecanismo Managed Postgres do Aurabase cobre além do isolamento, consulte a documentação do banco de dados .
O essencial
- Entre projetos, o Aurabase isola por base Postgres dedicada, nunca apenas por RLS — cada projeto tem sua própria base física, em um cluster CNPG dedicado (nível de empresa) ou no cluster CNPG de sua própria organização (gratuito/pro/equipe), nunca compartilhado com outra organização.
- O RLS (
auth.uid(),auth.role(),auth.jwt()) permanece ativo e recomendado dentro de sua base, para isolar seus próprios usuários — mesma convenção do Supabase. service_rolee funções de administração baseadas em projeto ignoram o RLS por design (BYPASSRLS): uma escolha arquitetônica assumida para operações de servidor, não uma falha.- Uma regressão já corrigida neste repositório - direitos
PUBLICconcedidos erroneamente em esquemas compartilhados antigos - ilustra concretamente por que uma borda no nível base resiste melhor do que uma borda puramente de aplicativo.
O atalho que a maioria dos guias de RLS multilocatários usa
O padrão mais documentado para Postgres multilocatário consiste em três linhas: uma única base, uma coluna tenant_id em cada tabela, uma política RLS que compara esta coluna a um valor extraído do JWT. É econômico – um conjunto de conexões, um diagrama, uma única instância para executar – e funciona bem quando os inquilinos são numerosos, pequenos e de baixa participação individual.
O compromisso é real: o limite entre dois clientes torna-se uma expressão SQL , avaliada tabela por tabela. Uma política esquecida em uma nova tabela, uma conexão em execução com uma função de superusuário, um script de depuração lançado ao vivo — cada um desses incidentes, por mais trivial que seja em operação, pode expor silenciosamente as linhas de todos os inquilinos ao mesmo tempo. A fronteira de segurança e a fronteira técnica (a base) são então exactamente a mesma coisa.
Esta não é uma má escolha por si só – é o compromisso certo para muitos produtos. O objetivo desta postagem está em outro lugar: este não é o compromisso que a Aurabase fez para separar seus próprios clientes (projetos inteiros, potencialmente com requisitos de conformidade diferentes) uns dos outros.
Duas arquiteturas, nunca uma base compartilhada entre projetos
Desde uma recente consolidação do provisionador (marcado no código como "Tarefa 12"), um projeto Postgres ativo no Aurabase se enquadra exatamente em duas arquiteturas - os modelos antigos com uma base realmente compartilhada entre vários projetos foram removidos do caminho de provisionamento.
O nível do projeto decide qual dos dois se aplica — e é o código que decide, não uma caixa marcada em um painel:
| Dimensões | Totalmente Dedicado (empresa) | SharedClusterDedicated (gratuito/profissional/equipe) |
|---|---|---|
| Cluster CNPG | Dedicado a este projeto | Compartilhado, mas nunca entre duas organizações |
| Banco de dados Postgres | aplicativo, apenas projete nele | project_<uuid>, um por projeto no cluster |
| Login PostgreSQL | Um único projeto no cluster: sem risco de associação cruzada | Login por projeto (F-013), membro de suas únicas funções tenant_<uuid> |
Em ambas as arquiteturas, a base ou cluster nunca hospeda duas organizações diferentes — portanto, a questão não é “seus dados estão isolados”, mas “seu projeto tem computação CloudNativePG só para si ou os compartilha com outros projetos na mesma organização”.
Esta consolidação de duas arquiteturas é recente: o código anteriormente carregava dois caminhos adicionais – um “mestre compartilhado” onde vários projetos coexistiam em um mesmo banco de dados, isolados apenas por diagrama, e uma variante postgrest_dedicated_shared_db. Uma migração dedicada os removeu e reforçou a restrição da tabela projects para apenas os dois valores restantes, precisamente porque o modelo de esquema compartilhado foi a origem do bug descrito abaixo.
Por que uma base dedicada é melhor que um EPIRB compartilhado entre clientes
Um banco de dados Postgres separado é um limite no nível da conexão, não um limite no nível da linha. Uma função de aplicativo conectada ao banco de dados do projeto A simplesmente não pode consultar as tabelas do projeto B — ela não possui uma sessão aberta para ela. Esta propriedade é válida mesmo se uma política RLS estiver mal escrita, faltando em uma tabela ou ignorada por uma função elevada: o pior caso permanece confinado em um único banco de dados.
Este depósito também traz vestígios de um bug real que ilustra o risco oposto. No antigo modelo de esquema compartilhado (já retirado), provision_postgres_schema concedeu por engano direitos GRANT ALL ... TO PUBLIC a cada esquema de projeto - PUBLIC aplicando a todas as funções no banco de dados sem condições de associação, um login isolado por projeto poderia ler e gravar no esquema de outro. Uma migração corretiva (066) removeu esses direitos do existente.
O patch não adicionou mais uma política RLS para tapar o vazamento – ele removeu a possibilidade de dois projetos compartilharem um banco de dados. Sobre as duas arquiteturas atuais, um comentário de provisioning.rs documenta em preto e branco: “cada projeto já possui seu próprio banco de dados físico Postgres”. Um limite de nível básico torna uma classe inteira desses bugs simplesmente inacessível, em vez de depender de que cada política seja sempre escrita corretamente.
Um patch de 23 de agosto de 2026 vai na mesma direção: um REVOKE ALL ON SCHEMA public colocado incondicionalmente pelo provisionador foi tornado condicional à topologia, porque só fornecia isolamento real no antigo modelo de banco de dados compartilhado — nas duas arquiteturas atuais, bloqueava sem benefício a importação de dumps SQL que referenciam explicitamente public.<table>.
O EPIRB permanece lá — em seu banco de dados, para seus usuários
Nenhuma das opções acima torna o EPIRB inútil – ele apenas muda de piso. Uma vez em seu banco de dados do projeto, Aurabase expõe exatamente a convenção PostgREST adotada por Supabase: três funções SQL que leem as declarações JWT definidas pelo gateway em request.jwt.claims.
Esses auxiliares são usados nas políticas reais do próprio Aurabase - não apenas documentadas para as suas. Aqui está a política que protege storage_objects, conforme ela é colocada no repositório (reformatada em diversas linhas para leitura):
Em seu próprio esquema project_<uuid>, aquele que carrega suas tabelas de aplicação, o Aurabase deliberadamente não coloca nenhuma política em seu nome — o código o documenta como um “modelo Supabase”: o RLS de suas tabelas permanece de sua responsabilidade, com as mesmas funções, a mesma sintaxe.
service_role ignora RLS – por design, não por acidente
O Postgres oferece nativamente um atributo de função , BYPASSRLS, que ignora todas as políticas. Aurabase o utiliza voluntariamente em duas famílias de funções: aura_service_role (a função de servidor, nunca exposta no lado do navegador) e a função de administração específica para cada projeto, usada durante operações DDL como ALTER SCHEMA ... OWNER TO.
A função que atende suas solicitações anon/authenticated — tenant_<uuid> — não possui nenhum BYPASSRLS: o RLS se aplica a ela normalmente, sem exceção. Como bônus, os diagramas de sistema específicos para cada projeto (_auth, _storage, _platform) recebem um RLS ativado sem política — portanto, uma recusa total por padrão para qualquer função não-bypass, uma defesa profunda caso um caminho de aplicativo o acesse um dia por engano.
Ignorar o RLS com uma função de servidor elevada não é exclusivo do Aurabase – é a mesma construção que service_role no lado do Supabase. O objetivo não é evitar BYPASSRLS, é nunca concedê-lo a uma função acessível a partir de um cliente e confiná-lo a um único projeto.
Essa função de servidor faz parte de uma postura mais ampla — funções predefinidas, RBAC personalizado, logs de auditoria — detalhada na página Segurança e RBAC.
Em um cluster compartilhado, o banco de dados não faz todo o trabalho sozinho
No nível SharedClusterDedicated, vários projetos da mesma organização coexistem em um único cluster CNPG. O banco de dados físico já separa os projetos uns dos outros, mas as funções do PostgreSQL — elas — são objetos globais para o cluster, não para o banco de dados. Aurabase, portanto, adiciona uma camada: um login PostgreSQL separado por projeto.
Cada projeto se conecta com seu próprio login, membro apenas de suas próprias funções tenant_<uuid> / tenant_<uuid>_admin — nunca aquelas de outro projeto no mesmo cluster. O banco de dados já isola os dados; Esse login por projeto também isola a identidade que se conecta a ele, de modo que um incidente em um projeto não dê ao seu login nenhuma associação para herdar de outro.
RLS sozinho ou base dedicada: como decidir pelo seu próprio SaaS
A escolha da Aurabase não é uma regra universal — é um compromisso para um caso específico: isolar clientes uns dos outros, potencialmente com requisitos de conformidade diferentes, numa plataforma que não controlam. Se você está construindo seu próprio SaaS, a mesma pergunta surge para você, em uma escala diferente.
- RLS com
tenant_idem base compartilhada — relevante quando seus locatários são numerosos, individualmente de baixa participação, e o custo de uma base por locatário seria desproporcional. Teste cada política compg_prove, em cada tabela, sem exceção. - Base ou diagrama dedicado — relevante sempre que um inquilino tem seu próprio problema de conformidade (saúde, RH, setor público), um volume que justifica o isolamento de desempenho ou o custo de um vazamento entre dois clientes específicos seria desproporcional ao custo de infraestrutura adicional.
O nível de preços Aurabase aplica esta mesma arbitragem aos seus próprios clientes: base partilhada por organização por defeito, cluster dedicado quando o desafio do projecto o justifica. Para padrões RLS dentro de seu próprio banco de dados — propriedade, multilocatário por organização, hierarquia de funções — o guia RLS em produção detalha os três casos com testes pgTAP. E se a API gerada automaticamente em seu diagrama lhe interessa além do REST, a comparação em pg_graphql versus Hasura e PostGraphile cobre a outra metade da superfície Postgres exposta pelo Aurabase.