erp-core/orchestration/03-validacion/REPORTE-RLS-VALIDATION-2026-01-10.md
rckrdmrd 0086695b4c
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
[SIMCO-V38] feat: Actualizar a SIMCO v3.8.0 + cambios backend
- 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>
2026-01-10 08:53:05 -06:00

12 KiB

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:

-- 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

-- 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:

-- 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

# 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