Análisis de Arquitectura: NovaSaaS Platform
Resumen Ejecutivo
Este informe presenta el análisis de la plataforma SaaS B2B de NovaSaaS tras una auditoría de 3 semanas. La plataforma presenta deuda técnica significativa en el módulo de facturación y una arquitectura de microservicios parcialmente implementada que genera inconsistencias en la capa de datos.
Se detectaron 3 vulnerabilidades críticas de seguridad en el módulo de autenticación que requieren atención inmediata antes de continuar con cualquier nueva funcionalidad.
| Área | Estado | Prioridad |
|---|---|---|
| Autenticación | Crítico | P0 |
| Base de datos | Degradado | P1 |
| API Gateway | Estable | P2 |
| Frontend | Obsoleto | P2 |
| Facturación | Roto | P0 |
Estado Actual
Infraestructura
La plataforma está desplegada en AWS con una arquitectura híbrida monolito-microservicios:
- Backend principal:
Node.js 16 (EOL)+ Express 4.18 - Base de datos: PostgreSQL 13 (sin pooling de conexiones)
- Cache: Redis 6.2 (configuración por defecto, sin eviction policy)
- Frontend: React 17 + Webpack 4 (sin code splitting)
- Autenticación: JWT con secretos hardcodeados en
.env.production
Node.js 16 llegó a End-of-Life en septiembre 2023. La plataforma lleva 30+ meses sin actualizaciones de seguridad en el runtime.
Métricas de Rendimiento
| Métrica | Valor Actual | Objetivo | Estado |
|---|---|---|---|
| P50 latencia API | 340 ms | < 200 ms | ⚠ Degradado |
| P95 latencia API | 2.100 ms | < 800 ms | ✗ Crítico |
| Uptime (90d) | 97.2% | > 99.5% | ✗ Crítico |
| Errores 5xx/día | 847 | < 50 | ✗ Crítico |
| Tiempo despliegue | 45 min | < 10 min | ✗ Crítico |
Cobertura de Tests
Módulo de Autenticación: 12% cobertura Módulo de Facturación: 3% cobertura API REST: 28% cobertura Frontend: 0% cobertura ───────────────────────────────────── Total: 11% cobertura
Hallazgos Críticos
P0 — Vulnerabilidades de Seguridad
CVE-2024-21538 (jsonwebtoken): La versión 8.5.1 tiene una vulnerabilidad de verificación de firma que permite forjar tokens si el atacante conoce el algoritmo none.
Secretos expuestos: El repositorio Git tiene 14 commits históricos con credenciales AWS y claves de Stripe en texto plano.
SQL Injection potencial: El módulo de reporting usa concatenación directa de strings en 7 endpoints sin parametrizar.
Rotar inmediatamente todas las credenciales y reescribir el historial Git con git filter-repo antes de cualquier auditoría externa.
P0 — Módulo de Facturación Roto
Race condition en el procesamiento de pagos recurrentes — sin lock distribuido:
// PROBLEMA: No hay lock distribuido async function processRecurringPayment(subscriptionId) { const sub = await Subscription.findById(subscriptionId); if (sub.status === 'active' && sub.nextBillingDate <= new Date()) { await chargeCustomer(sub.customerId, sub.amount); // puede ejecutarse 2x await sub.update({ nextBillingDate: addMonth(sub.nextBillingDate) }); } }
Esto ha causado cobros duplicados a 23 clientes en los últimos 6 meses (€4.200 en reembolsos).
P1 — Degradación de Base de Datos
PostgreSQL opera sin connection pooling. Bajo carga, se abren hasta 340 conexiones contra un límite de max_connections = 100:
| Momento | Conexiones pico | Resultado |
|---|---|---|
| Lunes 09:00 | 340 | Caída 12 min |
| Viernes 18:00 | 287 | Degradación 35 min |
| Fin de mes | 412 | Caída 28 min |
Arquitectura Propuesta
La visión target elimina el acceso directo a base de datos y centraliza la autenticación:
┌─────────────────────────────────────────────────────┐
│ CloudFront CDN │
└─────────────────────┬───────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────┐
│ API Gateway (Kong) │
│ Rate limiting · Auth · Request validation │
└──────┬──────────────┬──────────────┬────────────────┘
│ │ │
┌──────▼──────┐ ┌─────▼──────┐ ┌───▼──────────┐
│ Auth SVC │ │ Billing SVC│ │ Core API │
│ (Keycloak) │ │ (Stripe) │ │ (Node 20) │
└──────┬──────┘ └─────┬──────┘ └───┬──────────┘
│ │ │
┌──────▼──────────────▼─────────────▼────────┐
│ PostgreSQL + PgBouncer │
│ Redis (con eviction LRU) │
└─────────────────────────────────────────────┘
Cambios Clave
- Keycloak reemplaza el sistema JWT casero → SSO, MFA, gestión centralizada
- PgBouncer en modo transaction pooling → máx 20 conexiones reales
- Kong API Gateway → rate limiting por tenant, circuit breaker
- Node.js 20 LTS → soporte activo, 40% mejora de rendimiento V8
- Stripe Billing nativo → elimina race condition de facturación
Plan de Migración
Fase 1 — Seguridad (Semanas 1-2)
- Rotar todas las credenciales (AWS, Stripe, JWT secrets)
- Reescribir historial Git con
git filter-repo - Actualizar
jsonwebtokena9.0.2 - Parametrizar los 7 endpoints vulnerables a SQL Injection
- Activar WAF en CloudFront (managed ruleset OWASP)
El proceso de rotación requiere ventana de mantenimiento de 2 horas. Recomendamos programarla para el próximo domingo entre 02:00-04:00 CET.
Fase 2 — Estabilización (Semanas 3-6)
- Instalar y configurar PgBouncer (transaction mode, pool_size=15)
- Migrar facturación recurrente a Stripe Billing con webhooks idempotentes
- Subir Node.js de 16 a 20 LTS
- Configurar Redis con eviction policy
allkeys-lruy maxmemory 2GB
Fase 3 — Modernización (Semanas 7-14)
- Desplegar Kong API Gateway en modo DB-less
- Implementar Keycloak 24 con realm NovaSaaS
- Migrar autenticación (feature flag por porcentaje de usuarios)
- Actualizar React 17 → 18 + Vite (eliminar Webpack 4)
- Implementar CI/CD con GitHub Actions + Terraform
Estimaciones
| Fase | Horas | Coste (€) | Duración |
|---|---|---|---|
| Fase 1 — Seguridad | 40h | 4.800 € | 2 semanas |
| Fase 2 — Estabilización | 80h | 9.600 € | 4 semanas |
| Fase 3 — Modernización | 160h | 19.200 € | 8 semanas |
| Total | 280h | 33.600 € | 14 semanas |
ROI Estimado
Riesgos
| Riesgo | Probabilidad | Impacto | Mitigación |
|---|---|---|---|
| Regresión en migración JWT | Media | Alto | Feature flag + rollback plan |
| Downtime en migración DB | Baja | Alto | Blue-green deployment |
| Resistencia interna al cambio | Alta | Medio | Workshops semanales con el equipo |
| Desvío de presupuesto >20% | Baja | Medio | Sprints con entregables cerrados |
Todos los cambios de Fase 1 son reversibles sin downtime usando feature flags. Las Fases 2 y 3 requieren ventanas de mantenimiento planificadas.
Conclusiones
NovaSaaS tiene una plataforma con fundamentos sólidos pero deuda técnica acumulada que representa un riesgo operativo y de seguridad significativo. La intervención en tres fases permite:
- Eliminar el riesgo de seguridad inmediato (Fase 1, 2 semanas)
- Estabilizar la plataforma y eliminar las caídas recurrentes (Fase 2, 4 semanas)
- Modernizar el stack para soportar el crecimiento futuro (Fase 3, 8 semanas)
1. Validar disponibilidad para ventana de mantenimiento Fase 1 · 2. Firmar propuesta económica · 3. Kick-off con equipo técnico de NovaSaaS