Infraestructura y despliegue
La aplicación puede ser perfecta y el servidor seguir abierto de par en par. Estas comprobaciones tratan sobre cómo y dónde se ejecuta.
Lista de verificación
- Expón solo los puertos que quieres exponer. Un cortafuegos del host que permita 22, 80 y 443 no basta por sí solo: Docker publica los puertos de los contenedores escribiendo reglas de iptables que eluden ufw, así que un
-p 9000:9000puede ser accesible desde internet aunque el cortafuegos "solo permita 443". Enlaza los puertos de los contenedores a127.0.0.1salvo que deban ser públicos, y escanea tu propia IP pública para confirmar qué está realmente abierto. - Mantén los paneles de administración fuera del internet público. Paneles como Portainer, herramientas de administración de bases de datos e interfaces de métricas nunca deben ser accesibles desde internet. Un panel de administración recién instalado sin cuenta configurada supone una toma de control total: cualquiera que lo alcance durante la ventana de configuración es dueño de la máquina. Las políticas de reinicio pueden reabrir esa ventana.
- Vincula los servidores de aplicaciones al loopback y ponles un proxy inverso delante. La aplicación escucha en
127.0.0.1; nginx o el borde termina el TLS y reenvía las solicitudes. - Haz que el origen sea inaccesible salvo a través del borde. Si usas Cloudflare u otro similar, aplícalo con Authenticated Origin Pulls (mTLS) o con una lista de IP permitidas, para que los atacantes no puedan saltarse el WAF accediendo a la IP del origen.
- Configura las cabeceras de seguridad.
Strict-Transport-Security,X-Content-Type-Options: nosniff,X-Frame-Options: DENY(oframe-ancestors 'none'), unaContent-Security-Policyestricta (idealmentescript-src 'self'sinunsafe-inlineniunsafe-eval), unReferrer-Policyy unPermissions-Policybloqueado. - No reveles la versión ni la pila tecnológica. Elimina los banners
ServeryX-Powered-By. - Bloquea el acceso a archivos de punto y a la salida de compilación.
/.env,/.git/, los archivos de configuración y los source maps no deben ser accesibles desde la web. Confirma que cada uno devuelve 403 o 404. - Muestra errores genéricos. Nada de trazas de pila ni rutas internas para los usuarios; registra el detalle en el servidor.
- Mantén el entorno de ejecución parcheado y ejecuta la aplicación como un usuario no root con los mínimos privilegios, en un contenedor o sandbox cuando sea práctico.
Cómo probar
- Desde una máquina fuera de tu red, escanea tus IP públicas en busca de puertos abiertos.
- Solicita
/.env,/.git/configy un archivo.mapen tu dominio. - Lee las cabeceras de respuesta de tu página principal y comprueba cada punto anterior.