20 ajustes de seguridad SSH que todo sysadmin Linux debería conocer

SSH (Secure Shell) es una de las herramientas más importantes para administradores de sistemas y desarrolladores en Linux: permite iniciar sesión de forma segura en máquinas remotas, ejecutar comandos, gestionar archivos, transferir datos, hacer túneles de puertos e incluso lanzar aplicaciones gráficas a distancia.

Pero hay un problema: usar SSH con la configuración por defecto no siempre es seguro. Los atacantes escanean Internet constantemente en busca de puertos SSH abiertos y credenciales débiles. Por eso aprender a configurar y asegurar bien SSH es imprescindible.

En esta guía se repasan ajustes y consejos básicos de seguridad en SSH que cualquier principiante en Linux debería conocer para mantener sus servidores más seguros y estables.


1. Cambiar el puerto por defecto de SSH

Por defecto, SSH escucha en el puerto 22, uno de los más atacados por bots automatizados. Una medida sencilla para reducir ruido es usar un puerto no estándar.

Edita el fichero de configuración:

sudo nano /etc/ssh/sshd_config

Busca la línea:

#Port 22
Lenguaje del código: CSS (css)

Quítale la almohadilla y cambia el valor, por ejemplo:

Port 65432

Reinicia el servicio para aplicar cambios:

# Debian/Ubuntu
sudo systemctl restart ssh

# RHEL/CentOS
sudo systemctl restart sshd
Lenguaje del código: PHP (php)

No olvides abrir el nuevo puerto en el cortafuegos.

FirewallD:

sudo firewall-cmd --permanent --zone=public --add-port=65432/tcp
sudo firewall-cmd --reload
Lenguaje del código: PHP (php)

UFW:

sudo ufw allow 2200/tcp

En versiones modernas de OpenSSH gestionadas por systemd socket, puede hacer falta un override:

sudo mkdir -p /etc/systemd/system/ssh.socket.d
sudo bash -c 'cat > /etc/systemd/system/ssh.socket.d/listen.conf <<EOF
[Socket]
ListenStream=
ListenStream=65432
EOF'

sudo systemctl daemon-reload
sudo systemctl restart ssh      # o sshd según distro
Lenguaje del código: PHP (php)

2. Desactivar el acceso SSH directo de root

Permitir que root inicie sesión directamente por SSH es muy arriesgado: es el objetivo perfecto para ataques de fuerza bruta.

En sshd_config localiza:

PermitRootLogin yes

Y cámbialo por:

PermitRootLogin no

Reinicia SSH:

sudo systemctl restart sshd

A partir de ahí, conecta como usuario normal y usa sudo para tareas de administración.


3. Iniciar sesión sin contraseña usando claves SSH

Los logins con contraseña son menos seguros y cansan cuando entras muchas veces.

La alternativa recomendada es usar autenticación por clave:

Genera un par de claves en tu equipo local:

ssh-keygen -t rsa -b 4096

Copia la clave pública al servidor:

ssh-copy-id usuario@servidor-remoto
Lenguaje del código: CSS (css)

Después podrás entrar sin escribir contraseña:

ssh usuario@servidor-remoto
Lenguaje del código: CSS (css)

4. Permitir acceso SSH solo a ciertos usuarios o grupos

Para limitar quién puede entrar por SSH, puedes restringirlo por usuario o grupo.

En sshd_config:

AllowUsers alice bob

o bien:

AllowGroups admins devops

Reinicia el servicio:

sudo systemctl restart sshd

Solo esos usuarios o grupos podrán autenticarse por SSH.


5. Mostrar un mensaje de bienvenida o aviso legal al entrar por SSH

Puedes mostrar un mensaje al iniciar sesión (bienvenida o aviso legal).

Mensaje simple (MOTD):

sudo nano /etc/motd

Para un aviso más formal, crea:

sudo nano /etc/issue.net

Y en sshd_config:

Banner /etc/issue.net

Reinicia SSH:

sudo systemctl restart sshd

6. Ver intentos fallidos de inicio de sesión SSH

Es importante revisar intentos fallidos para detectar ataques.

En Debian/Ubuntu:

sudo grep "Failed password" /var/log/auth.log
Lenguaje del código: JavaScript (javascript)

En RHEL/CentOS:

sudo grep "Failed password" /var/log/secure
Lenguaje del código: JavaScript (javascript)

Para ver actividad en tiempo real:

sudo journalctl -u sshd -f

7. Restringir acceso SSH por dirección IP

Otra capa de seguridad es limitar SSH solo a IPs de confianza.

En sshd_config:

AllowUsers user@192.168.1.100
Lenguaje del código: CSS (css)

O en el cortafuegos.

FirewallD:

sudo firewall-cmd --permanent --zone=public \
  --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
sudo firewall-cmd --reload
Lenguaje del código: PHP (php)

UFW:

sudo ufw allow from 192.168.1.100 to any port 22
Lenguaje del código: CSS (css)

8. Configurar un tiempo máximo de inactividad en SSH

Para cerrar sesiones olvidadas, puedes definir un timeout de inactividad:

En sshd_config:

ClientAliveInterval 300
ClientAliveCountMax 0

Esto termina las sesiones inactivas tras unos 5 minutos.


9. Activar doble factor (2FA) en SSH

Añadir 2FA refuerza mucho la seguridad.

En Debian/Ubuntu:

sudo apt install libpam-google-authenticator
google-authenticator

Activa el módulo PAM en:

sudo nano /etc/pam.d/sshd

Añadiendo:

auth required pam_google_authenticator.so
Lenguaje del código: CSS (css)

Y en sshd_config:

ChallengeResponseAuthentication yes

Reinicia SSH:

sudo systemctl restart sshd

Desde entonces, se pedirá contraseña + código temporal.


10. Limitar intentos con Fail2ban

Fail2ban bloquea IPs que fallan demasiados intentos.

Instala en Debian/Ubuntu:

sudo apt install fail2ban

Configura la jail de SSH en:

sudo nano /etc/fail2ban/jail.local

Ejemplo:

[sshd]
enabled = true
port = ssh
maxretry = 3
Lenguaje del código: JavaScript (javascript)

Reinicia:

sudo systemctl restart fail2ban

11. Configurar autenticación por clave y desactivar contraseñas

Una vez que las claves funcionan, puedes desactivar las contraseñas:

Genera clave moderna:

ssh-keygen -t ed25519
ssh-copy-id usuario@servidor
Lenguaje del código: CSS (css)

En sshd_config:

PasswordAuthentication no

Reinicia:

sudo systemctl restart sshd

A partir de ahí solo se permitirá acceso con clave privada válida.


12. Permitir o denegar SSH con hosts.allow y hosts.deny

Con TCP Wrappers puedes filtrar por IP.

En /etc/hosts.allow:

sshd: 192.168.1.100
Lenguaje del código: CSS (css)

En /etc/hosts.deny:

sshd: ALL
Lenguaje del código: HTTP (http)

Solo esa IP podrá conectarse por SSH.


13. Ver y controlar sesiones SSH activas

Para ver quién está conectado:

who
# o
w
Lenguaje del código: PHP (php)

Para cerrar la sesión de un usuario concreto:

sudo pkill -u nombre_usuario

14. Usar túneles SSH (port forwarding)

El túnel SSH cifra tráfico hacia servicios internos.

Ejemplo de reenvío local:

ssh -L 8080:localhost:80 user@remote-server
Lenguaje del código: CSS (css)

Todo lo que vaya a localhost:8080 en tu equipo se envía a la localhost:80 del servidor remoto.


15. Activar modo detallado para depurar SSH

Para depurar problemas de conexión:

ssh -vvv user@server
Lenguaje del código: CSS (css)

-v, -vv y -vvv incrementan la verbosidad y ayudan a localizar errores de configuración o red.


16. Forzar cifrados y protocolos fuertes en SSH

Puedes endurecer SSH especificando protocolos y cifrados seguros en sshd_config:

Protocol 2
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512,hmac-sha2-256
KexAlgorithms curve25519-sha256@libssh.org
Lenguaje del código: CSS (css)

Reinicia el servicio tras los cambios.


17. Limitar acceso SSH a un rango de puertos

En UFW:

sudo ufw allow 1024:1040/tcp

En FirewallD:

sudo firewall-cmd --permanent --add-port=1024-1040/tcp
sudo firewall-cmd --reload

18. Cambiar el tiempo de espera inicial de login (LoginGraceTime)

Para limitar cuánto tiempo tiene un usuario para autenticarse:

En sshd_config:

LoginGraceTime 30

Reinicia:

sudo systemctl restart sshd

Tras 30 segundos sin autenticarse, la sesión se corta.


19. Activar compresión SSH para conexiones lentas

La compresión puede acelerar conexiones lentas:

En una conexión puntual:

ssh -C user@server
Lenguaje del código: CSS (css)

O de forma permanente en el cliente (~/.ssh/config):

Compression yes

20. Crear alias SSH para acceder más rápido

Si gestionas muchos servidores, usa alias en ~/.ssh/config:

Host mi-servidor
  HostName 192.168.1.50
  User alice
  Port 65432
Lenguaje del código: CSS (css)

Luego basta con:

ssh mi-servidor

21. Reenviar aplicaciones gráficas por SSH (X11 Forwarding)

SSH también puede reenviar aplicaciones gráficas.

Activa el reenvío con:

ssh -X user@server
Lenguaje del código: CSS (css)

Y lanza, por ejemplo:

gedit

Asegúrate de que en el servidor esté permitido:

X11Forwarding yes

Conclusión

SSH es la puerta principal a tus servidores Linux. Configurarlo bien marca la diferencia entre un sistema razonablemente protegido y un blanco fácil.

Empieza por lo básico:

  • cambiar el puerto,
  • desactivar el acceso de root,
  • usar claves en lugar de contraseñas.

Luego ve añadiendo capas: 2FA, Fail2ban, restricciones por IP, cifrados fuertes, tiempo de inactividad, alias y túneles.

Con estas prácticas tendrás un SSH mucho más seguro y ganarás confianza como administrador de sistemas Linux.

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana.

¡Apúntate a nuestro newsletter!


– patrocinadores –

Noticias destacadas

– patrocinadores –

¡SUSCRÍBETE AL BOLETÍN
DE LOS SYSADMINS!

Scroll al inicio
×