VPS Contabo (DEV/TEST)
SSH
| Item | Estado | Acción |
|---|---|---|
| Acceso solo con SSH keys (no password) | Verificar | PasswordAuthentication no en /etc/ssh/sshd_config |
| Puerto SSH no estandar | Recomendado | Cambiar de 22 a otro puerto (ej: 2222) |
| Root login deshabilitado | Verificar | PermitRootLogin no en sshd_config |
| fail2ban instalado | Recomendado | apt install fail2ban con config para SSH |
| Usuarios limitados | Verificar | Solo usuarios necesarios con acceso SSH |
Firewall
| Item | Estado | Acción |
|---|---|---|
| UFW o iptables activo | Verificar | ufw status |
| Solo puertos necesarios abiertos | Verificar | 80 (HTTP), 443 (HTTPS), SSH |
| Redis NO expuesto publicamente | Verificar | Puerto 6379 solo en red interna |
| PostgreSQL NO expuesto publicamente | Verificar | Puerto 5432 solo en red interna |
Sistema operativo
| Item | Estado | Acción |
|---|---|---|
| Actualizaciones automáticas | Recomendado | apt install unattended-upgrades |
| Logs centralizados | Pendiente | Configurar journald o rsyslog |
| Monitoreo de disco | Recomendado | Alerta cuando disco supere 80% |
Coolify
Configuración de seguridad
| Item | Estado | Acción |
|---|---|---|
| HTTPS habilitado para dashboard | Verificar | Coolify debe accederse solo via HTTPS |
| 2FA en cuenta de Coolify | Recomendado | Activar autenticación de dos factores |
| Backups automáticos | Verificar | Configurar backups de BD y volumes |
| Variables de entorno encriptadas | Verificar | Coolify encripta env vars en reposo |
| Webhooks de deploy protegidos | Verificar | Token de autorización en webhooks de GitLab |
Contenedores
| Item | Estado | Acción |
|---|---|---|
| Imagenes base actualizadas | Implementado | node:20.19.0-alpine pineada |
| Usuario non-root en contenedores | Implementado | USER nestjs/nextjs en Dockerfiles |
| Health checks configurados | Implementado | HEALTHCHECK en Dockerfiles |
| Restart policy | Implementado | unless-stopped en docker-compose |
| Logs con rotación | Verificar | Configurar log driver con max-size |
Railway (Producción)
Configuración de seguridad
| Item | Estado | Acción |
|---|---|---|
| Variables de entorno via Bitwarden | Implementado | Secrets gestionados centralmente |
| HTTPS forzado | Verificar | Railway fuerza HTTPS por defecto |
| Custom domains con SSL | Pendiente (producción no activo) | Configurar al desplegar |
| Logs accesibles | Verificar | Railway Logs dashboard |
| Metricas de recursos | Verificar | CPU, memoria, red |
Redis (Upstash en DEV/TEST)
| Item | Estado | Acción |
|---|---|---|
| TLS habilitado | Verificar | Upstash soporta TLS, verificar que REDIS_URL usa rediss:// |
| Autenticación | Implementado | Upstash requiere password en URL |
| Datos sensibles en cache | Revisar | Verificar que tokens/sessions no se cachean sin TTL |
| Maxmemory policy | Verificar | allkeys-lru recomendado para evitar OOM |
PostgreSQL
| Item | Estado | Acción |
|---|---|---|
| SSL en conexión | Verificar | sslmode=require en DATABASE_URL para remoto |
| Backups automáticos | Verificar | Neon/Railway tienen backups automáticos |
| Credenciales únicas por ambiente | Implementado | Cada ambiente tiene su propia BD |
| Migraciones controladas | Implementado | Solo prisma migrate deploy, nunca prisma migrate dev en remoto |
Docker local (desarrollo)
| Item | Estado | Acción |
|---|---|---|
| Redis con autenticación | Implementado | requirepass en docker-compose |
| Adminer desactivado por defecto | Implementado | Solo con --profile debug |
| MinIO templates privado | Implementado | Bucket sin acceso anonimo |
| Credenciales parametrizadas | Implementado | Variables con defaults en docker-compose |
| .dockerignore completo | Implementado | Excluye .env, .git, node_modules, coverage |
S3/Cloudflare R2
| Item | Estado | Acción |
|---|---|---|
| Buckets públicos solo los necesarios | Implementado | Solo uploads y assets, templates es privado |
| URLs pre-firmadas con TTL | Verificar | TTL razonable (1 hora recomendado) |
| Validación de Content-Type | Implementado | Magic bytes validation + whitelist MIME |
| Limites de tamano por plan | Implementado | Free 5MB, Essential 25MB, Plus 50MB, VIP 100MB |
Checklist trimestral de infraestructura
Ejecutar cada trimestre junto con la rotación de secrets:
- Verificar actualizaciones del SO en VPS
- Verificar versiones de imagenes Docker (node, postgres, redis, minio)
- Ejecutar
npm auditen los 5 repos - Verificar estado de certificados SSL
- Revisar logs de acceso para patrones sospechosos
- Verificar backups de BD (restaurar uno de prueba)
- Verificar que puertos innecesarios no estan expuestos