Some checks failed
ERP Core CI / Backend Lint (push) Has been cancelled
ERP Core CI / Backend Unit Tests (push) Has been cancelled
ERP Core CI / Backend Integration Tests (push) Has been cancelled
ERP Core CI / Frontend Lint (push) Has been cancelled
ERP Core CI / Frontend Unit Tests (push) Has been cancelled
ERP Core CI / Frontend E2E Tests (push) Has been cancelled
ERP Core CI / Database DDL Validation (push) Has been cancelled
ERP Core CI / Backend Build (push) Has been cancelled
ERP Core CI / Frontend Build (push) Has been cancelled
ERP Core CI / CI Success (push) Has been cancelled
Performance Tests / Lighthouse CI (push) Has been cancelled
Performance Tests / Bundle Size Analysis (push) Has been cancelled
Performance Tests / k6 Load Tests (push) Has been cancelled
Performance Tests / Performance Summary (push) Has been cancelled
- HERENCIA-SIMCO.md actualizado con directivas v3.7 y v3.8 - Actualizaciones en modulos CRM y OpenAPI Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
340 lines
12 KiB
Markdown
340 lines
12 KiB
Markdown
# REPORTE DE VALIDACION RLS (Row Level Security)
|
|
|
|
**Proyecto:** ERP-Core
|
|
**Fecha:** 2026-01-10
|
|
**Tarea:** DB-002 - Ejecutar y validar tests de RLS
|
|
**Estado:** ANALISIS COMPLETADO
|
|
|
|
---
|
|
|
|
## 1. RESUMEN EJECUTIVO
|
|
|
|
Se analizaron 3 archivos de tests SQL que validan la implementacion de Row Level Security (RLS) y funciones relacionadas en el sistema ERP-Core. Los tests cubren:
|
|
|
|
- **Verificacion de RLS habilitado** en todas las tablas criticas
|
|
- **Aislamiento multi-tenant** con pruebas de cross-tenant access
|
|
- **Validacion de funciones SQL** necesarias para el funcionamiento de RLS
|
|
|
|
---
|
|
|
|
## 2. ARCHIVOS ANALIZADOS
|
|
|
|
| Archivo | Proposito | Secciones |
|
|
|---------|-----------|-----------|
|
|
| `rls-validation.sql` | Validar configuracion de RLS en tablas | 10 |
|
|
| `tenant-isolation.sql` | Probar aislamiento entre tenants | 12 |
|
|
| `sql-functions.sql` | Validar funciones SQL del sistema | 8 |
|
|
|
|
---
|
|
|
|
## 3. DETALLE DE TESTS POR ARCHIVO
|
|
|
|
### 3.1. rls-validation.sql
|
|
|
|
**Autor:** Database-Agent (DB-002)
|
|
**Fecha creacion:** 2026-01-06
|
|
**Total de tests:** 10 secciones
|
|
|
|
#### Tests incluidos:
|
|
|
|
| # | Nombre del Test | Descripcion | Criticidad |
|
|
|---|-----------------|-------------|------------|
|
|
| 1 | VERIFICACION DE RLS HABILITADO EN TABLAS | Verifica que RLS este habilitado en 80+ tablas de todos los schemas principales (auth, core, financial, inventory, sales, purchase, projects) | ALTA |
|
|
| 2 | VERIFICACION DE POLICIES EXISTENTES | Verifica que existan policies RLS definidas para 14 tablas criticas | ALTA |
|
|
| 3 | VERIFICACION DE PATRON tenant_id EN POLICIES | Valida que las policies usen el patron estandar de tenant_id o hereden via FK | MEDIA |
|
|
| 4 | VERIFICACION DE FUNCION get_current_tenant_id() | Prueba la existencia y comportamiento de la funcion de contexto de tenant | ALTA |
|
|
| 5 | CONSISTENCIA tenant_id vs RLS | Verifica que tablas con columna tenant_id tengan RLS habilitado | CRITICA |
|
|
| 6 | VERIFICACION DE POLICIES CON COBERTURA COMPLETA | Analiza si las policies cubren ALL operaciones o son especificas | MEDIA |
|
|
| 7 | TABLAS SIN RLS EN SCHEMAS PRINCIPALES | Lista tablas sin RLS y distingue catalogos globales de posibles problemas | MEDIA |
|
|
| 8 | CONSISTENCIA EN METODO DE OBTENCION DE TENANT | Detecta inconsistencias entre uso de get_current_tenant_id() vs current_setting() | BAJA |
|
|
| 9 | VERIFICACION DE TABLAS CRITICAS | Valida RLS en 8 tablas criticas del negocio | CRITICA |
|
|
| 10 | RESUMEN FINAL DE CONFIGURACION RLS | Estadisticas globales de la configuracion RLS | INFO |
|
|
|
|
#### Tablas criticas validadas:
|
|
|
|
```
|
|
- auth.users
|
|
- auth.companies
|
|
- financial.invoices
|
|
- financial.payments
|
|
- financial.journal_entries
|
|
- inventory.stock_moves
|
|
- sales.sales_orders
|
|
- purchase.purchase_orders
|
|
```
|
|
|
|
#### Schemas cubiertos:
|
|
|
|
- `auth` (companies, users, roles)
|
|
- `core` (partners, product_categories, tags, sequences, attachments, notes, etc.)
|
|
- `financial` (accounts, journals, invoices, payments, taxes, bank_accounts, etc.)
|
|
- `inventory` (products, warehouses, locations, lots, stock_quants, pickings, etc.)
|
|
- `sales` (sales_orders, quotations, pricelists, customer_groups, etc.)
|
|
- `purchase` (purchase_orders, rfqs, vendor_pricelists, agreements, etc.)
|
|
- `projects` (projects, tasks, milestones, timesheets, etc.)
|
|
|
|
---
|
|
|
|
### 3.2. tenant-isolation.sql
|
|
|
|
**Autor:** Database-Agent (DB-002)
|
|
**Fecha creacion:** 2026-01-06
|
|
**Total de tests:** 9 tests de aislamiento
|
|
|
|
#### Tests incluidos:
|
|
|
|
| # | Nombre del Test | Descripcion | Tipo |
|
|
|---|-----------------|-------------|------|
|
|
| 0 | CLEANUP PREVIO | Limpia datos de prueba anteriores para idempotencia | SETUP |
|
|
| 1 | SETUP TENANTS DE PRUEBA | Crea 2 tenants (Alpha y Beta) con companies, users y partners | SETUP |
|
|
| 2.1 | AISLAMIENTO EN auth.users | Verifica que cada tenant solo ve sus propios usuarios | AISLAMIENTO |
|
|
| 2.2 | AISLAMIENTO EN auth.companies | Verifica que cada tenant solo ve sus propias empresas | AISLAMIENTO |
|
|
| 2.3 | AISLAMIENTO EN core.partners | Verifica aislamiento de partners (3 por tenant) | AISLAMIENTO |
|
|
| 3 | INTENTO DE ACCESO CROSS-TENANT (SELECT) | Prueba que Tenant Alpha NO puede ver datos de Tenant Beta | SEGURIDAD |
|
|
| 4 | INTENTO DE UPDATE CROSS-TENANT | Prueba que Tenant Alpha NO puede modificar datos de Tenant Beta | SEGURIDAD |
|
|
| 5 | INTENTO DE DELETE CROSS-TENANT | Prueba que Tenant Alpha NO puede eliminar datos de Tenant Beta | SEGURIDAD |
|
|
| 6 | INSERT CON tenant_id INCORRECTO | Prueba que no se puede insertar con tenant_id de otro tenant | SEGURIDAD |
|
|
| 7 | ACCESO SIN CONTEXTO DE TENANT | Verifica comportamiento cuando no hay contexto de tenant definido | SEGURIDAD |
|
|
| 8 | CAMBIO DE CONTEXTO ENTRE TENANTS | Verifica que cambiar contexto aisla correctamente los datos | AISLAMIENTO |
|
|
|
|
#### Datos de prueba creados:
|
|
|
|
| Entidad | Tenant Alpha | Tenant Beta |
|
|
|---------|--------------|-------------|
|
|
| Tenants | TEST_Tenant_Alpha | TEST_Tenant_Beta |
|
|
| Companies | TEST_Company_Alpha | TEST_Company_Beta |
|
|
| Users | admin@test-tenant-alpha.com | admin@test-tenant-beta.com |
|
|
| Partners | 3 (2 customers, 1 supplier) | 3 (2 customers, 1 supplier) |
|
|
|
|
---
|
|
|
|
### 3.3. sql-functions.sql
|
|
|
|
**Autor:** Testing-Agent (TEST-005)
|
|
**Fecha creacion:** 2026-01-07
|
|
**Total de tests:** 8 secciones
|
|
|
|
#### Tests incluidos:
|
|
|
|
| # | Nombre del Test | Descripcion | Funciones Validadas |
|
|
|---|-----------------|-------------|---------------------|
|
|
| 1 | VERIFICACION DE EXISTENCIA DE FUNCIONES | Verifica que existan 25+ funciones criticas | Todas listadas abajo |
|
|
| 2 | FUNCION get_current_tenant_id() | Prueba comportamiento con/sin contexto de tenant | public.get_current_tenant_id |
|
|
| 3 | FUNCION get_current_user_id() | Prueba comportamiento con/sin contexto de usuario | public.get_current_user_id |
|
|
| 4 | FUNCION auth.update_updated_at_column() | Valida que sea trigger y actualice updated_at | auth.update_updated_at_column |
|
|
| 5 | FUNCIONES TRIGGER core_shared | Valida set_updated_at, set_tenant_id, set_created_by | core_shared.* |
|
|
| 6 | FUNCIONES FINANCIAL | Valida funciones de contabilidad | financial.* |
|
|
| 7 | FUNCIONES CRM | Valida funciones de gestion de leads/oportunidades | crm.* |
|
|
| 8 | RESUMEN FINAL | Estadisticas de funciones por schema | N/A |
|
|
|
|
#### Funciones validadas por schema:
|
|
|
|
**Public/Global:**
|
|
- `public.get_current_tenant_id`
|
|
- `public.get_current_user_id`
|
|
- `public.get_current_company_id`
|
|
|
|
**Auth:**
|
|
- `auth.user_has_permission`
|
|
- `auth.clean_expired_sessions`
|
|
- `auth.update_updated_at_column`
|
|
- `auth.validate_tenant_has_admin`
|
|
- `auth.auto_expire_session`
|
|
- `auth.cleanup_expired_email_verification_tokens`
|
|
- `auth.update_user_mfa_updated_at`
|
|
|
|
**Core Shared:**
|
|
- `core_shared.set_updated_at`
|
|
- `core_shared.set_tenant_id`
|
|
- `core_shared.set_created_by`
|
|
- `core_shared.set_updated_by`
|
|
- `core_shared.get_current_tenant_id`
|
|
- `core_shared.get_current_user_id`
|
|
|
|
**Financial:**
|
|
- `financial.validate_entry_balance`
|
|
- `financial.post_journal_entry`
|
|
- `financial.calculate_invoice_totals`
|
|
- `financial.update_invoice_paid_amount`
|
|
- `financial.trg_validate_entry_before_post`
|
|
- `financial.trg_update_invoice_totals`
|
|
- `financial.trg_update_invoice_paid`
|
|
|
|
**CRM:**
|
|
- `crm.calculate_lead_score`
|
|
- `crm.auto_assign_lead`
|
|
- `crm.merge_leads`
|
|
- `crm.convert_lead_to_opportunity`
|
|
- `crm.action_set_lost`
|
|
- `crm.action_set_won`
|
|
|
|
**HR:**
|
|
- `hr.calculate_worked_hours`
|
|
|
|
---
|
|
|
|
## 4. ESTRUCTURA DE POLITICAS RLS IDENTIFICADAS
|
|
|
|
### 4.1. Patron Principal de RLS
|
|
|
|
Las policies RLS siguen un patron estandar basado en:
|
|
|
|
```sql
|
|
-- Metodo 1: Usando funcion dedicada
|
|
tenant_id = get_current_tenant_id()
|
|
|
|
-- Metodo 2: Usando current_setting directamente
|
|
tenant_id = current_setting('app.current_tenant_id')::UUID
|
|
```
|
|
|
|
### 4.2. Variable de Sesion
|
|
|
|
```sql
|
|
-- Establecer contexto de tenant
|
|
PERFORM set_config('app.current_tenant_id', '<tenant_uuid>', true);
|
|
|
|
-- Obtener contexto actual
|
|
SELECT get_current_tenant_id();
|
|
|
|
-- Resetear contexto
|
|
RESET app.current_tenant_id;
|
|
```
|
|
|
|
### 4.3. Herencia via Foreign Keys
|
|
|
|
Algunas tablas secundarias heredan el aislamiento via FK:
|
|
|
|
```sql
|
|
-- Ejemplo: timesheets hereda de tasks que hereda de projects
|
|
WHERE task_id IN (SELECT id FROM projects.tasks WHERE tenant_id = get_current_tenant_id())
|
|
```
|
|
|
|
---
|
|
|
|
## 5. RECOMENDACIONES PARA EJECUCION
|
|
|
|
### 5.1. Orden de Ejecucion Recomendado
|
|
|
|
1. **Primero:** `rls-validation.sql` - Verifica configuracion base
|
|
2. **Segundo:** `sql-functions.sql` - Verifica funciones necesarias
|
|
3. **Tercero:** `tenant-isolation.sql` - Prueba aislamiento real
|
|
|
|
### 5.2. Prerequisitos
|
|
|
|
- Ejecutar como superusuario PostgreSQL o rol con permisos suficientes
|
|
- Base de datos ERP-Core con todos los schemas creados
|
|
- Tablas y policies ya desplegadas (DDL ejecutado)
|
|
- Funcion `get_current_tenant_id()` disponible en schema public
|
|
|
|
### 5.3. Comandos de Ejecucion
|
|
|
|
```bash
|
|
# Desde la linea de comandos
|
|
psql -U superuser -d erp_core -f /path/to/rls-validation.sql
|
|
psql -U superuser -d erp_core -f /path/to/sql-functions.sql
|
|
psql -U superuser -d erp_core -f /path/to/tenant-isolation.sql
|
|
|
|
# O conectado a psql
|
|
\i rls-validation.sql
|
|
\i sql-functions.sql
|
|
\i tenant-isolation.sql
|
|
```
|
|
|
|
### 5.4. Interpretacion de Resultados
|
|
|
|
| Indicador | Significado |
|
|
|-----------|-------------|
|
|
| `[PASS]` | Test exitoso |
|
|
| `[FAIL]` | Test fallido - requiere atencion inmediata |
|
|
| `[WARN]` | Advertencia - revisar configuracion |
|
|
| `[INFO]` | Informativo - no requiere accion |
|
|
| `[SKIP]` | Test omitido (tabla no existe) |
|
|
| `[CRITICAL]` | Falla de seguridad critica |
|
|
|
|
### 5.5. Notas de Idempotencia
|
|
|
|
- Todos los tests son idempotentes y pueden ejecutarse multiples veces
|
|
- `tenant-isolation.sql` incluye cleanup automatico al inicio y al final
|
|
- Los datos de prueba usan prefijo `TEST_` para facil identificacion
|
|
|
|
---
|
|
|
|
## 6. POSIBLES PROBLEMAS DETECTADOS
|
|
|
|
### 6.1. Inconsistencia en Metodo de Obtencion de Tenant
|
|
|
|
El test 8 de `rls-validation.sql` detecta si hay policies usando diferentes metodos:
|
|
- `get_current_tenant_id()` (funcion)
|
|
- `current_setting('app.current_tenant_id')` (directo)
|
|
|
|
**Recomendacion:** Estandarizar en `get_current_tenant_id()` para mantenibilidad.
|
|
|
|
### 6.2. Tablas sin RLS pero con tenant_id
|
|
|
|
El test 5 de `rls-validation.sql` identifica tablas que tienen columna `tenant_id` pero no tienen RLS habilitado. Esto es un **riesgo de seguridad critico**.
|
|
|
|
### 6.3. Acceso sin Contexto de Tenant
|
|
|
|
El test 7 de `tenant-isolation.sql` verifica el comportamiento cuando no hay contexto de tenant. El resultado esperado depende de la configuracion:
|
|
- **RESTRICTIVE policy:** No deberia mostrar ningun dato
|
|
- **PERMISSIVE policy:** Comportamiento puede variar
|
|
|
|
---
|
|
|
|
## 7. METRICAS DE COBERTURA
|
|
|
|
### 7.1. Cobertura de Tablas
|
|
|
|
| Schema | Tablas Esperadas con RLS |
|
|
|--------|--------------------------|
|
|
| auth | 3 (companies, users, roles) |
|
|
| core | 8 (partners, categories, tags, sequences, attachments, notes, duplicates, banks) |
|
|
| financial | 22 (accounts, journals, invoices, payments, taxes, etc.) |
|
|
| inventory | 22 (products, warehouses, locations, stock_moves, etc.) |
|
|
| sales | 9 (orders, quotations, pricelists, etc.) |
|
|
| purchase | 9 (orders, rfqs, agreements, evaluations, etc.) |
|
|
| projects | 11 (projects, tasks, milestones, timesheets, etc.) |
|
|
| **TOTAL** | **84 tablas** |
|
|
|
|
### 7.2. Cobertura de Funciones
|
|
|
|
| Schema | Funciones Validadas |
|
|
|--------|---------------------|
|
|
| public | 3 |
|
|
| auth | 7 |
|
|
| core_shared | 6 |
|
|
| financial | 7 |
|
|
| crm | 6 |
|
|
| hr | 1 |
|
|
| **TOTAL** | **30 funciones** |
|
|
|
|
---
|
|
|
|
## 8. CONCLUSIONES
|
|
|
|
1. **Los tests estan bien estructurados** y cubren los aspectos criticos de seguridad multi-tenant.
|
|
|
|
2. **La cobertura es amplia**, abarcando 84 tablas y 30 funciones en todos los schemas principales.
|
|
|
|
3. **Los tests son idempotentes** y seguros para ejecutar en cualquier ambiente.
|
|
|
|
4. **El patron de RLS es consistente**, usando `tenant_id` como columna de discriminacion y `app.current_tenant_id` como variable de sesion.
|
|
|
|
5. **Se incluyen tests de seguridad criticos** para validar que no hay acceso cross-tenant (SELECT, UPDATE, DELETE bloqueados).
|
|
|
|
---
|
|
|
|
## 9. PROXIMOS PASOS
|
|
|
|
1. [ ] Ejecutar `rls-validation.sql` y documentar resultados
|
|
2. [ ] Ejecutar `sql-functions.sql` y documentar resultados
|
|
3. [ ] Ejecutar `tenant-isolation.sql` y documentar resultados
|
|
4. [ ] Corregir cualquier `[FAIL]` o `[CRITICAL]` detectado
|
|
5. [ ] Revisar `[WARN]` y decidir si requieren accion
|
|
6. [ ] Documentar evidencia de ejecucion exitosa
|
|
|
|
---
|
|
|
|
**Documento generado automaticamente por tarea DB-002**
|
|
**Fecha de analisis:** 2026-01-10
|