Operación
Seguridad
Los controles que protegen el sistema, agrupados por dónde actúan: en el formulario, en el borde de red, en el transporte y en los datos.
Resumen
La seguridad de MediNodo no reside en un solo componente, sino en una cadena de controles: anti-abuso en el formulario (Turnstile y rate limit), exposición sin puertos (Cloudflare Tunnel), credenciales técnicas (AWS IAM), supresión de destinatarios (blocklist), integridad de datos (idempotencia) y recuperación (backups cifrados).
Protección del formulario
Cloudflare Turnstile
Comprueba que el envío del formulario de interés no provenga de automatización abusiva. La validación se ejecuta en Vercel.
Rate limit (Upstash)
Limita de forma distribuida los envíos a /api/interest, mitigando abuso por volumen.
Borde de red
Cloudflare protege y enruta los hostnames públicos. El Tunnel conecta esos hostnames con listmonk y FastAPI mediante una conexión saliente desde cloudflared, sin abrir los puertos de los contenedores a conexiones entrantes desde Internet.
Qué se protege y qué permanece público
| Superficie | Acceso | Control principal |
|---|---|---|
Panel /admin y API administrativa /api de listmonk | Privado | Cloudflare Access, login de listmonk y TOTP. |
| FastAPI de tracking | Servidor a servidor | Clave interna enviada únicamente por Vercel; solo /health queda abierto. |
| PostgreSQL y puertos de los contenedores | Privado | Redes Docker y ausencia de puertos públicos. |
| Claves internas, credenciales SMTP, tokens del Tunnel y contraseñas de backup y base de datos | Secreto | Variables de entorno no versionadas, mínimo privilegio y rotación. |
| Clicks, bajas, vista web y archivos de campaña | Público | Rutas funcionales de listmonk servidas a través de Cloudflare. |
POST /api/interest en la landing | Público | Rate limit, Turnstile, límites de payload e idempotencia. |
| Receptor de feedback de SES/SNS | Público | Validación de mensajes SNS en listmonk; disponibilidad necesaria para aplicar blocklist. |
Transporte y credenciales
- SMTP autenticado y cifrado (LOGIN + STARTTLS) entre listmonk y Amazon SES.
- AWS IAM provee credenciales SMTP técnicas; deben tratarse como secretos y rotarse.
- El reenvío desde Vercel a
api.medinodo.comes autenticado y viaja por el Tunnel. - Autenticación de dominio (SPF, DKIM, DMARC) para proteger la reputación e impedir suplantación.
Blocklist y supresión
Cuando llega un hard bounce o un complaint, listmonk registra el evento y coloca al suscriptor en blocklist según los umbrales configurados. Así se evita volver a enviar a una dirección inválida o a una persona que marcó el mensaje como spam, protegiendo la reputación de envío.
La supresión depende del webhook
Si el webhook de SES no es accesible, el evento no se registra y la blocklist no se aplica. Monitorear su disponibilidad es un control de seguridad, no solo de operación.
Datos y privacidad
- Identificadores opacos (UUID de suscriptor y campaña) viajan en las URLs en lugar de datos personales en claro.
- Idempotencia en FastAPI evita registros duplicados de interés.
- Backups cifrados con Restic para PostgreSQL y los uploads de listmonk.
- Los datos de negocio permanecen en PostgreSQL, aislados del borde de Cloudflare.
Buenas prácticas
- Encadenar validaciones anti-abuso antes de tocar el backend.
- Nunca exponer listmonk ni FastAPI fuera del Tunnel en producción.
- Custodiar y rotar las credenciales SMTP de IAM.
- Probar la restauración de backups, no solo su creación.
Consideraciones
Seguridad en capas
Ningún control es suficiente por sí solo. La combinación de anti-abuso, borde privado, autenticación de correo y supresión sostiene la reputación y la integridad del sistema.