Saltar al contenido
StealthRDP
Administración de VPS

Reforzar SSH: lista de comprobación para asegurar un VPS Linux

Cómo asegurar SSH en un VPS nuevo con Ubuntu 24.04: claves SSH, ajustes de sshd, UFW y Fail2ban, con una prueba en cada paso para no perder el acceso.

Publicado el

9 min de lectura

Con esta lista de comprobación para asegurar SSH, un VPS nuevo con Ubuntu 24.04 LTS pasa de admitir el acceso como root con contraseña a admitir solo el acceso con clave de un único usuario, y queda protegido por un cortafuegos y por Fail2ban. Cada paso con riesgo incluye una prueba que haces con tu sesión actual todavía abierta, y la guía indica en qué se diferencia Debian 12. Si tu servidor usa Windows, nuestros consejos de seguridad para el escritorio remoto tratan los mismos puntos para RDP.

La lista para asegurar SSH, de un vistazo

Reforzar SSH en un servidor nuevo lleva once pasos, y el orden importa: consigue que un usuario con sudo entre con clave antes de desactivar el acceso de root y el acceso con contraseña, y permite SSH en el cortafuegos antes de activarlo.

Paso Riesgo de quedarte fuera
1. Actualizaciones de seguridad automáticas Ninguno
2. Un usuario con sudo Ninguno
3-4. Acceso con clave SSH Ninguno
5-7. Sin acceso de root ni contraseñas Sí: prueba un segundo inicio de sesión
8. Un nuevo puerto SSH (opcional) Sí
9. Cortafuegos UFW Sí
10. Fail2ban Puede bloquear tu propia dirección
11. Servicios sin usar desactivados Ninguno

Prepara el servidor: actualizaciones y un usuario con sudo

Si trabajas como root, sudo es opcional en los dos primeros pasos. En toda la guía, sustituye deploy por tu nombre de usuario y 203.0.113.10 por la dirección IP de tu servidor.

1. Actualiza el sistema y activa las actualizaciones de seguridad automáticas

Instala primero las actualizaciones pendientes: apt update refresca las listas de paquetes y apt upgrade instala las versiones nuevas. [1]

Actualiza el sistema
sudo apt update
sudo apt upgrade

En Ubuntu, las actualizaciones de seguridad se instalan solas mediante el paquete unattended-upgrades, que viene instalado por defecto y se ejecuta una vez al día. Los dos valores de /etc/apt/apt.conf.d/20auto-upgrades deben ser «1», y una simulación muestra qué instalaría. [1]

Comprueba las actualizaciones automáticas
cat /etc/apt/apt.conf.d/20auto-upgrades
sudo unattended-upgrade --dry-run -v
Contenido esperado de /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

El paquete no reinicia el servidor por sí solo, porque Unattended-Upgrade::Automatic-Reboot está en false por defecto, así que reinícialo a mano cuando una actualización lo requiera. [1] En Debian 12, si falta el paquete o el archivo, instala unattended-upgrades y crea el archivo con las dos líneas de arriba.

2. Crea un usuario con sudo que no sea root

Haz las tareas de administración con tu propio usuario y sudo, que pide la contraseña de ese usuario, no la de root. Con este comando, los miembros del grupo sudo obtienen acceso root completo. [2]

Crea el usuario y añádelo al grupo sudo
sudo adduser deploy
sudo adduser deploy sudo

adduser pide una contraseña y algunos datos opcionales. [2] Elige una contraseña larga: SSH usará claves, pero sudo te la seguirá pidiendo. Después comprueba la cuenta; sudo whoami debe mostrar root.

Comprueba sudo con el nuevo usuario
su - deploy
sudo whoami

En Debian 12, si no tienes el comando sudo, instálalo antes como root con apt install sudo.

Configura el acceso con clave SSH

3. Genera una clave ed25519 en tu equipo

Crea el par de claves en tu propio equipo, no en el servidor. Ubuntu recomienda el tipo ed25519 porque sus claves son más cortas y su coste computacional es menor, y ssh-keygen pide una frase de contraseña que protege la clave privada. [3]

Linux o macOS
ssh-keygen -t ed25519

Deja el nombre de archivo predeterminado. La clave privada es ~/.ssh/id_ed25519; la pública, la que copias a los servidores, es ~/.ssh/id_ed25519.pub. [3]

En Windows, ejecuta el mismo comando en PowerShell; el par se guarda en la carpeta .ssh de tu perfil de usuario. Microsoft desaconseja dejar vacía la frase de contraseña y advierte de que cualquiera que consiga la clave privada puede iniciar sesión como tú. [4]

Windows PowerShell
ssh-keygen -t ed25519

4. Copia la clave pública al servidor

En Linux y macOS, ssh-copy-id añade tu clave pública al final del archivo ~/.ssh/authorized_keys del usuario en el servidor. [3]

Linux o macOS
ssh-copy-id deploy@203.0.113.10

La guía de Microsoft, en cambio, copia las claves con PowerShell o con scp. [4] Para un servidor Linux, esta línea añade tu clave y hace que solo tú puedas escribir en la carpeta y en el archivo:

Windows PowerShell
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

sshd comprueba estos permisos antes de aceptar un inicio de sesión, con la opción StrictModes, que está activada por defecto. [5] Después ejecuta ssh deploy@203.0.113.10 en otra ventana de terminal: deberías entrar sin la contraseña de la cuenta. Si no es así, observa en tiempo real el log de SSH del servidor mientras vuelves a intentarlo: [3]

En el servidor
sudo journalctl -fu ssh.service

Restringe sshd: acceso de root, contraseñas y usuarios

Los siguientes pasos desactivan el acceso de root y el acceso con contraseña. Empieza solo cuando ya puedas entrar con clave como el nuevo usuario, y mantén esa sesión abierta hasta que funcione un segundo inicio de sesión.

5. Escribe tus ajustes en un archivo drop-in

En Ubuntu, /etc/ssh/sshd_config empieza con Include /etc/ssh/sshd_config.d/*.conf, y, en la mayoría de los ajustes, OpenSSH se queda con el primer valor que lee, así que los archivos de esa carpeta tienen prioridad sobre el archivo principal. [3] Los archivos incluidos se leen en orden lexicográfico y, para cada palabra clave, gana el primer valor que obtiene sshd, [5] así que llama al tuyo 00-hardening.conf.

/etc/ssh/sshd_config.d/00-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers deploy

Según el manual de sshd_config:

  • PermitRootLogin no impide que root inicie sesión por SSH. El valor por defecto, prohibit-password, rechaza las contraseñas de root, pero sigue aceptando claves. [5]
  • PasswordAuthentication no desactiva el inicio de sesión con contraseña, que está permitido por defecto. [5]
  • KbdInteractiveAuthentication no desactiva el inicio de sesión keyboard-interactive (interactivo por teclado), un método distinto que también está activado por defecto; su nombre antiguo es ChallengeResponseAuthentication. [5]
  • AllowUsers deploy (opcional) solo deja iniciar sesión a los usuarios de la lista. A diferencia de la mayoría de las palabras clave, cada línea AllowUsers amplía la lista. [5] Escribe el nombre sin errores, o no podrá entrar nadie.

A partir de ahora, trata la cuenta con sudo como si fuera root: las notas del paquete openssh de Ubuntu consideran que, frente a ataques externos, cualquier cuenta desde la que se pueda escalar a root equivale a root. [6] En Debian 12, comprueba primero la línea Include con grep -n Include /etc/ssh/sshd_config.

6. Busca archivos que vuelvan a activar las contraseñas

Como gana el primer valor, cualquier archivo que vaya antes que el tuyo en ese orden tiene prioridad sobre él. Revisa la carpeta:

Busca todos los archivos que definen estas opciones
ls /etc/ssh/sshd_config.d/
sudo grep -riE 'passwordauthentication|kbdinteractive|permitrootlogin|allowusers' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

En las imágenes para la nube, cloud-init escribe los ajustes de SSH que gestiona en /etc/ssh/sshd_config.d/50-cloud-init.conf siempre que sshd_config incluya esa carpeta. [7] Si ese archivo contiene PasswordAuthentication yes, tiene prioridad sobre todos los archivos que van después, y por eso el tuyo empieza por 00. Cámbialo también a no para que los archivos coincidan.

7. Comprueba la configuración y reinicia SSH

Comprueba los archivos antes de reiniciar: un ajuste erróneo puede impedir que sshd arranque, y SSH puede ser tu única forma de entrar. [3]

Comprueba y después reinicia
sudo sshd -t
sudo systemctl restart ssh.service

Corrige primero todo lo que señale sshd -t. Después del reinicio, mantén tu sesión abierta y prueba desde una segunda ventana de terminal:

Desde tu equipo, en otra ventana de terminal
ssh deploy@203.0.113.10
ssh root@203.0.113.10

El primer inicio de sesión debe funcionar, y el servidor debe rechazar el segundo. Si no puedes entrar, deshaz el cambio en la sesión abierta y revisa el log de SSH del paso 4. [3]

¿Conviene cambiar el puerto SSH?

Solo si quieres logs con menos ruido. Con otro puerto, SSH deja de escuchar en el 22, el predeterminado, [5] así que los bots que solo prueban ese puerto no lo encuentran, pero un escaneo de todos los puertos sigue encontrando SSH. El trabajo de verdad lo hacen las claves y la desactivación de las contraseñas.

8. Cambia el puerto en Ubuntu 24.04 (opcional)

Si UFW u otro cortafuegos ya está activado, permite primero el nuevo puerto. Mantén tu sesión abierta hasta que consigas iniciar sesión en el nuevo puerto.

En Ubuntu 24.04, ssh.socket escucha en el puerto 22 mediante la activación por socket de systemd. Un generador convierte las líneas Port de sshd_config y de sus archivos drop-in en ajustes del socket, así que, después de cambiar el puerto, hay que recargar systemd y reiniciar ssh.socket. [6]

sshd admite más de una línea Port, [5] así que mantén el 22 mientras pruebas el nuevo puerto:

Añade a /etc/ssh/sshd_config.d/00-hardening.conf
Port 22
Port 2222
Aplica el cambio de puerto en Ubuntu 24.04
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Prueba el nuevo puerto desde una segunda ventana de terminal. Después borra Port 22, repite los tres comandos y usa el puerto 2222 en los pasos 9 y 10.

Desde tu equipo, en otra ventana de terminal
ssh -p 2222 deploy@203.0.113.10

En Debian 12, comprueba primero si se usa el socket. Si está inactivo, basta con reiniciar el servicio para aplicar el cambio.

Debian 12
systemctl is-active ssh.socket
sudo systemctl restart ssh.service

Cortafuegos, Fail2ban y puertos abiertos

9. Permite SSH en UFW y después actívalo

Activar UFW puede cortar tu sesión SSH y, a partir de ese momento, bloquea todos los puertos que no hayas permitido. Añade la regla de SSH antes de ejecutar ufw enable.

UFW viene instalado pero desactivado y, una vez activado, deniega por defecto el tráfico entrante. Su manual advierte de que ufw enable puede cortar las conexiones SSH, así que añade primero la regla de SSH. [8]

Para SSH, usa limit en lugar de allow. Una regla limit sigue permitiendo las conexiones, pero deniega el acceso a una dirección que intente abrir 6 o más en 30 segundos. No añadas las dos reglas, porque UFW aplica la primera regla que coincide. [8]

Limita las conexiones SSH y después activa UFW
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verbose

UFW pide confirmación cuando lo activas por SSH. [8] Si has movido SSH a otro puerto, limita 2222/tcp en su lugar. En Debian 12, si no tienes el comando, instala UFW primero. Para que SSH no sea accesible en absoluto desde internet, accede a él solo a través de una red privada con WireGuard. Para protegerte más allá del propio servidor, consulta nuestra lista de comprobación de protección DDoS para VPS.

10. Añade Fail2ban con la jail sshd

Fail2ban puede bloquear tu propia dirección IP tras varios inicios de sesión fallidos. Si tienes una IP fija, ponla en ignoreip, y mantén tu sesión abierta mientras haces pruebas.

En Ubuntu 24.04, el paquete incluye /etc/fail2ban/jail.d/defaults-debian.conf, que activa la jail sshd, define backend = systemd y aplica los bloqueos mediante nftables. [9] El backend systemd lee el journal de systemd, así que la jail no necesita un archivo de log aparte. [10]

Instala Fail2ban y lee los valores por defecto del paquete
sudo apt install fail2ban
cat /etc/fail2ban/jail.d/defaults-debian.conf

El propio jail.conf de Fail2ban bloquea una dirección durante 10 minutos cuando esta acumula 5 fallos en 10 minutos, y te pide que no edites ese archivo: pon tus cambios en jail.local. [10]

/etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 198.51.100.7

Sustituye 198.51.100.7 por tu propia dirección fija, o bórrala. La jail que viene de serie usa port = ssh, así que añade port = 2222 si has movido SSH. [10] En Debian 12, deja backend = systemd aquí e instala python3-systemd, la biblioteca de Python para systemd que usa este backend. [10] Después reinicia Fail2ban y comprueba que está en marcha:

Aplica los ajustes
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

11. Comprueba qué más está escuchando

Cada puerto abierto es otra vía de entrada. El informe de puertos en escucha de UFW muestra cada puerto TCP en escucha y cada puerto UDP abierto, su dirección (* significa todas las interfaces), el programa que hay detrás y las reglas que se le aplican. [8]

Muestra los puertos en escucha y sus reglas
sudo ufw show listening

Un servicio que escucha en 127.0.0.1 solo es accesible desde el propio servidor. Desactiva los servicios públicos que no necesites con systemctl disable --now, como hacen las notas de openssh de Ubuntu con ssh.socket. [6]

Desactiva un servicio que no necesitas
sudo systemctl disable --now SERVICE_NAME

Si te quedas fuera

La mayoría de las veces, quien se queda fuera ha cerrado demasiado pronto la última sesión que funcionaba. Si aun así te pasa:

  • Usa una sesión que siga abierta para deshacer el último cambio, ejecutar sshd -t y reiniciar.
  • Espera un poco si UFW te ha rechazado: su regla limit cuenta los intentos de los últimos 30 segundos. [8]
  • Espera a que termine el bloqueo de Fail2ban, que dura lo que indique bantime (una hora en el jail.local de arriba), [10] o conéctate desde otra red, por ejemplo compartiendo la conexión de tu teléfono.
  • Como último recurso, reinstala el servidor. En StealthRDP, el centro de ayuda explica cómo reinstalar un servidor desde el área de cliente: eliges el sistema operativo, esperas de 3 a 5 minutos y te conectas por SSH. La reinstalación deja un sistema limpio, así que tendrás que restaurar tus datos desde una copia de seguridad; nuestra guía de copias de seguridad automáticas para VPS te ayuda a configurarlas antes de que te hagan falta.

¿Tienes dudas? El soporte de StealthRDP está disponible 24/7 por Telegram, mediante tickets en el área de cliente y por correo en info@stealthrdp.com.

Preguntas frecuentes

¿Qué significa reforzar SSH?

Reforzar SSH (en inglés, SSH hardening) consiste en cambiar la configuración del servidor SSH para que puedan entrar menos cuentas y con menos métodos de inicio de sesión: claves en lugar de contraseñas, sin acceso de root y, si quieres, solo los usuarios que indiques. OpenSSH acepta por defecto el inicio de sesión con contraseña y el método keyboard-interactive, así que son lo primero que hay que cerrar. [5]

¿Por qué no funciona «PasswordAuthentication no» en Ubuntu?

Lo más probable es que otro archivo defina esa opción antes. El sshd_config de Ubuntu incluye /etc/ssh/sshd_config.d/ al principio del todo, y OpenSSH se queda con el primer valor que encuentra. [3] En las imágenes para la nube, revisa 50-cloud-init.conf en esa carpeta, donde cloud-init escribe sus ajustes de SSH. [7]

¿Cambiar el puerto SSH mejora la seguridad?

Solo un poco. Saca SSH del puerto predeterminado, el 22, así que los bots que solo prueban ese puerto ya no lo encuentran, pero un escaneo completo de puertos lo sigue encontrando. [5] Las claves y la desactivación de las contraseñas protegen mucho más.

¿Debo desactivar el acceso de root por SSH?

Sí, en cuanto un usuario con sudo pueda iniciar sesión con clave. Con PermitRootLogin no, sshd rechaza a root por completo, mientras que el valor por defecto, prohibit-password, sigue aceptando claves para root. [5] Las notas de openssh de Ubuntu añaden que tu cuenta con sudo merece el mismo cuidado que root. [6]

¿Necesito Fail2ban si SSH solo acepta claves?

Es opcional, pero útil: bloquea las direcciones que fallan una y otra vez, por defecto tras 5 fallos en 10 minutos. [10] En Ubuntu 24.04, el paquete activa por defecto su jail sshd. [9]

¿UFW viene activado por defecto en Ubuntu?

No. UFW viene instalado pero desactivado y, una vez activado, deniega las conexiones entrantes que no permita ninguna regla. [8] Añade una regla para SSH antes de ejecutar ufw enable.

Fuentes y referencias
  1. Automatic updates — Ubuntu Server documentation (consultado el 2026-11-03)
  2. User management — Ubuntu Server documentation (consultado el 2026-11-03)
  3. OpenSSH server — Ubuntu Server documentation (consultado el 2026-11-03)
  4. Key-based authentication in OpenSSH for Windows — Microsoft Learn (consultado el 2026-11-03)
  5. sshd_config(5): OpenSSH daemon configuration file — OpenBSD manual pages (consultado el 2026-11-03)
  6. openssh: debian/README.Debian (ubuntu/noble-updates) — Ubuntu (Launchpad) (consultado el 2026-11-03)
  7. cloudinit/ssh_util.py — GitHub (canonical/cloud-init) (consultado el 2026-11-03)
  8. ufw - program for managing a netfilter firewall — Ubuntu Manpages (consultado el 2026-11-03)
  9. fail2ban: debian/debian-files/jail.d_defaults-debian.conf (ubuntu/noble-updates) — Ubuntu (Launchpad) (consultado el 2026-11-03)
  10. fail2ban 1.0.2: config/jail.conf — GitHub (fail2ban/fail2ban) (consultado el 2026-11-03)

Sigue leyendo