Ir al contenido

Algunos apuntes sobre SSH

Jordi Fàbregas
Autor
Jordi Fàbregas
Administrador de Sistemas y Redes. Entusiasta del software libre.
Tabla de contenido

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.key

Y 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.