Tienes un servidor. Has montado tus servicios. Tus fotos están en Immich, tu música en Navidrome, tus contraseñas en Vaultwarden. Todo funciona. Te sientes bien. Ahora viene lo que nadie te dice cuando empiezas con el self-hosting: tener un servidor en internet es como dejar la puerta de tu casa abierta en un barrio que no conoces. No es cuestión de si alguien va a probar a entrar. Es cuestión de cuándo. Los bots no descansan. Escanean internet constantemente buscando puertos abiertos, SSH con contraseñas débiles, paneles de administración sin autenticar, APIs expuestas. No es paranoia. Es la realidad de tener una máquina conectada a la red. En las primeras 24 horas de vida de un servidor, puedes esperar cientos de intentos de autenticación contra SSH. Es automático, no va contra ti personalmente, pero pasa. Este tutorial existe por una razón: porque montar servicios es la parte divertida, pero asegurarlos es la parte necesaria. Y si no lo haces desde el principio, arreglarlo después es mucho más complicado. Reconfigurar un servidor que ya tiene servicios funcionando, con usuarios usando sus contraseñas, con datos acumulados, es más difícil que hacerlo bien desde el día uno.
De qué va esto
Este no es un tutorial de teoría de seguridad. No vas a aprender criptografía ni a montar un SOC empresarial. Tampoco vas a convertirte en hacker ético ni a entender los entresijos de los protocolos de autenticación. Esto es un manual práctico para asegurar un servidor de self-hosting real, con servicios reales, desde el blindaje de SSH hasta los backups cifrados.
Son veintiún capítulos que siguen una progresión lógica. No empiezas por el cortafuegos. Empiezas por la puerta de entrada: SSH. Luego vas capa por capa, de lo más externo a lo más interno, hasta tener un sistema que puedas dejar funcionando sin mirarlo cada cinco minutos.
Cada capítulo tiene la misma estructura. Una apertura que conecta con el anterior, una explicación de lo que vas a hacer, los pasos concretos con comandos que copias y pegas, ejemplos tanto para Docker como para Podman cuando toca, una sección de verificación para comprobar que funciona, y referencias para ampliar.
No hay capturas de pantalla. No hay relleno. Son comandos, configuraciones y explicaciones de por qué haces lo que haces. Porque la seguridad no es una receta. Si no entiendes por qué estás desactivando la autenticación por contraseña en SSH, cuando algo cambie en el futuro no sabrás cómo adaptarlo.
Por qué ahora y no después
Cuando instalas un servicio nuevo, tu mente está en otra cosa. Quieres verlo funcionar. Quieres subir tus fotos, configurar tu música, probar la sincronización. La seguridad queda para luego. Y luego nunca llega.
He visto servidores con el panel de administración de Traefik accesible desde internet sin contraseña. Con PostgreSQL escuchando en 0.0.0.0. Con contenedores corriendo como root. Con backups sin cifrar en un bucket de S3. Con el puerto 22 abierto y autenticación por contraseña activa. Con paneles de administración de servicios expuestos sin autenticar. Con versiones antiguas de software con vulnerabilidades conocidas. Gente que lleva meses autoalojando sus servicios y un día descubre que alguien lleva semanas usando su servidor para minar criptomonedas. O que sus datos se han cifrado con ransomware. O que alguien ha accedido a sus fotos personales.
No es culpa suya. El self-hosting vende libertad, pero no cuenta la parte de responsabilidad. Te dicen monta tu propio servidor y tienes el control de tus datos, pero no te dicen y luego asegúralo para que no te los roben. Es como venderte un coche y olvidarse de mencionar que necesita frenos. Este tutorial es esa conversación que nadie tuvo contigo.
El modelo de amenazas para tu servidor
Antes de lanzarnos a configurar cosas, vale la pena entender a qué te enfrentas. No para asustarte, para que sepas contra quién estás construyendo barreras. El primer nivel son los bots automatizados. Son scripts que barren internet escaneando puertos y probando combinaciones de usuario y contraseña. No van contra ti, van contra todo el mundo. SSH en el puerto 22 con contraseña es su objetivo favorito. También buscan paneles conocidos: phpMyAdmin, WordPress, paneles de administración de servicios populares. La defensa contra estos es sencilla y muy efectiva: cambiar el puerto SSH, usar claves, poner autenticación básica en los paneles de administración.
El segundo nivel son los escáneres de vulnerabilidades. Herramientas como Shodan o GreyNoise catalogan servidores y buscan versiones de software con vulnerabilidades conocidas. Si tienes una versión antigua de Traefik, de WordPress o de cualquier servicio, estos escáneres lo detectan. La defensa: mantener todo actualizado.
El tercer nivel son los ataques dirigidos. Alguien sabe que tienes un servidor y pone interés en entrar. Puede ser porque compartes servicios con amigos, porque tu dominio aparece en algún lado, o simplemente porque te ha tocado la lotería inversa. Contra estos, necesitas capas: autenticación, segmentación de red, monitorización.
La mayoría de los servidores de self-hosting domésticos solo se enfrentan al primer nivel. Con blindar SSH, poner un firewall y mantener las cosas actualizadas, tienes el 90% del trabajo hecho. Este tutorial cubre también el segundo y tercer nivel, pero no te obsesiones. Empieza por lo básico.
Lo que necesitas antes de empezar
Para seguir este tutorial necesitas algo muy concreto: un servidor funcionando con servicios de self-hosting. No vale un servidor recién instalado sin nada. Necesitas tener Docker o Podman corriendo, algún servicio expuesto a internet, y acceso por SSH. Sin un servidor real al que aplicar los cambios, los ejemplos se quedan en teoría.
Si vienes del tutorial de Self Hosted , estás en el sitio perfecto. Ese tutorial te deja con un servidor lleno de servicios: Traefik como proxy inverso, Miniflux para lectura, Vaultwarden para contraseñas, Navidrome para música, Jellyfin para vídeo, Immich para fotos. Exactamente el escenario que este tutorial de seguridad asume.
Si no has seguido ese tutorial, no pasa nada. Pero necesitas tener al menos un servidor Ubuntu o Debian con Docker instalado, un proxy inverso funcionando, y algún servicio accesible desde internet. Sin esos componentes, los ejemplos de este tutorial no tendrán contexto. También necesitas acceso root o un usuario con sudo, conexión SSH configurada al menos con contraseña, y un dominio o subdominio apuntando a tu servidor. Sin dominio, los certificados SSL y la autenticación por subdominio no funcionan.
Los conocimientos técnicos que asumo son básicos: saber moverte por la terminal, entender qué es un contenedor, tener idea de cómo funciona HTTP y DNS. Si sabes editar un archivo con nano y ejecutar un comando con sudo, tienes suficiente.
Cómo está organizado
Veintiún capítulos divididos en seis bloques. Cada bloque cubre un aspecto de la seguridad. No es obligatorio seguirlos en orden estricto, pero cada capítulo menciona configuraciones de los anteriores. Si te saltas el bloque 1 y vas directo al bloque 3, puede que algunas cosas no funcionen porque faltan las bases.
Bloque 1 — Blindaje del sistema. Capítulos 1 al 4. SSH, firewall con nftables, fail2ban, usuarios y sudo hardening. Es la base sobre la que se asienta todo lo demás. Sin esto, cualquier otra medida de seguridad es cosmética. Estos cuatro capítulos te llevan de tener un servidor con la configuración por defecto a tener un sistema que resiste un ataque de fuerza bruta sin inmutarse.
El capítulo 1 es el más transformador. Blindar SSH con claves, cambiar el puerto, desactivar la autenticación por contraseña, restringir usuarios. Diez minutos que cambian por completo el perfil de riesgo de tu servidor.
Bloque 2 — Traefik como muralla. Capítulos 5 al 8. El proxy inverso no es solo para enrutar peticiones. Es tu primera línea de defensa contra ataques HTTP. Rate limiting, cabeceras de seguridad, autenticación básica y avanzada, listas blancas de IP. Si Traefik es la puerta de entrada a tus servicios, este bloque te enseña a ponerle una puerta acorazada.
Bloque 3 — Identidad y acceso. Capítulos 9 al 12. Authelia, Authentik, LDAP, Pocket ID. La autenticación centralizada. Un solo punto de entrada para todos tus servicios. Doble factor, políticas de acceso granulares, gestión centralizada de usuarios. No es complicado de montar, pero cambia por completo cómo accedes a tu servidor.
Bloque 4 — Red y segmentación. Capítulos 13 al 15. WireGuard, segmentación Docker, servicios que no se ven desde fuera. No todo tiene que estar accesible desde internet. De hecho, la mayoría de tus servicios no deberían estarlo. Bases de datos, paneles de administración, herramientas de monitorización. Todo eso debería vivir en redes privadas.
Bloque 5 — Detección y respuesta. Capítulos 16 al 18. CrowdSec, Prometheus con Grafana y Loki, alertas en Telegram y dashboards. Por mucho que blindes, algo puede colarse. La clave no es evitar todos los incidentes, es detectarlos antes de que se conviertan en catástrofes.
Bloque 6 — Mantenimiento continuo. Capítulos 19 al 21. Actualizaciones automáticas, backups cifrados, tests de seguridad periódicos. La seguridad no es un estado al que llegas y te quedas. Es un proceso que hay que mantener. Estos tres capítulos cierran el círculo y te dejan con un sistema que se mantiene solo.
Lo que no cubre este tutorial
Voy a ser honesto sobre lo que no vas a encontrar aquí, para que no tengas expectativas equivocadas. No cubro seguridad de aplicaciones web. Si el servicio que has montado tiene una vulnerabilidad en su código, este tutorial no te va a proteger. Si Immich tiene un fallo de seguridad que permite acceso no autorizado, ningún middleware de Traefik va a solucionarlo. Eso es responsabilidad del desarrollador del servicio y de mantenerlo actualizado.
No cubro hardening del kernel. Hay un punto donde la seguridad adicional complica tanto el mantenimiento que deja de merecer la pena. Configurar parámetros de sysctl, compilar módulos del kernel, parches de grsec. Eso es otro nivel que no necesitas para un servidor doméstico.
No cubro redes empresariales. Esto no es SOC 2 ni ISO 27001 ni PCI DSS. Es un servidor en casa o un VPS de 5 euros. Las soluciones tienen que ser proporcionadas al problema. No vas a montar un SIEM para monitorizar tres contenedores.
No cubro seguridad física. Si alguien entra en tu casa y se lleva el disco duro, todas las capas de software del mundo no van a protegerte. Cifra los datos sensibles y asume que el hardware puede desaparecer.
La filosofía de este tutorial
Hay dos formas de abordar la seguridad. Una es la paranoia: cerrar todo, no confiar en nada, hacer la vida imposible al usuario para que el sistema sea impenetrable. La otra es el pragmatismo: identificar los riesgos reales y poner barreras proporcionadas.
Este tutorial apuesta por la segunda. No vas a montar una VPN para acceder a Miniflux. No vas a poner doble factor en servicios que solo usas tú desde casa. No vas a cifrar cada conexión con certificados de cliente. Eso es seguridad teatral: parece muy segura pero en la práctica no aporta nada y complica tanto el uso que acabas buscando atajos. Y los atajos, en seguridad, son peor que no haber puesto la medida.
Pongo un ejemplo concreto. He visto tutoriales que recomiendan montar una VPN solo para acceder al panel de administración de los servicios. Técnicamente es seguro. En la práctica, el usuario acaba abriendo el puerto del panel para no tener que conectarse a la VPN cada vez que quiere cambiar una configuración. El resultado es menos seguro que si hubiera puesto una autenticación básica con contraseña fuerte.
Vas a blindar lo que realmente importa. El acceso SSH. El proxy inverso. La autenticación de servicios críticos. Los backups. Y vas a hacerlo de forma que el sistema siga siendo usable. Porque un sistema tan seguro que no se usa es, en la práctica, inseguro.
Otra decisión consciente de este tutorial: no voy a recomendarte que uses contraseñas diferentes para cada servicio. Vas a usar un gestor de contraseñas y un sistema de autenticación centralizada. Eso es más seguro que tener veinte contraseñas distintas que no recuerdas y acabas apuntando en un post-it.
Cada capítulo termina con una sección de Verificación. Comandos concretos para comprobar que lo que has configurado funciona realmente. Porque la seguridad no es lo que crees que has configurado. Es lo que realmente está funcionando. Y la única forma de saberlo es probarlo.
Una nota sobre el miedo
Si estás leyendo esto y te está entrando el agobio, respira. Que algo sea importante no significa que sea urgente. No necesitas aplicar los 21 capítulos esta noche. Puedes ir paso a paso.
Empieza por el capítulo 1: blindar SSH. Son diez minutos y es el mayor salto de seguridad que puedes dar en el menor tiempo posible. Un servidor con SSH blindado ya no es un objetivo fácil para los bots. Luego, cuando tengas un rato, el capítulo 2: el firewall. Y así sucesivamente.
El self-hosting tiene que seguir siendo divertido. Si la seguridad te está quitando el sueño, algo estás haciendo mal. Las soluciones de este tutorial están pensadas para que duermas tranquilo, no para que te obsesiones con cada puerto abierto.
Y si algo sale mal durante la configuración, la mayoría de los cambios son reversibles. Si bloqueas tu acceso SSH, siempre puedes entrar por la consola del VPS o conectar un monitor si es una máquina física. No es el fin del mundo.
Cómo leer este tutorial
Cada capítulo sigue la misma estructura. Una apertura que enlaza con el anterior, el contenido técnico con comandos y configuraciones, una sección de problemas comunes con soluciones, la verificación y las referencias.
Los comandos que aparecen en los capítulos los ejecutas en la terminal de tu servidor. Si ves un bloque de configuración, lo copias a un archivo. Las variables que aparecen en mayúsculas y negrita las cambias por tus valores reales: tu dominio, tu usuario, tu IP.
Los capítulos que implican contenedores incluyen dos opciones: Docker con compose.yml y Podman con Quadlets. Puedes elegir la que uses en tu servidor. Si usas Docker, sigue la opción A con el compose.yml. Si usas Podman, sigue la opción B con los archivos .container, .volume y .network. Si usas ambos en el mismo servidor, elige uno y quédate con él para no liarte.
Al final de cada capítulo hay una lista de verificación. No la saltes. Son tres o cuatro comandos que te confirman que lo que has hecho funciona. Sin verificación, no sabes si has aplicado bien la configuración o si algo se ha quedado a medias. Es como no mirar si la puerta se ha cerrado después de darle al pomo.
Si algo no funciona, revisa el orden de los pasos. La mayoría de los problemas vienen de saltarse un paso o de copiar mal una configuración. Los caracteres invisibles como tabulaciones vs espacios en YAML son la causa más común de errores en configuraciones de contenedores.
Cómo se relaciona con el tutorial de Self Hosted
Si has seguido el tutorial de Self Hosted tienes una ventaja enorme. Ese tutorial te deja con un servidor completo: Traefik como proxy inverso, servicios funcionando, estructura de directorios clara, Docker o Podman configurados. Este tutorial de seguridad se apoya en esa base.
No es obligatorio haberlo seguido, pero facilita mucho las cosas. Sobre todo los capítulos del bloque 2, que asumen que tienes Traefik funcionando y sabes cómo añadirle configuraciones. Si vienes de otro tutorial o montaste el servidor por tu cuenta, los conceptos son los mismos, pero tendrás que adaptar las rutas y configuraciones a tu caso.
También voy a referenciar el tutorial de Docker y el de Podman cuando hable de conceptos que ya se explicaron allí. No voy a repetir cómo se crea un compose.yml o cómo funciona un Quadlet. Eso ya está cubierto.
Verificación
Antes de pasar al capítulo 1, asegúrate de que tienes esto claro:
- Tienes acceso SSH a tu servidor. Si usas contraseña, el capítulo 1 es tu prioridad absoluta. No sigas sin tener esto resuelto.
- Tienes Docker o Podman instalado y funcionando. Varios capítulos usan contenedores para desplegar servicios de seguridad como Authelia, CrowdSec o Pocket ID.
- Tienes Traefik o un proxy inverso instalado. Los bloques 2 y 3 lo necesitan para funcionar. Sin un proxy inverso, no puedes aplicar middlewares de seguridad ni autenticación centralizada.
- Tienes un dominio apuntando a tu servidor. Para certificados SSL, subdominios y autenticación. Sin dominio, los ejemplos de Traefik y Authelia no funcionan.
- Tienes claro qué servicios estás ejecutando. Haz una lista mental o escrita: qué puertos tienes abiertos, qué expones a internet, cuáles deberían estar en una red privada.
- No tengas prisa. Este tutorial no es una carrera. Cada capítulo son entre 15 y 30 minutos de configuración, pero tómate el tiempo que necesites para entender lo que estás haciendo.
- Tienes acceso de recuperación. Si algo falla durante una configuración, necesitas poder acceder al servidor por consola VPS, por IPMI o conectando un monitor si es físico. No confíes solo en SSH para todo.
Si cumples estos puntos, estás listo para empezar. Si no, dedica un rato a prepararlos antes de seguir. No empieces el capítulo 1 si no tienes claves SSH configuradas. Es el requisito más importante de todos.
Lo que te espera
Cuando termines este tutorial, tu servidor será muy diferente del que era al empezar. SSH será inaccesible sin tu clave privada. Los bots que golpeaban tu puerto 22 habrán pasado a otro objetivo. Traefik tendrá middlewares que filtran peticiones maliciosas antes de que lleguen a tus servicios. Los paneles de administración estarán protegidos con autenticación. Los servicios críticos solo serán accesibles desde redes privadas. CrowdSec estará detectando patrones sospechosos. Las alertas te llegarán a Telegram cuando algo no vaya bien. Los backups estarán cifrados y automatizados.
Y lo más importante: dormirás tranquilo sabiendo que tu servidor no es la presa fácil que era antes.
Más información,
- Tutorial Self Hosted (atareao.es): https://atareao.es/tutorial/self-hosted/ — el tutorial que este complementa
- Tutorial Docker (atareao.es): https://atareao.es/tutorial/docker/
- Tutorial Podman (atareao.es): https://atareao.es/tutorial/podman/
- Tutorial Traefik (atareao.es): https://atareao.es/tutorial/traefik/
- Guía de seguridad de Ubuntu Server: https://ubuntu.com/server/docs/security
- CIS Benchmarks: https://www.cisecurity.org/cis-benchmarks — guías de hardening para Linux
- Mozilla Observatory: https://observatory.mozilla.org/ — analiza la seguridad HTTP de tus servicios
- Lynis: https://cisofy.com/lynis/ — herramienta de auditoría de seguridad
- CrowdSec: https://www.crowdsec.net/ — detección colaborativa de intrusiones
- Awesome Selfhosted: https://github.com/awesome-selfhosted/awesome-selfhosted — recursos y herramientas
- OWASP Cheat Sheet Series: https://cheatsheetseries.owasp.org/ — guías de seguridad para desarrollo y operaciones