Si self-hosteás algo (un VPS, un servercito en casa, Docker, Coolify, Caddy, Traefik), hay un piso de seguridad que tenés que cubrir sí o sí. Me lo vienen preguntando un montón: “¿qué es lo mínimo para no estar regalado?”. Así que armé un paso a paso actualizado a 2026, sin humo, que podés aplicar en una tarde y te cubre el 80% de los riesgos más comunes.
Lo importante (y práctico) del video
1) Limitar y auditar puertos: lo que no está expuesto, no se ataca
- Primero, mirá desde afuera qué ve Internet.
- Después, auditá desde adentro qué está escuchando y dónde.
Comandos útiles:
# Externo (desde tu compu a la IP del server)
nmap -Pn --top-ports 1000 203.0.113.10
# Interno (en el server)
ss -tulpen
sudo lsof -i -P -n
Buscá servicios escuchando en 0.0.0.0 cuando deberían estar en 127.0.0.1. Si tenés reverse proxy, lo público suele ser solo 80/443 (y 22 para SSH). Bases de datos (5432/3306), paneles y métricas, todo privado o detrás de VPN.
Tip con firewall del proveedor (DO/Droplets, AWS, Hetzner, etc.):
- Cerrá todo por defecto, abrí solo 22, 80 y 443.
- Si hay paneles de admin, restringí por IP de origen si podés.
2) Reforzar SSH: usuario no-root, claves y logs “de verdad”
Cambiar el puerto no te salva. Sirve, pero no es la base. La base es: no root, claves, y mirar los logs.
Generá tu clave y subila:
ssh-keygen -t ed25519 -C "tu-mail"
ssh-copy-id usuario@server
Creá usuario y dale sudo:
sudo adduser mate
sudo usermod -aG sudo mate
Endurecé SSH en /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3
AllowUsers mate
LogLevel VERBOSE
Aplicá cambios sin cortarte la rama:
sudo systemctl reload sshd
(Probá en otra consola que podés entrar antes de cerrar la sesión actual.)
Logs que importan:
sudo journalctl -u ssh -f
# o
sudo tail -f /var/log/auth.log
Y si usás UFW, limitá SSH:
sudo ufw limit 22/tcp
3) NO usar root (nunca para operar)
- Entrá siempre con tu usuario común con sudo.
- Usá
sudo -val iniciar sesión para “calentar” credenciales. - Si necesitás root puntual:
sudo -sy salí rápido conexit.
4) Actualizaciones automáticas de seguridad (sin romper nada)
En Debian/Ubuntu:
sudo apt update
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades
Chequear config:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Recomendado:
- Solo security y no todo a lo loco.
- Con “needrestart” configurado para que no te apague servicios críticos sin avisar.
- Si el server es crítico, usá ventanas de mantenimiento y monitoreo.
En Fedora/RHEL:
sudo dnf install dnf-automatic
sudo nano /etc/dnf/automatic.conf # apply_updates = yes
sudo systemctl enable --now dnf-automatic.timer
5) Firewall con UFW (y cómo convive con Docker y el proveedor)
Reglas base:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numbered
- Si usás firewall del proveedor, mantené ambos: el del proveedor filtra “fuera del server”, UFW filtra adentro. Doble capa, menos ruido.
- Con Docker, ojo: puede saltarse iptables. Solución simple para empezar: exponé solo lo que va por 80/443 y dejá el resto en redes internas de Docker. Si necesitás reglas finas, usá la cadena DOCKER-USER o ajustá el daemon.
6) Backups también son seguridad
No es opcional. Ransomware, un rm -rf mal dado, un upgrade roto… te puede pasar. Hacé que restaurar sea aburrido.
- Regla 3-2-1: 3 copias, 2 medios, 1 fuera del server.
- Encriptá en el cliente (restic/borg son clave).
- Probá restaurar de verdad (no cuentes historias).
Ejemplo minimal con restic + S3 compatible:
export RESTIC_PASSWORD="poné-una-buena-pass"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
restic -r s3:https://s3.example.com/bucket init
restic -r s3:https://s3.example.com/bucket backup /etc /var/lib/docker/volumes /home
# política de retención
restic -r s3:https://s3.example.com/bucket forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Armá un cron y logueá salidas para detectar fallos. Sin restauración probada, no hay backup.
Video embebido
Checklist rápido para quedar “decente” hoy
- [ ] nmap externo y ss/lsof interno: solo 22/80/443 públicos
- [ ] usuario no-root con sudo, root deshabilitado en SSH
- [ ] login solo por clave, PasswordAuthentication no
- [ ] logs de SSH vistos y “ufw limit 22/tcp” activo
- [ ] updates de seguridad automáticas configuradas
- [ ] UFW y firewall del proveedor cerrando todo salvo lo necesario
- [ ] backups encriptados, offsite y restauración probada
Cierre
No hay bala de plata, pero con esto dejás de estar regalado y ganás tiempo para lo importante: construir. Si te sirve, aplicalo hoy mismo. Y si te quedó alguna duda puntual de tu setup (Docker, Coolify, Caddy, Traefik), dejala en los comentarios que la vemos juntos. Abrazo y a seguir remándola con código y café.
![]()

