Seguridad de Infraestructura
La seguridad de infraestructura sigue el modelo de responsabilidad compartida, aprovechando las capacidades de nuestros proveedores Cloud (Cloudflare, Render, Neon).
Arquitectura de Capas
Section titled “Arquitectura de Capas”graph TD
subgraph Internet["🌐 Internet"]
USER[👤 Usuario]
end
subgraph Edge["☁️ Capa 1: Edge (Cloudflare)"]
WAF[WAF + DDoS]
SSL[SSL/TLS Termination]
end
subgraph Backend["🖥️ Capa 2: API (Render)"]
CORS[CORS Middleware]
RATE[Rate Limiting]
API[Orchestrator]
end
subgraph Data["🗄️ Capa 3: Datos (Neon)"]
POOL[Connection Pool]
DB[(PostgreSQL)]
end
USER -->|HTTPS| WAF
WAF --> SSL
SSL --> CORS
CORS --> RATE
RATE --> API
API -->|SSL/TLS| POOL
POOL --> DB
classDef edge fill:#f39c12,stroke:#d35400,color:#000;
classDef backend fill:#27ae60,stroke:#2ecc71,color:#fff;
classDef data fill:#16a085,stroke:#1abc9c,color:#fff;
class WAF,SSL edge;
class CORS,RATE,API backend;
class POOL,DB data;
Capa 1: Edge (Cloudflare)
Section titled “Capa 1: Edge (Cloudflare)”El tráfico entrante pasa primero por la red global de Cloudflare:
| Control | Descripción |
|---|---|
| DDoS Protection | Mitigación automática de ataques L3/L4 |
| WAF | Reglas OWASP Top 10 activadas |
| SSL/TLS Offloading | Terminación segura de HTTPS |
| HSTS | Forzar HTTPS por 1 año |
| Bot Management | Detección y bloqueo de bots maliciosos |
Capa 2: API Gateway (Render)
Section titled “Capa 2: API Gateway (Render)”El servicio Orchestrator corre en un entorno contenerizado aislado.
Cross-Origin Resource Sharing debe configurarse correctamente:
import cors from 'cors';
const whitelist = [ 'https://jean-d-arc.pages.dev', // Producción 'http://localhost:4321' // Desarrollo local];
const corsOptions: cors.CorsOptions = { origin: (origin, callback) => { // Permitir requests sin 'origin' (curl, Postman) if (!origin || whitelist.includes(origin)) { callback(null, true); } else { callback(new Error('Bloqueado por CORS policy')); } }, credentials: true, // Permitir cookies methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], maxAge: 86400 // Cachear preflight por 24h};
app.use(cors(corsOptions));Protección contra abuso de endpoints críticos:
import rateLimit from 'express-rate-limit';
export const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutos max: 5, // 5 intentos por IP message: { success: false, error: 'Too many login attempts, try again later' }, standardHeaders: true, legacyHeaders: false,});
// Usorouter.post('/login', loginLimiter, authController.login);Headers configurados via Helmet:
import helmet from 'helmet';
app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'"], imgSrc: ["'self'", "data:", "https:"], } }, hsts: { maxAge: 31536000, includeSubDomains: true }, frameguard: { action: 'deny' }, noSniff: true, xssFilter: true,}));Capa 3: Base de Datos (Neon/PostgreSQL)
Section titled “Capa 3: Base de Datos (Neon/PostgreSQL)”| Control | Implementación |
|---|---|
| Conexiones SSL | Solo permitidas via TLS |
| Connection Pooling | pg-pool con límites configurados |
| Aislamiento Multi-Tenant | Cada tenant en database separada |
| Queries Parametrizadas | Prevención de SQL Injection |
import { Pool } from 'pg';
// Pool con configuración optimizadaconst poolConfig = { max: 20, // Máximo de conexiones idleTimeoutMillis: 30000, // Cerrar idle después de 30s connectionTimeoutMillis: 2000, // Fail fast ssl: process.env.PG_SSL === '1' ? { rejectUnauthorized: false } : undefined,};
export const centralPool = new Pool({ ...poolConfig, database: 'nostromo_command',});Troubleshooting CORS
Section titled “Troubleshooting CORS”- Revisa la pestaña Network del navegador
- Analiza la petición OPTIONS (Preflight)
- Si Preflight falla (403/404) → servidor rechazó el origen
- Si Preflight pasa pero request falla → header
Authorizationno permitido - Verifica que el origen exacto esté en whitelist
Monitoreo y Alertas
Section titled “Monitoreo y Alertas”Se recomienda configurar alertas para:
| Métrica | Umbral | Acción |
|---|---|---|
| Tráfico inusual | +500% baseline | Revisar posible DDoS |
| Errores 401/403 | >100/hora | Posible brute force |
| Latencia DB | >500ms p95 | Revisar queries lentas |
| CPU/Memory | >80% | Escalar recursos |