SSH: Cómo conectarnos sin usar contraseña

Publicado por Diego Córdoba en

Hoy aprenderemos a utilizar autenticación SSH sin necesidad de colocar una contraseña, ya sea para acceder a la terminal, o para scp/sftp, o cualquier servicio que necesite autenticarse utilizando este protocolo de túnel seguro.

Autenticación en SSH

Un usuario _SSH_ se puede autenticar de varias maneras, entre ellas, utilizando una contraseña, y utilizando un juego de claves asimétricas.ssh

El caso de hoy se centra en el uso de llaves asimétricas.

Para qué nos sirven? Principalmente, para no tener que escribir la contraseña cada vez que nos conectamos con un servicio ssh_ remoto. Esto puede ser sumamente útil si requerimos ejecutar comandos remotos desde dentro de un script, por ejemplo.

Veamos una configuración básica de una autenticación usando clave asimétrica.

Conectándonos a un servidor sin usar contraseña

Vamos a suponer que el servidor 10.0.0.20 ya dispone de el servicio corriendo. En el cliente deberemos crear, primero, nuestro juego de claves, privada y pública, y luego copiar la clave pública dentro del archivo authorized_keys del servidor, en el home del usuario destino.

Para aclarar un poco, en un sistema Linux cada usuario tendrá, dentro de su directorio home, un directorio .ssh/ que contendrá sus claves y archivos de autenticación. Veamos una lista de los archivos de mi usuario (solo la lista, nada de andar visualizando claves privadas :P).

diego@cryptos:~$ ls ~/.ssh/
authorized_keys  id_rsa.pub   id_rsa_vm20.pub  id_rsa_vm70.pub  known_hosts.old
id_rsa           id_rsa_vm20  id_rsa_vm70      known_hosts

En este listado podemos ver varios archivos. En general, los archivos que inician con «id_rsa*» son claves de autenticación asimétrica, los «.pub» son las claves publicas, y los homónimos sin dicha extensión, las claves privadas.

El archivo authorized_keys es el que almacena las claves públicas de clientes remotos que se conectan a mi equipo con autenticación asimétrica.

El archivo known_hosts contiene fingerprints de los hosts remotos a los que yo me conecto como cliente, de modo que pueda verificar que un host no cambie de dirección ip de manera «inesperada», y advertirlo en dicho caso.

Cuando autenticamos asimétricamente, lo que debe hacer un cliente es generar su par de claves, privada y pública, y luego copiar la clave pública dentro del archivo authorized_keys del servidor al que quiere conectarse, dentro del home del usuario con el que quiere autenticarse.

Esto es porque cuando hablamos de clientes y servidores tenemos que tener en cuenta que en los sistemas *nix disponemos de multiusuario, por lo que un usuario determinado de un sistema se conectará como cliente a un servicio SSH de un servidor, a un usuario determinado de dicho servidor.ssh_cli-serv

Por ejemplo, yo, usuario «diego» en mi equipo, podré autenticarme como usuario «juan» en el equipo remoto, sabiendo la dirección ip de dicho servidor, el puerto en el que atiende el servicio SSH_, y la contraseña del usuario «juan», o en su defecto, el usuario «juan» deberá tener dentro del archivo «authorized_keys» de su directorio .ssh del home, mi clave pública.

Creando las claves asimétricas

En el cliente corremos ssh-keygen para crear nuestras claves:

diego@cryptos:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/diego/.ssh/id_rsa): 
Created directory '/home/diego/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/diego/.ssh/id_rsa.
Your public key has been saved in /home/diego/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qlm0sL7hry+Twz5htNluCvCOY9f7W61DJnvGbs72jTw diego@cryptos
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|    .            |
|.  ..+. S        |
| o  =+.+ o.      |
|  oo+++ *. .     |
|.+ =B*o.oBoEo    |
|o.o.X&=oO=o+..   |
+----[SHA256]-----+

En el directorio de nuestro usuario, /home/diego en mi caso, dispondremos de las claves en un subdirectorio llamado .ssh:

diego@cryptos:~$ ls .ssh/
authorized_keys  id_rsa  id_rsa.pub  id_rsa_vm70  id_rsa_vm70.pub  known_hosts  known_hosts.old

En este caso, como no le he especificado a ssh-keygen ningún nombre adicional, por defecto creó las claves con los nombres de id_rsa (privada) e id_rsa.pub (pública).

Copiando la clave publica al servidor

Procedemos entonces a copiar dicha clave publica al archivo de claves autorizadas en el usuario del servidor. Para ello utilizamos ssh-copy-id de esta forma:

diego@cryptos:~$ ssh-copy-id -i .ssh/id_rsa.pub.pub juan@10.0.0.20

Este comando nos pedirá introducir la contraseña del usuario juan remoto.

Y procediendo a conectarnos…

Si quisiéramos conectarnos, por ejemplo, al servidor 10.0.0.20 utilizando el usuario juan del servidor, desde el cliente deberemos correr un comando similar a este:

ssh juan@10.0.0.20

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Wed Apr  6 22:55:30 2016 from 10.0.0.1
juan@debian2:~$  #debian2 es el nombre de este equipo, cuya ip es 10.0.0.20 :-)

Si el puerto es diferente del 22, podremos especificarlo utilizando el parámetro «-p <puerto>«.

Este comando nos permitirá conectarnos a la terminal remota del juan en 10.0.0.20 sin necesidad de introducir la contraseña.

NOTA: NUNCA dejen habilitado el usuario root en un servidor en Internet! En la configuración del servicio de ssh (/etc/ssh/sshd_config) se puede desactivar el login del root.

¡¡Espero les sea de utilidad!!

En un artículo posterior hablaremos sobre cómo administrar varios juegos de claves asimétricas para conectarnos a varios servidores cada cual con su clave, no sea cosa que se nos comprometa una clave privada y quedemos expuestos 🙂


Video explicativo en nuestro canal de youtube!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador