SSH: Cómo conectarnos sin usar contraseña

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

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:

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

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:

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:

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!