
Introducción #
SSH (Secure SHell) es un protocolo que permite acceder y gestionar otros ordenadores de forma remota, mediante un túnel de red cifrado y seguro. Toda la comunicación está protegida criptográficamente incluso en entornos de red no confiables.
Se instala el paquete ssh o openssh-server
Y se configuran los archivos /etc/ssh/sshd_config para el servidor y en el archivo /etc/ssh/ssh_config para el cliente.
Configuración del servidor #
Editamos el fichero de configuración del servidor con los parámetros deseados. Algunas de las opciones más relevantes son:
Port 22
PermitRootLogin (no|prohibit-password|yes)
PasswordAuthentication (yes|no)
PubkeyAuthentication (yes|no)
AuthorizedKeysFile .ssh/authorized_keys
LoginGraceTime 1m
MaxAuthTries (N)
MaxSessions (N)
AllowTcpForwarding (yes|no)
X11Forwarding (yes|no)
PermitTunnel (yes|no)
AllowUsers (user)Y a continuación reiniciamos el servicio systemctl restart ssh.service
Llaves de autenticación #
Es muy común, que tal como abrimos el puerto 22 (si no lo hemos cambiado) empezemos a recibir cientos de ataques de autenticación por fuerza bruta.
Una de las opciones de seguridad más utilizadas es la identificación por un par de llaves (publica y privada), de este modo sustituimos la contraseña por un problema criptográfico que solo tu llave privada puede resolver, eliminando el factor de ataque por fuerza bruta. También es un requisito indispensable en muchos entornos Cloud o servicios de hosting de servidores.
Para crear un par de llaves:
ssh-keygen ed25519
En el cliente, la pareja de llaves las guardaremos generalmente en ~/.ssh/
En el servidor, almacenaremos la llave pública en el interior del archivo ~/.ssh/authorized_keys
Para conectar utilizando una llave concreta usaremos:
ssh -i ~/.ssh/mysecretkey.key user@server
SCP (Secure Copy Protocol) #
SCP es un método para transferir archivos y directorios mediante un túnel SSH, de manera que se hace la transferencia utilizando la autenticación, cifrado y protocolo de ssh.
Ejemplos de copia mediante SCP:
scp -r /directori/original user@host:/ruta/copia/remota
scp -P 2202 user@host:/directori/original/archivo.txt /ruta/copia/local/archivo.txt
SSH Tunneling (Redireccionamiento de puertos) #
El redireccionamiento de puertos nos permite encapsular el tráfico de una apicación a través de una conexión SSH segura. Esto nos permite acceder a un servicio remoto sin exponer los puertos directamente a internet.
La sintaxis és:
ssh -L [Puerto_Local]:[Direccion_desde_servidor]:[Puerto_Remoto]
En este ejemplo, redireccionamos el puerto 80 del servidor, al puerto 8080 de nuestra máquina local. De este modo, si entramos a la direccion http://localhost:8080 podremos acceder al servidor web remoto.
ssh -L 8080:localhost:80 user@server
Configuración de hosts #
Si necesitamos conectarnos a una relevante variedad de equipos puede volverse un poco engorroso, recordar los puertos, usuarios, archivos de llaves, etc.
Para facilitar esta gestión hay el fichero ~/.ssh/config, el cual podemos crear si no existe. Dentro listamos todos los hosts o servidores con sus parámetros de conexión tal que así:
Host servidor1
HostName 10.100.10.5
User ubuntu
Port 22
IdentityFile ~/.ssh/ssh_key_2026-02-11.key
Host servidor2
HostName 172.18.20.11
User paco
Port 2797
IdentityFile ~/.ssh/ssh_key_paco.key
# Github
Host github.com-user
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_git_user.key
# Github work
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_git_work.keyY luego para conectar usaremos ssh servidor2, automáticamente consultará el fichero de configuración y creará la conexión sin que tengamos que especificar el resto de parámetros manualmente.
SSHFS (Secure SHell File System) #
SSHFS básicamente nos permite montar un sistema de archivos remoto en nuestro sistema de archivos local usando SSH. A diferencia de SCP que nos sirve para copiar archivos o directorios concretos, SSHFS nos permite trabajar con los archivos remotos como si estuvieran en nuestro propio sistema.
Comprobar que esté instalado el paquete sshfs
Hay que crear la carpeta donde se quiera montar el FS, por ejemplo
mkdir -p /mnt/remotefs
y montamos el directorio remoto
sshfs user@host:/ /mnt/remotefs
Y ya podemos trabajar normalmente con él. Para demontarlo usaremos:
fusermount -u /mnt/remotefs
SFTP (Secure File Transfer Protocol) #
SFTP és un protocolo de transferencia de archivos de forma segura mediante el protocolo SSH. No debe confundirse con FTPS que és una implementación del protocolo FTP sobre TLS.
Ejemplo de conexión SFTP por el puerto 2222 y con archivo de llaves.
sftp -P 2222 -i ~/.ssh/privatekey.key user@host
| Acción | Orden |
|---|---|
| subir | put archivo.txt |
| Descargar | get archivo.txt |
| Listar archivos remotos | ls |
| Listar archivos locales | lls |
| Sair | exit |
Mencionar que normalmente se puede conectar también mediante el explorador de archivos nomal del sistema o mediante programas como FileZilla, aunque a veces puede requerir configuraciones extra para configurar las llaves en el caso de usarse.
Consultar logs de autenticación con journal #
Es importante monitorizar las conexiones a nuestro servidor, especialmente si lo tenemos expuesto a internet, para ello en sistemas modernos con systemd usaremos la herramienta journalctl
Ver intentos de conexión en tiempo real:
journalctl -u ssh -f
Ver los últimos 50 intentos:
journalctl -u ssh -n 50
Ver las últimas autenticaciones aprobadas
journalctl -u ssh -n 50 | grep Accepted
Hardening #
En el archivo de configuración del servidor: #
-
Cambiar el puerto del 22 a otro más alto y aleatorio.
-
Deshabilitar el acceso root
-
Deshabilitar el acceso con contraseña
-
Limitar los usuarios que pueden conectarse con AllowUsers
-
Desactivar el x11 forwarding
En el cliente: #
-
Crear llaves de acceso
-
No reutilitzar llaves entre servidores
-
Poner una contraseña a la llave para que no la puedan descifrar si nos la roban
-
Revisar los permisos de la llave para que solo el usuario legítimo pueda leerlas.
En general: #
-
Crear un usuario para cada trabajo (si has de hacer un backup, que tenga un usuario propio con una llave propia y permisos restringidos a su tarea)
-
Reducir la superfície de ataque. (Necesitas ssh abierto a internet? Puedes conectar por VPN?, tienes un sistema de respaldo para acceder si ssh falla?)
-
Limitar las direcciones ip que pueden conectar. Poner tus ip’s fijas, si no tienes el rango de tu ISP, o de tu país, etc.
Bastion Host o Jump Server: #
Un bastión o un servidor de salto es un servidor intermediario con alta seguridad (expuesto a internet) que actúa como puerta de entrada única para acceder de forma segura a otros nodos.
De este modo a tu servidor final solo permites conexiones desde el servidor bastion o de salto y para conectarte te conectas por ssh al bastion y otra vez por ssh del bastion al host final.
Fail2Ban / Crowdsec #
Especialmente si el servidor está expuesto a internet, configurar fail2ban o crowdsec para bloquear las conexiones desde las direcciones que te están atacando con fuerza bruta.