Docs

Seguridad de Red

Tabla de Contenidos

  1. Vision General — Modelo de 4 Capas
  2. Capa 1: Cloudflare Edge
  3. Capa 2: Cloudflare Worker (API Proxy)
  4. Capa 3: Cloudflare Access (Zero Trust)
  5. Capa 4: Autenticacion Aplicativa
  6. Headers de Seguridad por Proyecto
  7. Ataques Mitigados

1. Vision General — Modelo de 4 Capas

Nvito implementa un modelo de seguridad en profundidad (defense-in-depth) con 4 capas independientes. Cada capa actua como un filtro: si una falla, las siguientes continuan protegiendo el sistema.

CapaQue protegeAplica a
1. Cloudflare EdgeTrafico de red (DDoS, bots, exploits conocidos)Todos los subdominios
2. Worker ProxyIP del origin, autenticacion API-a-APISolo api.nvito.mx en produccion
3. Zero Trust AccessAcceso no autorizado al panel y docsSolo admin.nvito.mx y docs.nvito.mx
4. Auth AplicativaAcceso a datos, RBAC, token theft, CSRF, XSSCada aplicacion con su mecanismo

2. Capa 1: Cloudflare Edge

Todo el trafico hacia nvito.mx y sus subdominios pasa por la red edge de Cloudflare antes de llegar a cualquier origin server. Esta capa es transparente para la aplicacion y opera a nivel de red/transporte.

2.1 DDoS Mitigation

Cloudflare provee mitigacion automatica de DDoS en 3 niveles:

NivelTipo de ataqueMitigacion
L3/L4SYN flood, UDP flood, amplificationFiltrado automatico en el edge, sin configuracion
L7HTTP flood, slowloris, request burstsAnalisis de patrones + challenge automatico
DNSDNS amplification, query floodAnycast absorbe el volumen

La mitigacion L3/L4 esta siempre activa en todos los planes de Cloudflare (incluido Free). La mitigacion L7 se beneficia del plan Pro para reglas WAF gestionadas adicionales.

2.2 WAF (Web Application Firewall)

FuncionalidadPlan FreePlan Pro
Managed Rules (OWASP)NoSi (SQLi, XSS, RCE, etc.)
Custom Rules5 reglas20+ reglas
Rate Limiting Rules1 regla5+ reglas
Security LevelConfigurableConfigurable

Nvito actualmente opera en el plan Free. Las managed rules de OWASP (inyeccion SQL, XSS reflejado, RCE) requieren el plan Pro ($20/mes). La proteccion actual se complementa con:

  • Custom rules para bloquear User-Agents sospechosos
  • Rate limiting en endpoints de API
  • Bot Fight Mode

Plan Pro para produccion

Se recomienda activar el plan Pro de Cloudflare ($20/mes) al lanzar a produccion para obtener las managed rules WAF. Mientras tanto, la aplicacion implementa sus propias validaciones contra SQLi y XSS a nivel de codigo (Zod validation, DOMPurify, CSP).

2.3 SSL/TLS

ConfiguracionValor
ModoFull (Strict)
TLS minimo1.2
HSTSmax-age=31536000; includeSubDomains
HTTPS RedirectAutomatico (Always Use HTTPS)
Certificate TransparencyHabilitado

El modo Full (Strict) significa que Cloudflare verifica que el certificado del origin sea valido y no este expirado. Esto previene ataques man-in-the-middle entre Cloudflare y el origin.

2.4 Rate Limiting

ReglaAplica aThresholdAccion
API Rate Limitapi.nvito.mx/v1/*100 req / 10s por IPBlock (429)
Auth Rate Limit*/api/auth/*10 req / 60s por IPBlock (429)
Login Brute Force*/sign-in*5 req / 15min por IPJS Challenge

2.5 Bot Fight Mode

Bot Fight Mode esta habilitado en Cloudflare. Analiza patrones de comportamiento (fingerprinting JS, headless browser detection, TLS fingerprint) y desafia automaticamente a bots sospechosos sin afectar a usuarios legitimos.

3. Capa 2: Cloudflare Worker (API Proxy)

En produccion, api.nvito.mx no apunta directamente a Railway. En su lugar, un Cloudflare Worker intercepta todas las requests y las redirige al origin despues de inyectar un token de autenticacion API-a-API.

3.1 Arquitectura del Worker

3.2 Beneficios del Worker Proxy

BeneficioDetalle
IP del origin ocultaLa URL publica de Railway (*.up.railway.app) nunca se expone. El trafico solo llega via Cloudflare.
Autenticacion API-a-APIEl header X-CF-API-Token garantiza que solo requests que pasen por Cloudflare llegan al backend. Requests directas a Railway son rechazadas con 403.
Edge computingEl Worker corre en 300+ data centers de Cloudflare. La latencia de inyeccion del header es de menos de 1ms.
Rate limiting dobleCloudflare rate-limita en el edge; el backend puede aplicar su propio rate limiting adicional.

3.3 Limites del Free Tier

RecursoLimite Free
Requests/dia100,000
CPU time/request10ms
Script size1 MB
Subrequests/request50

Con el trafico esperado en las primeras fases de Nvito, el free tier es mas que suficiente. El Worker es extremadamente ligero (solo inyecta un header y hace un fetch al origin).

Solo en produccion

El Worker proxy solo se usa en produccion (api.nvito.mx). En DEV y TEST, los subdominios dev-api.nvito.mx y test-api.nvito.mx apuntan directamente al VPS via registro A. El VPS no requiere el header X-CF-API-Token.

4. Capa 3: Cloudflare Access (Zero Trust)

Cloudflare Access protege subdominios seleccionados con autenticacion Zero Trust antes de que el request llegue al origin. Actua como un reverse proxy de identidad.

4.1 Subdominios Protegidos

SubdominioProtegido por CF AccessRazon
admin.nvito.mxSiPanel administrativo con datos sensibles
dev-admin.nvito.mxSiMismo contenido que produccion, datos de desarrollo
test-admin.nvito.mxSiMismo contenido que produccion, datos de QA
docs.nvito.mxSiDocumentacion tecnica confidencial
api.nvito.mxNoAPI publica consumida por clientes programaticos
app.nvito.mxNoPWA publica para invitados (auth propia via BFF)
inv.nvito.mxNoInvitaciones publicas para invitados finales

4.2 Flujo de Autenticacion

4.3 Configuracion de Access

ParametroValor
Metodo de autenticacionEmail OTP (One-Time Pin)
Emails permitidosLista explicita de emails autorizados
Duracion de session24 horas
ReautenticacionCada 24 horas o al cerrar el browser
Usuarios incluidos en FreeHasta 50 usuarios

Doble autenticacion en admin

Para acceder a admin.nvito.mx, un usuario debe pasar dos capas de autenticacion independientes: primero Cloudflare Access (email OTP) y luego Clerk (email + password). Esto es intencional: CF Access protege a nivel de red, Clerk protege a nivel de aplicacion con RBAC granular.

4.4 Politicas de Access

Las politicas definen quien puede acceder a cada aplicacion protegida:

Aplicacion: nvito-admin
├── Policy: Allow Team Members
│   ├── Include: Emails ending in @nvito.mx
│   └── Include: Specific emails (founders, devs)
└── Policy: Deny Everyone Else
    └── Default deny all

Aplicacion: nvito-docs
├── Policy: Allow Development Team
│   ├── Include: Emails ending in @nvito.mx
│   └── Include: Specific emails (stakeholders)
└── Policy: Deny Everyone Else
    └── Default deny all

5. Capa 4: Autenticacion Aplicativa

Cada aplicacion de Nvito implementa su propio mecanismo de autenticacion adaptado a su caso de uso.

5.1 nvito-admin — Clerk SSO + RBAC

AspectoDetalle
ProviderClerk 6 (Next.js SDK)
MetodoEmail + password, con opcion de OTP
TokenJWT firmado por Clerk, verificado en backend
RBAC8 roles, 40+ permisos granulares
Guards (backend)ClerkAuthGuard + RoleGuard + AdminPanelGuard
Multi-orgHeader X-Organization-Id para Super/Platform Admin

Cadena de guards para cada request del admin:

5.2 nvito-pwa — BFF con Cookies HttpOnly

AspectoDetalle
PatronBackend-For-Frontend (BFF)
TokensJWT almacenados en cookies HttpOnly encriptadas (AES-256-GCM)
Cookies__Host-nvito-at (access, 15min), __Host-nvito-rt (refresh, 30d)
CSRFDouble-submit: cookie __Host-nvito-csrf + firma HMAC-SHA256 en __Host-nvito-csrf-sig
ProxyTodo pasa por /api/proxy/* → descifra JWT → forward a nvito-api
CSPconnect-src 'self' bloquea llamadas directas al API desde JS

5.3 nvito-client — JWT Independiente

AspectoDetalle
AuthJWT propio (independiente de Clerk)
Storageexpo-secure-store (encriptado en dispositivo)
Guard (backend)MobileAuthGuard (verifica JWT mobile)
Login HostCodigo de evento + PIN
Login GuestAccess token via deep link / QR
Auto-refreshProactivo antes de expiracion

5.4 nvito-invitations — Sin Autenticacion

AspectoDetalle
AuthNinguna (contenido publico)
ProteccionValidacion de slug (regex + longitud), DOMPurify, CSP strict
SSRF preventionvalidateCdnUrl() contra whitelist de hosts CDN
XSS preventionescapeJsString() + escapeHtmlAttr() context-aware
Frame protectionX-Frame-Options: DENY en rutas publicas

5.5 Tabla Comparativa

Featurenvito-adminnvito-pwanvito-clientnvito-invitations
Autenticacion externaClerk SSOJWT via BFFJWT propioNinguna
Tokens en browser JSSiNoNoNo
CSRF protectionClerk built-inDouble-submit HMACN/A (nativo)N/A (read-only)
Rate limitingUserThrottlerGuardBFF + APIAPI guardCloudflare edge
RBAC8 roles, 40+ permsHOST/GUESTHOST/GUESTN/A
Multi-orgSiNoNoNo
CF AccessSiNoNoNo
CSP headersSiSiNoSi

6. Headers de Seguridad por Proyecto

Cada proyecto configura sus propios headers de seguridad HTTP, adaptados a su caso de uso.

6.1 Headers Comunes

HeaderValorProposito
Strict-Transport-Securitymax-age=31536000; includeSubDomainsForzar HTTPS durante 1 ano
X-Content-Type-OptionsnosniffPrevenir MIME type sniffing
Referrer-Policystrict-origin-when-cross-originLimitar info en header Referer
Permissions-Policycamera=(), microphone=(), geolocation=()Deshabilitar APIs sensibles

6.2 Content-Security-Policy por Proyecto

nvito-admin (next.config.ts):

default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.clerk.accounts.dev;
connect-src 'self' https://api.nvito.mx https://*.clerk.accounts.dev;
img-src 'self' https://cdn.nvito.mx https://img.clerk.com data:;
frame-src https://*.clerk.accounts.dev;

nvito-pwa (next.config.ts):

default-src 'self';
script-src 'self' 'unsafe-inline';
connect-src 'self';  /* Solo BFF local, bloquea API directa */
img-src 'self' https://cdn.nvito.mx data:;

nvito-invitations (next.config.mjs):

/* Rutas publicas /i/* */
default-src 'self';
script-src 'self' 'unsafe-inline';
frame-ancestors 'none';  /* No permitir embeds */

/* Rutas preview /preview/* */
frame-ancestors 'self' https://admin.nvito.mx https://dev-admin.nvito.mx;

6.3 X-Frame-Options

ProyectoValorRazon
nvito-adminSAMEORIGINPermite iframes internos (preview de invitaciones)
nvito-invitations (publico)DENYLas invitaciones no deben embeberse en sitios externos
nvito-invitations (preview)SAMEORIGINPermite preview iframe desde el admin
nvito-pwaDENYLa PWA no debe embeberse

7. Ataques Mitigados

La siguiente tabla resume los vectores de ataque mas relevantes y como cada capa los mitiga.

Vector de AtaqueCapaMecanismo de Mitigacion
DDoS volumetrico (L3/L4)1 - CF EdgeAnycast absorbe volumen, filtrado automatico
DDoS aplicativo (L7)1 - CF EdgeRate limiting, JS Challenge, Bot Fight Mode
Brute force login1 + 3 + 4Rate limiting CF + CF Access OTP + Clerk lockout
SQL Injection4 - AppPrisma ORM (parametrizado), Zod validation
XSS reflejado1 + 4WAF (Pro), CSP headers, React auto-escape, DOMPurify
XSS almacenado4 - AppDOMPurify en invitaciones, escapeJsString(), CSP
CSRF4 - AppClerk built-in (admin), double-submit HMAC (PWA)
Token theft (XSS)4 - AppCookies HttpOnly AES-256-GCM (PWA), SecureStore (mobile)
SSRF4 - AppvalidateCdnUrl() whitelist en invitaciones
Direct origin access2 - WorkerHeader X-CF-API-Token requerido en produccion
Man-in-the-middle1 - CF EdgeTLS 1.2+, HSTS, Full (Strict) SSL
Session hijacking3 + 4CF Access session 24h, Clerk session management
Credential stuffing1 + 3Rate limiting + CF Access email whitelist
Clickjacking4 - AppX-Frame-Options: DENY, frame-ancestors 'none'
MIME confusion4 - AppX-Content-Type-Options: nosniff
Timing attacks4 - Appcrypto.timingSafeEqual() en invitaciones

Defense in depth

Ningun mecanismo individual es infalible. La fortaleza del modelo radica en que cada capa compensa las debilidades de las otras. Un atacante debe evadir todas las capas simultaneamente para comprometer el sistema.

Esta pagina fue util?