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

ssh

Un usuario SSH se puede autenticar de varias maneras, entre ellas, utilizando una contraseña, y utilizando un juego de claves asimétricas. El caso de hoy se centra en el uso de llaves asimétricas.

¿Para qué nos sirven estas claves? 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 ssh 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 😛 ).

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.

ssh_cli-serv

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.

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 /home/juan/.ssh 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 al servidor ssh…

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 🙂

Les dejo un videito en el canal de youtube de JuncoTIC donde explico estas configuraciones y su funcionamiento, ojalá les sirva!



¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

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

6 comentarios

D4nyr3y · 8 abril, 2016 a las 01:31

Excelente .. muy util para los sysadmin .. como siempre impecable d1c04!

    Diego Córdoba · 8 abril, 2016 a las 02:29

    D4ny! Muchas gracias por comentar y seguir el blog! Abrazo!

Valentino · 15 septiembre, 2016 a las 03:56

Muy claro y útil diego, muchas gracias x el aporte!!!

    Diego Córdoba · 15 septiembre, 2016 a las 04:03

    Muchas gracias Valentino!! Abrazo che!

Ramiro · 19 diciembre, 2017 a las 03:32

Diego te hago una consulta , es un poco viejo el post pero bueh,
como puedo hacer esto entre un server linux y un FW asa por ejemplo , creo las claves en el server pero desp como hago para copiarla en el ASA??

Gracias!!!

    Diego Cordoba - @d1cor · 19 diciembre, 2017 a las 12:43

    Hola Ramiro! Post viejo, pero siempre actual 🙂
    No he trabajado particularmente con los firewalls ASA, pero mediante los comandos de Cisco deberías poder cargar la clave publica en el firewall.
    El comando ssh-keygen te genera tanto la privada como la púlbica, por defecto, id_rsa es la privada e id_rsa.pub es la pública… fijate en este link que te comparto que creo que puede servirte para cargar la clave pública en el firewall… el video me parece que te lo dice todo.
    Igual cualquier duda quedo a disposición.
    Saludos!!
    https://nat0.net/how-to-setup-ssh-keypair-authentication-in-cisco-asa/

Los comentarios están cerrados.