- 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>
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_idpublic.get_current_user_idpublic.get_current_company_id
Auth:
auth.user_has_permissionauth.clean_expired_sessionsauth.update_updated_at_columnauth.validate_tenant_has_adminauth.auto_expire_sessionauth.cleanup_expired_email_verification_tokensauth.update_user_mfa_updated_at
Core Shared:
core_shared.set_updated_atcore_shared.set_tenant_idcore_shared.set_created_bycore_shared.set_updated_bycore_shared.get_current_tenant_idcore_shared.get_current_user_id
Financial:
financial.validate_entry_balancefinancial.post_journal_entryfinancial.calculate_invoice_totalsfinancial.update_invoice_paid_amountfinancial.trg_validate_entry_before_postfinancial.trg_update_invoice_totalsfinancial.trg_update_invoice_paid
CRM:
crm.calculate_lead_scorecrm.auto_assign_leadcrm.merge_leadscrm.convert_lead_to_opportunitycrm.action_set_lostcrm.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
- Primero:
rls-validation.sql- Verifica configuracion base - Segundo:
sql-functions.sql- Verifica funciones necesarias - 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.sqlincluye 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
-
Los tests estan bien estructurados y cubren los aspectos criticos de seguridad multi-tenant.
-
La cobertura es amplia, abarcando 84 tablas y 30 funciones en todos los schemas principales.
-
Los tests son idempotentes y seguros para ejecutar en cualquier ambiente.
-
El patron de RLS es consistente, usando
tenant_idcomo columna de discriminacion yapp.current_tenant_idcomo variable de sesion. -
Se incluyen tests de seguridad criticos para validar que no hay acceso cross-tenant (SELECT, UPDATE, DELETE bloqueados).
9. PROXIMOS PASOS
- Ejecutar
rls-validation.sqly documentar resultados - Ejecutar
sql-functions.sqly documentar resultados - Ejecutar
tenant-isolation.sqly documentar resultados - Corregir cualquier
[FAIL]o[CRITICAL]detectado - Revisar
[WARN]y decidir si requieren accion - Documentar evidencia de ejecucion exitosa
Documento generado automaticamente por tarea DB-002 Fecha de analisis: 2026-01-10