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