Validacion Multi-Tenant Sandbox¶
Estado: VALIDADO EN VPS
Objetivo¶
Validar que el sandbox PostgreSQL respete separacion de lectura entre
alpuntodeventa y ladirecta, y que la base no quede expuesta
publicamente.
Comandos de validacion¶
1. Validar compose¶
bash
cd /opt/stacks/openclaw/infra/data-foundation/postgres-sandbox
docker compose config
docker compose ps
2. Levantar sandbox¶
bash
docker compose up -d
3. Listar tenants¶
bash
docker exec -i openclaw-postgres-sandbox \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
-c "select tenant_id, tenant_name from sandbox_mt.tenants order by tenant_id;"
Resultado esperado:
alpuntodeventaladirecta
4. Consultar ventas como alpuntodeventa¶
bash
docker exec -i openclaw-postgres-sandbox \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
-c "set role app_alpuntodeventa_reader; select tenant_id, sale_reference from sandbox_mt.ventas order by id; reset role;"
Resultado esperado:
- solo fila
alpuntodeventa - referencia
Venta Demo APV
5. Consultar ventas como ladirecta¶
bash
docker exec -i openclaw-postgres-sandbox \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
-c "set role app_ladirecta_reader; select tenant_id, sale_reference from sandbox_mt.ventas order by id; reset role;"
Resultado esperado:
- solo fila
ladirecta - referencia
Venta Demo La Directa
6. Intentar acceso cruzado¶
bash
docker exec -i openclaw-postgres-sandbox \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
-c "set role app_alpuntodeventa_reader; select tenant_id, sale_reference from sandbox_mt.ventas where tenant_id = 'ladirecta'; reset role;"
Resultado esperado:
0 rows
7. Confirmar lectura global autorizada¶
bash
docker exec -i openclaw-postgres-sandbox \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
-c "set role app_global_reader; select tenant_id, sale_reference from sandbox_mt.ventas order by tenant_id, id; reset role;"
Resultado esperado:
- una fila de
alpuntodeventa - una fila de
ladirecta
8. Confirmar no exposicion publica¶
bash
docker ps --filter name=openclaw-postgres-sandbox
docker inspect openclaw-postgres-sandbox --format '{{json .HostConfig.PortBindings}}'
ss -ltnp | grep 5432
Resultado esperado:
- sin
PortBindingspublicados - sin
0.0.0.0:5432 - sin
127.0.0.1:5432salvo que se configure explicitamente para pruebas
Evidencia minima a registrar¶
- salida de
docker compose ps - salida de consultas por rol
- confirmacion de
0 rowsen acceso cruzado - confirmacion de ausencia de publicacion del puerto
5432