PostgREST Sandbox Multi-Tenant¶
Fecha: 2026-06-02
Objetivo¶
Validar el camino PostgreSQL -> API REST -> OpenAPI sobre datos
completamente ficticios, sin exponer PostgREST a Internet, sin tocar bases
productivas y sin abrir un DNS nuevo.
Que valida¶
- conectividad entre
PostgRESTy elPostgreSQLsandbox - exposicion REST de
tenants,clientes,productosyventas - autenticacion sandbox con
JWT - validacion de claims
tenant_id,role,scope,aud,issyexp - aplicacion efectiva de
RLStambien via API - disponibilidad de
OpenAPIinicial entregado porPostgREST - aislamiento de red sin puertos publicados al host
Que no valida¶
- escritura multi-tenant
- publicacion via
Nginx Proxy Manager ScalarKongAPI keysproductivas- consumo de datos reales
Relacion con PostgreSQL sandbox¶
Este sandbox depende de infra/data-foundation/postgres-sandbox/ y no crea
una base paralela.
Reglas:
- usa solo la red
pg-sandbox-internal - usa solo la base
openclaw_sandbox - usa solo datos ficticios ya sembrados en
sandbox_mt - reutiliza roles lectores ya validados por
RLS - refuerza las policies con
tenant_iddel claim cuando existe token
Relacion con API Platform¶
Esta etapa implementa la primera seguridad runtime del contrato definido en API-PLATFORM.md.
Concretamente valida:
- que
PostgRESTpuede ser la primera capa REST real - que el aislamiento por tenant no depende solo de la URL
- que el rol SQL puede venir desde el claim
role - que la lectura cross-tenant sigue bloqueada por
RLS
Relacion con futuros OpenAPI y Scalar¶
PostgREST sigue entregando un OpenAPI inicial en el endpoint raiz interno.
Eso permite:
- confirmar que existe una fuente runtime para contratos de API
- documentar la futura integracion con
Scalar - reservar
developers.alpuntodeventa.com.arpara15.6 - mantener
15.4completamente interno
Diseno 15.4 aprobado¶
La etapa 15.4 reemplaza los tres runtimes fijos de 15.3 por un unico
runtime interno:
openclaw-postgrest-sandbox
Propiedades del runtime:
- rol SQL derivado desde claim
role - claim
tenant_iddisponible para reforzarRLS - claim
scopedocumentado y emitido en tokens sandbox - enforcement granular de
scopepor recurso viadb-pre-request - validacion de
audyexpporPostgREST - validacion de
issy consistenciarole/tenant_idpordb-pre-request - secreto
JWTfuera de Git - solo lectura
- sin puertos publicados al host
Restricciones de seguridad¶
- no publicar puertos al host
- no unir el stack a
proxy-network - no crear hostnames ni DNS nuevos
- no usar
developers.alpuntodeventa.com.artodavia - no instalar
Scalar - no instalar
Kong - no guardar passwords o secretos reales en el repo
- no abrir escritura mientras no exista necesidad real
- no mezclar datos reales con el sandbox
Por que no se expone publicamente¶
Aunque ahora existe JWT, esta etapa sigue siendo solo de validacion interna.
Se mantiene cerrada porque todavia faltan:
- politica final de
API keys - documentacion interactiva real
- reglas de exposicion segura
- auditoria de consumo mas completa
Artefactos¶
infra/data-foundation/postgrest-sandbox/docker-compose.ymlinfra/data-foundation/postgrest-sandbox/.env.exampleinfra/data-foundation/postgrest-sandbox/README.mdinfra/data-foundation/postgrest-sandbox/bootstrap/bootstrap-authenticator.shinfra/data-foundation/postgrest-sandbox/bootstrap/reconcile-postgrest-security.sqlinfra/data-foundation/postgrest-sandbox/tools/generate-sandbox-jwt.py
URL interna esperada¶
- Runtime:
http://openclaw-postgrest-sandbox:3000/
Validacion objetivo¶
- Sin token: acceso rechazado.
- Token APV: solo ve
alpuntodeventa. - Token La Directa: solo ve
ladirecta. - Token Global: puede ver ambos tenants.
- Filtro cruzado devuelve
[]. - Token expirado: rechazo.
- Token invalido: rechazo.
docker inspectmuestraPortBindingsvacio onull.- No aparecen secretos en compose, docs ni logs operativos.
Scope enforcement activo¶
En 15.4b el sandbox ya aplica scope enforcement dentro de
sandbox_private.enforce_postgrest_claims.
Contrato runtime:
/clientes->read:clientesoread:all/productos->read:productosoread:all/ventas->read:ventasoread:all/tenants->read:all/-> accesible con token valido para mantenerOpenAPIinterno- otros recursos -> rechazo por fuera del contrato del sandbox
La seguridad sigue apoyandose en capas:
PostgRESTvalida firma,audy expiraciondb-pre-requestvalidaiss, claims, recurso yscopeRLSmantiene el aislamiento real portenant_id
Evidencia runtime final en VPS¶
Validacion final ejecutada el 2026-06-02:
openclaw-postgres-sandboxse mantuvohealthyopenclaw-postgrest-sandboxquedorunningdocker inspectdevolvioPortBindings {}y solo la redpg-sandbox-internalapv-clientespudo leer/clientessolo paraalpuntodeventay recibio403en/ventasy/productosapv-ventaspudo leer/ventassolo paraalpuntodeventay recibio403en/clientesladirecta-productospudo leer/productossolo paraladirectay recibio403en/ventasglobal-allpudo leer/clientes,/productos,/ventasy/tenantsviendo ambos tenants ficticios- token sin
scopey token conscopedesconocido recibieron403 - token invalido y token expirado recibieron
401 - token con
issinvalido recibio403 - la raiz
/respondio200solo con token valido - no se detectaron secretos ni tokens en los logs revisados