SSH
Introducción
SSH es un protocolo de red que permite a los usuarios conectarse a una máquina remota y ejecutar comandos de forma segura. Tiene una antigüedad de 20 años y a día de hoy cada vez se emplea más en detrimento de otros protocolos como telnet o rsh.
Su origen están en telnet, rlogin y rsh. Son muy utilizados desde los años 70, pero a partir de los 90 se empezaron a utilizar SSH y SSL. La conexión no es cifrada en ninguno de ellos, a lo igual que su autenticación, por lo que son inseguros. Es verdad que son empleados en entornos seguros, pero debido a la vulnerabilidad de la red, no se recomienda su uso.
En los años 90, dado a las limitaciones a la que nos enfrentamos, se cifra por completo todo el proceso: autenticación, conexión y transmisión de datos. Esto se consigue mediante SSH y SSL. En todo momento se emplea un cifrado simétrico y asimétrico, por lo que no será posible que se pueda acceder a la información en ningún momento.
Lo desarrolla Tatu Ylönen en 1995, y se basa en el cifrado de clave pública. En 1996 se publica la versión 1.0, y en 1998 la 2.0. En 2006 se publica la versión 2.0 de SSH. Tras ello, funda SSH Communications Security y se encarga de la evolución del protocolo. No será hasta 1999 cuando se desarrolla OpenSSH, una implementación libre de SSH.
OpenSSH
OpenSSH es un proyecto que se desarrolla en OpenBSD y que se encarga de la implementación libre de SSH. Es un proyecto muy activo, y se encarga de mantener el protocolo actualizado y seguro. Es el que se emplea en la mayoría de distribuciones de Linux, y es el que se empleará en este documento. Está escrito en C, y se compone de varios programas que se encargan de la gestión de las conexiones.
A día de hoy, es utilizada en BSD, Linux, macOS, Solaris, AIX, HP-UX, IRIX, Windows y z/OS. Se apoya en el proyecto LibreSSL, que se encarga de la implementación libre de SSL.
Está compuesto por:
- ssh: cliente que permite conectarse a una máquina remota.
- sshd: servidor que permite que un cliente se conecte a la máquina.
- scp: cliente que permite copiar archivos de forma segura.
- sftp: cliente que permite transferir archivos de forma segura.
- ssh-keygen: herramienta que permite generar claves públicas y privadas.
- ssh-agent: herramienta que permite gestionar las claves privadas.
Diferentes formas de autenticación
Existen diferentes formas de autenticación para conectarnos a una máquina remota. El método estandar es a través de contraseña, empleando una contraseña y un usuario al servidor remoto. Es un método bastante ineficaz, pero es el más utilizado.
También podemos hacerlo a través del método de clave pública. Es decir, a través de este método, generamos un par de claves, una pública y otra privada. La pública se almacena en el servidor remoto, y la privada en el cliente. Cuando nos conectamos al servidor, se comprueba que la clave pública del cliente se encuentra en el servidor, y si es así, se nos permite el acceso. Es un método mucho más seguro que el anterior, y es el que se recomienda utilizar.
Otra forma de conexión es a través de Kerberos, que se emplea principalmente en entorno corporativos y que permite la autenticación de usuarios en una red. Es un método muy seguro, pero no se emplea en entornos domésticos. Para ello, necesitaríamos configurar un servidor de Kerberos, y es más restrictivo que el resto de métodos, normalmente de uso corporativo.
Cómo funciona SSH
El proceso de conexión consta de dos fases:
-
La negociación, en la que el cliente se conecta al servidor y el servidor le devuelve que tipo de versión de SSH emplea, que algoritmos de cifrado emplea, etc. El servidor envía su clave pública qal cliente. El cliente tiene que verificar que la clave pública del servidor es correcta, y si es así, negocian el algoritmo que van a emplear. Cuando los dos han compartido la misma clave sesión y verifican que es la misma, se procede a la conexión.
-
La autenticación que, una vez establecida la clave de sesión, el servidor le ofrece el método de autenticación disponible y el cliente se autentica frente al servidor. El cliente ofrece el método de autenticación que quiere emplear, y el servidor le devuelve si es correcto o no. Si es correcto, se procede a la conexión y se abre sesión de forma remota.
Preparando el escenario
Para llevar a cabo la configuración de SSH, emplearemos dos máquinas virtuales. Una de ellas será el servidor, y la otra el cliente. Ambas máquinas virtuales se encuentran en la misma red, y tienen acceso a internet. Lo haremos a través de VirtualBox y Vagrant.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.define "server" do |server|
server.vm.box = "debian/buster64"
server.vm.hostname = "server"
server.vm.network "private_network", ip: "10.0.100.1"
server.vm.provider "virtualbox" do |vb|
vb.memory = "512"
end
end
config.vm.define "client" do |client|
client.vm.box = "debian/buster64"
client.vm.hostname = "client"
client.vm.network "private_network", ip: "10.0.100.2"
client.vm.provider "virtualbox" do |vb|
vb.memory = "512"
end
end
endInstalamos OpenSSH
Para instalar OpenSSH en nuestro sistema, emplearemos el siguiente comando:
sudo apt install openssh-server
Comprobamos que el servicio se encuentra en ejecución:
sudo systemctl status openssh-server
Si queremos verificarlo a través del puerto, podemos emplear el comando netstat:
netstat -ltnp | grep ssh
Configuración de OpenSSH
La configuración de OpenSSH se encuentra en el fichero /etc/ssh/sshd_config. En este fichero, podemos configurar diferentes parámetros, como el puerto, el protocolo, el tipo de autenticación, etc.
sudo nano /etc/ssh/sshd_config
---
passwordauthentication yes|no
challengeresponseauthentication yes|no
permitemptypasswords yes|noEstos parámetros nos permiten configurar la autenticación. Si queremos que se autentique a través de contraseña, emplearemos passwordauthentication yes. Si queremos que se autentique a través de clave pública, emplearemos passwordauthentication no. Si queremos que se autentique a través de Kerberos, emplearemos challengeresponseauthentication yes. Si queremos que se autentique a través de contraseña vacía, emplearemos permitemptypasswords yes.
Generación de claves
Para generar un par de claves, emplearemos el comando ssh-keygen. Este comando nos permite generar un par de claves, una pública y otra privada. La pública se almacenará en el servidor remoto, y la privada en el cliente.
ssh-keygen -t edcsa
Una vez generadas las claves, se almacenarán en el directorio ~/.ssh. En el caso de la clave pública, se almacenará en el fichero id_rsa.pub, y en el caso de la clave privada, se almacenará en el fichero id_rsa.

Copia de claves
Para copiar la clave pública al servidor, emplearemos el comando ssh-copy-id. Este comando nos permite copiar la clave pública al servidor remoto, y almacenarla en el fichero ~/.ssh/authorized_keys.
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor
Conexión a través de SSH
Una vez copiada la clave pública, podemos conectarnos al servidor remoto sin necesidad de contraseña.
ssh usuario@servidor
La primera vez que nos conectamos, nos aparecerá el siguiente mensaje:
The authenticity of host 'ip (ip)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?Esto es debido a que la clave pública del servidor no se encuentra en el fichero ~/.ssh/known_hosts. Para ello, o bien aceptamos la conexión, o bien añadimos la clave pública del servidor al fichero ~/.ssh/known_hosts.

Uso de SSH-Agent
No es uno de los componentes más conocidos y empleados de ssh, pero es el encargado de almacenar las claves privadas. En el caso de que utilicemos una clave privada sin frase de paso, la incorporará automáticamente. En el caso de que utilicemos una clave privada con frase de paso, nos pedirá que introduzcamos la frase de paso para poder almacenarla.
ssh-add
¿Qué es el fichero authorized_keys?
El fichero authorized_keys se encuentra en el directorio ~/.ssh y es el encargado de almacenar las claves públicas de los usuarios que se pueden conectar al servidor. Si queremos que un usuario se pueda conectar al servidor, tendremos que copiar su clave pública en este fichero.
¿Qué es el fichero known_hosts?
El fichero known_hosts se encuentra en el directorio ~/.ssh y es el encargado de almacenar las claves públicas de todos los servidores a los que nos hemos conectado. Si queremos que un usuario se pueda conectar al servidor, tendremos que copiar su clave pública en este fichero.
En caso de no coincidir la clave pública del servidor con la que se encuentra en el fichero known_hosts, nos aparecerá el siguiente mensaje:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:88
remove with:
ssh-keygen -f "/home/user/.ssh/known_hosts" -R ip-server
ECDSA host key for ip-server has changed and you have requested strict checking.
Host key verification failed.Puede tratarse de una suplantación y, por lo tanto, no se nos permite la conexión por seguridad. En caso de que queramos realizar la conexión, tendremos que eliminar la clave pública del servidor del fichero known_hosts tal como nos indica el mensaje.
Agent forwarding
El agent forwarding es una característica de SSH que nos permite reenviar las peticiones de autenticación al servidor remoto. Es decir, si nos conectamos a un servidor remoto, y desde ese servidor remoto nos queremos conectar a otro servidor, el agent forwarding nos permite reenviar la petición de autenticación al servidor remoto.
Primero, deberemos asegurarnos de que el agent forwarding está activado en el servidor. Para ello, deberemos añadir la siguiente línea al fichero ~/.ssh/config:
allowagentforwarding yesY en el cliente, deberemos añadir la siguiente línea al fichero ~/.ssh/config:
ForwardAgent yesComprobamos que está definida la variable DISPLAY cuyo valor lo podemos definir a través de la variable X11DisplayOffset. Si no está definida, la definimos:
export DISPLAY=localhost:10.0Y comprobamos que está activado el agent forwarding:
env | grep DISPLAYTransferencia de archivos
SSH incluye un comando, el scp que nos permite transferir archivos de forma segura. Su funcionamiento es muy sencillo, dado que realiza la transferencia al estilo de un servido SFTP pero a través del puerto 22. Este comando se emplea de la siguiente forma:
scp usuario@host1:archivo usuario@host2:rutaConclusiones
Hoy en día se hace más necesario que nunca el empleo de protocolos seguros, y SSH es uno de ellos. Es un protocolo que se emplea en la mayoría de sistemas operativos, y que nos permite conectarnos a una máquina remota de forma segura. Debido al uso de máquinas virtuales, tanto on-premise como en la nube, se hace cada vez más imprescindible el uso de este protocolo.