Seguridad básica para tu server self-hosted (2026) | SSH, Firewall, Updates y Backups

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 -v al iniciar sesión para “calentar” credenciales.
  • Si necesitás root puntual: sudo -s y salí rápido con exit.

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.
VER:  Claude Code por solo 3 USD

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é.

Loading

Esta entrada fue publicada el youtube. Agregá a favoritos el enlace permalink.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *