Seguridad por diseño

Seguridad

Última actualización: 27 de abril de 2026

Cifrado

  • En tránsito: TLS 1.3 obligatorio en todos los endpoints (web, API, base de datos). HSTS activo.
  • En reposo: Cloudflare R2 cifra cada objeto con AES-256 server-side. PostgreSQL en disco cifrado a nivel sistema.
  • Subida directa: el audio sube de tu navegador a R2 vía URL presignada. Nuestro API nunca toca el binario — reduce superficie de ataque y latencia.

Identidad y autenticación

  • Identidad federada con Keycloak 26 en auth.codelabs.studio (servidor propio). Soporta MFA, login con Google/Microsoft.
  • Tokens JWT firmados con claves rotables. Validación contra JWKS público de Keycloak.
  • Sesiones renovables con refresh tokens. Nunca almacenamos contraseñas — Keycloak es el único custodio.

Infraestructura europea, soberanía del dato

  • Servidor dedicado en Europa bajo nuestra gestión exclusiva. Aloja la base de datos PostgreSQL, la cola de trabajos y el motor de embeddings semánticos. NO usamos servicios cloud de BD: control total sobre dónde viven tus datos.
  • Embeddings locales con bge-m3 — los textos de tus transcripciones jamás salen del servidor europeo para generar los vectores de búsqueda semántica.
  • Aplicación en Docker Swarm con Traefik + Let's Encrypt automático. Despliegue gestionado vía Dokploy.
  • Cola de trabajos asíncronos en Redis (BullMQ). Reintentos con backoff exponencial e idempotencia por nota.

Audit log de consents

Cada vez que aceptas un consentimiento registramos un row append-only en la tabla consents con: timestamp UTC, IP, user-agent, versión del texto legal y el hash del documento aceptado.

No actualizamos rows: cuando revocas un consent, insertamos una fila NUEVA con revoked_at set. Esto permite reconstruir el estado en cualquier instante histórico.

Gestión de vulnerabilidades

  • Sentry monitoriza cada error en producción. Filtros que evitan enviar contenido sensible.
  • Dependencias auditadas con pnpm audit en CI; CVEs altos bloquean merge.
  • Política de divulgación responsable: [email protected]. Respondemos en menos de 48 horas.