Cómo proteger un VPS Linux nuevo en 10 minutos: claves SSH, firewall, Fail2ban y actualizaciones
Un VPS nuevo con IP pública empieza a recibir intentos de acceso automatizados a los pocos minutos de estar en línea. Esta lista de comprobación muestra cómo proteger un VPS Linux nuevo en unos 10 minutos: actualizar paquetes, crear un usuario con sudo, pasar al acceso con clave SSH, desactivar el acceso de root por contraseña, abrir en el firewall solo los puertos necesarios, bloquear ataques de fuerza bruta con fail2ban y activar las actualizaciones de seguridad automáticas. Los comandos se dan para Debian/Ubuntu y para CentOS/Rocky Linux/AlmaLinux, y sirven en cualquier servidor cloud de JUSTG en Johannesburgo, Moscú, Tokio o Seúl.
Paso 1: Actualiza todos los paquetes
Entra como root (consulta nuestra guía de conexión SSH) y, antes de nada, instala los últimos parches de seguridad:
# Debian / Ubuntu
apt update && apt upgrade -y
# CentOS / Rocky / AlmaLinux
dnf upgrade -y
# reboot if a new kernel was installed
reboot
Paso 2: Crea un nuevo usuario con sudo
Trabajar siempre como root convierte cualquier error de tecleo en un riesgo, y root es el primer usuario que prueban los atacantes. Crea un usuario normal (aquí deploy) con permisos sudo. En Debian/Ubuntu el grupo de administración es sudo; en los sistemas basados en RHEL es wheel.
# Debian / Ubuntu
adduser deploy
usermod -aG sudo deploy
# CentOS / Rocky / AlmaLinux
useradd -m deploy
passwd deploy
usermod -aG wheel deploy
Paso 3: Configura la autenticación con clave SSH
Las claves SSH son mucho más seguras que las contraseñas y no se pueden adivinar. Genera el par de claves en tu propio ordenador, no en el servidor, y copia la clave pública al nuevo usuario. Protege la clave privada con una frase de contraseña.
# on your own computer (Windows PowerShell, macOS, Linux)
ssh-keygen -t ed25519 -C "my-laptop"
# macOS / Linux: copy the public key to the server
ssh-copy-id [email protected]
# Windows PowerShell (no ssh-copy-id)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Abre una terminal nueva y comprueba que puedes entrar con la clave y usar sudo:
ssh [email protected]
sudo whoami
Paso 4: Desactiva el acceso de root y la autenticación SSH por contraseña
Las versiones recientes (Debian 12, Ubuntu 22.04+, Rocky/AlmaLinux 9) leen archivos de /etc/ssh/sshd_config.d/ y se queda el primer valor encontrado. Por eso conviene un nombre que se lea primero, como 01-hardening.conf, para anular las imágenes cloud que activan contraseñas en 50-cloud-init.conf. En sistemas antiguos, cambia esas mismas líneas directamente en /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config.d/01-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
Comprueba la sintaxis y reinicia SSH:
sudo sshd -t
# Debian / Ubuntu
sudo systemctl restart ssh
# CentOS / Rocky / AlmaLinux
sudo systemctl restart sshd
Vuelve a probar desde una terminal nueva: ssh [email protected] debe ser rechazado, mientras que ssh [email protected] sigue funcionando.
Paso 5: Configura el firewall para permitir solo los puertos necesarios
Deniega todo el tráfico entrante por defecto y abre solo SSH y los servicios que realmente uses (80 y 443 para una web). Permite SSH siempre antes de activar el firewall. Si cambiaste el puerto SSH, permite ese puerto en su lugar.
# Debian / Ubuntu (ufw)
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
# CentOS / Rocky / AlmaLinux (firewalld)
sudo dnf install firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --remove-service=cockpit
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
Tanto ufw como firewalld aplican estas reglas a la IPv4 y a la dirección IPv6 gratuita de tu VPS de JUSTG.
Paso 6: Instala fail2ban contra ataques de fuerza bruta
Aunque hayas desactivado las contraseñas, fail2ban mantiene limpios los registros y bloquea a los escáneres. Vigila los fallos de autenticación y bloquea temporalmente la IP de origen. El backend systemd lee el journal y funciona en ambas familias de distribuciones.
# Debian / Ubuntu
sudo apt install fail2ban python3-systemd
# CentOS / Rocky / AlmaLinux
sudo dnf install epel-release
sudo dnf install fail2ban python3-systemd
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Paso 7: Activa las actualizaciones de seguridad automáticas
La mayoría de las intrusiones aprovechan fallos que ya tienen parche. Deja que el servidor instale solo las actualizaciones de seguridad: unattended-upgrades en Debian/Ubuntu y dnf-automatic en CentOS/Rocky/AlmaLinux.
# Debian / Ubuntu
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
sudo unattended-upgrade --dry-run --debug
# CentOS / Rocky / AlmaLinux
sudo dnf install dnf-automatic
sudo nano /etc/dnf/automatic.conf
# upgrade_type = security
# apply_updates = yes
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers dnf-automatic.timer
Las actualizaciones del kernel siguen necesitando un reinicio. Programa reinicios breves de mantenimiento o comprueba si existe /var/run/reboot-required en Debian/Ubuntu.
Preguntas frecuentes
Me quedé fuera tras desactivar las contraseñas. ¿Cómo vuelvo a entrar?
Abre la consola VNC desde el área de cliente de JUSTG, inicia sesión ahí y corrige el archivo de /etc/ssh/sshd_config.d/ o las reglas del firewall. La consola no depende de SSH ni del firewall.
¿También debo cambiar el puerto SSH?
Mover SSH fuera del puerto 22 reduce el ruido en los registros, pero por sí solo no es una protección real. Si lo haces, actualiza antes el firewall y, en Rocky/AlmaLinux con SELinux, ejecuta semanage port -a -t ssh_port_t -p tcp 2222.
¿Sirve esto para un VPS Windows?
La idea es la misma: mantén activado Windows Update, usa una contraseña de Administrator robusta y limita RDP a tus propias IP en el Firewall de Windows Defender.
Si necesitas ayuda para proteger tu servidor, abre un ticket con el soporte técnico de JUSTG.