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.