SSH sin contraseña
Sábado , 31 de Mayo de 2003. Enrique Barbeito GarcÃa
Diariamente utilizo ssh a la hora de conectarme de forma remota a un par de máquinas. No es exageración decir que se me ha hecho imprescindible la utilización de las herramientas del paquete OpenSSH. Solo hay un pequeño inconveniente… que a veces es un coñazo tener que estar poniendo la contraseña en cada vez que quieres entrar a una determinada máquina con tu cuenta de usuario.
Aquà va una explicación de cómo autenticarnos automáticamente en un servidor SSH mediante claves DSA/RSA (generando un par de claves privadas y públicas). Antes de nada… decir que todo esto son cuatro pasos; que aunque yo me voy a parar en detallar las salidas de cada uno de esos pasos, no hay que alarmarse… este post puede salir algo largo pero vamos… es todo “pellejo”.
En fin… vamos allá. Pongamos el caso de que tenemos dos máquinas llamadas servidor y cliente. Nosotros utilizamos a ‘cliente’ y queremos tener un precioso icono en el escritorio tal que al pinchar en él entremos automáticamente a ’servidor’, a través de una conexión SSH. En ’servidor’ tenemos creada una cuenta de usuario: ebarbeito se llama.
Como paso previo, deberemos de comprobar en la máquina ’servidor’ que el demonio sshd está preparado para lo que queremos hacer. Para ello, entramos en el ’servidor’ como usuario root y editamos el archivo de configuración del sshd (/etc/ssh/sshd_config) y miramos que estén las lÃneas:
# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
Vamos… casi seguro que por defecto tienes ya preasignados esos valores. Pero por si acaso. Bien, ahora nos valemos de la utilidad ssh-keygen; un generador de claves con el que crearemos el par de claves públicas y privadas DSA y RSA. En la máquina ‘cliente’ tecleamos:
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ebarbeito/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ebarbeito/.ssh/id_rsa. Your public key has been saved in /home/ebarbeito/.ssh/id_rsa.pub. The key fingerprint is: 76:16:5f:97:84:2b:c4:ab:b4:9b:62:7a:99:89:1a:79 ebarbeito@cliente
Y, acto seguido:
$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/ebarbeito/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ebarbeito/.ssh/id_dsa. Your public key has been saved in /home/ebarbeito/.ssh/id_dsa.pub. The key fingerprint is: 44:f6:df:a6:c4:09:bc:34:20:51:97:96:24:0b:ef:19 ebarbeito@cliente
Como veis, debemos hacer el proceso dos veces (una por cada algoritmo de cifrado). Si os fijáis en las salidas que da el programa, se puede ver una lÃnea: Enter passphrase (empty for no passphrase): Bien, pues ahà tendremos que indicarle una contraseña (se trata de la clave privada), la que queramos. No tiene que ser la misma contraseña que usemos para nuestra cuenta de usuario ni nada, podemos poner la que queramos y luego volverla a poner para confirmarla. Una vez hecho esto las claves se crean en nuestro directorio ~/.ssh , podemos hacer un ls para comprobarlo:
$ ls -hla .ssh/ total 28K drwx------ 2 ebarbeito users 84 2003-01-15 08:18 ./ drwx--x--x 56 ebarbeito users 4.0K 2003-01-15 08:21 ../ -rw------- 1 ebarbeito users 736 2003-01-15 08:18 id_dsa -rw-r--r-- 1 ebarbeito users 603 2003-01-15 08:18 id_dsa.pub -rw------- 1 ebarbeito users 951 2003-01-15 08:17 id_rsa -rw-r--r-- 1 ebarbeito users 223 2003-01-15 08:17 id_rsa.pub -rw-r--r-- 1 ebarbeito users 1.3K 2003-01-12 03:26 known_hosts
Pues ahà las tenéis. El par de claves privadas (e intrasferibles ;) y las públicas. Bien, ya tenemos lo necesario en la máquina ‘cliente’. Ahora debemos preparar a la máquina servidor, a la cual nos conectaremos. Debemos copiar el par de claves públicas generadas (id_dsa.pub y id_rsa.pub) a nuestro directorio ~/.ssh del ’servidor’. Para hacer esto, se pueden utilizar varios métodos. El más “cutre” es copiar el contenido de los archivos, conectarte al servidor y crear tu mismo los archivos ~/.ssh/id_dsa.pub y ~/.ssh/id_rsa.pub pegando el contenido de uno y otro. Si os fijáis:
$ cat ~/.ssh/id_dsa.pub ssh-dssAAAAB3NzaC1kc3MAAACBALyCDCKsON cH+BdersG+qA78/t1aNEmuqoumU5SEGssnrvd1m1aSRloJ8e5dlYS9sIhrSKWgU90cSF 3vlwofKwjm92reGx6CT/GTGdh8kOrBAj/Ksrg0tPDsBML1Mvq0zneebQCLbn3gPeUvcnp p5NkACiJkSPb5HxYr+L2aAguBAAAAFQDKtni/DxV6VLjfmdpbJSkJL0dc+wAAAIBBBlmT yRWbgWZh4L+HS48Y0BWW6oWvpq1/HouQ/QM0tLqDSFkVmsByVhgAZzrCYNMTetah 8g9WTnDcidzGhhW1iPc6Olz2k9WOqH2pOoJ0BT1QzD9FB83vMcQkPAOJEeumaXwym5 M/WT7Ypo6ADGPvE4dZmCqDAy9G28ZcgeqkBgAAAIB/5ZeVSiMUdCmbgl+V28gYJpN E0gLRayN16tOhPAQW671LAPxDIF6x/qFB2oQFi9W6DQBsRdlqJCq7DCNzTLhVe53bsq0 wdD6ffFNFRT770mB4wob36oxLCXc6DE38UrbeL9kDeTsulmFz5SZnA0Cj6GWUrseojg4 Yv0HzH2rSvQ== ebarbeito@cliente $ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0Sk624r+a7gxn+FG+tTVjMXmItd/bh QOtMzkiYqsnY2QlxiUOg9uAwWNEHvx4IIWgCkkasQSelFkZB78GJvkJI7E6GworWSE gsy/5W3MZQldr6PrAJaOl8O+zhYE0TFHRE1oVat3sj9MC1uASnNvcLyjga8LDprc 241glAj/s7c= ebarbeito@cliente
Aunque es auténtico chino mandarÃn encriptado lo que hay en esos archivitos, se puede copiar y pegar directamente. Pero vamos… yo prefiero hacerlo de un modo un tanto más sofisticado. Con la ayuda del comando scp ;) con el que podremos copiar los archivos directamente al servidor. De esta forma:
$ scp ~/.ssh/id_rsa.pub ebarbeito@servidor:.ssh/id_rsa.pub
The authenticity of host 'servidor (192.168.0.2)' can't be established.
RSA key fingerprint is ed:6f:c3:71:fd:e3:a3:29:03:b6:91:dd:87:10:18:70.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'servidor' (RSA) to the list of known hosts.
[ welcome to ebarbeito's ssh server
------------------------------------
enrique@barbeito.org ]
ebarbeito@servidor's password:
id_rsa.pub 100% |*************************| 223 00:00
$ scp ~/.ssh/id_dsa.pub ebarbeito@servidor:.ssh/id_dsa.pub
[ welcome to ebarbeito's ssh server
------------------------------------
enrique@barbeito.org ]
ebarbeito@servidor's password:
id_dsa.pub 100% |*************************| 603 00:00
Es sencillo y más rápido que andar copiando/pegando “chino mandarÃn” de un lado a otro ¿o no? jeje :) Además, la sintaxis es simple: scp <archivo local> usuario@servidor:<ruta destino>
Si el comando sqp te da el siguiente error:
scp: .ssh/id_rsa.pub: No such file or directory
Seguramente sea porque en el directorio de usuario del servidor no tengas creado el subdirectorio .ssh. Solo has de acceder a él, crearlo con mkdir ~/.ssh y cambiarle los permisos a rwx para el usuario (hay que evitar que nadie que no seas tú mismo pueda tener acceso a las claves ;) de este modo: chmod 700 ~/.ssh. Una vez hecho esto, vuelve a ejecutar scp.
Bien, y ahora vamos a lo esencial. Vamos a permitir que no tengamos que introducir nuestra contraseña a la hora de autenticarnos. Ni nuestra contraseña, ni tampoco la que pusimos a la hora de generar el par de claves. Para ello nos valemos de la utilidad ssh-add, que la ejecutamos en el ‘cliente’ claro:
$ ssh-add Enter passphrase for /home/ebarbeito/.ssh/id_rsa: Identity added: /home/ebarbeito/.ssh/id_rsa (/home/ebarbeito/.ssh/id_rsa) Identity added: /home/ebarbeito/.ssh/id_dsa (/home/ebarbeito/.ssh/id_dsa)
/*
[ Posible problema ]
Si al hacer el anterior paso (ejecutar ssh-add) nos da el siguiente error:
$ ssh-add Could not open a connection to your authentication agent.
Para subsanarlo tendremos que poner:
$ eval `ssh-agent`
Y después
$ echo $SSH_AUTH_SOCK
Una vez hecho esto, volvemos a ejecutar ssh-add que ya funcionará bien :) (este problema lo tuve hace un tiempo y buscando información en Google logré esta solución)
*/
Bien… pues ya está todo casi. Nos queda conectarnos nuevamente al servidor (esta es ya la última vez que necesitaremos teclear la contraseña :) con nuestro usuario ‘ebarbeito’ y volcar el contenido de las claves públicas copiadas anteriormente al directorio ~/.ssh/ al archivo ~/.ssh/authorized_keys2 :
$ cd .ssh/ $ cat id_dsa.pub >> authorized_keys2 $ cat id_rsa.pub >> authorized_keys2
Podemos hasta borrar los archivos de las claves si queremos:
$ rm id_dsa.pub id_rsa.pub
Bien… pues ya está! :D ahora salimos de la cuenta y volvemos a entrar:
ebarbeito@cliente:~$ ssh -l ebarbeito 192.168.0.2 Linux servidor 2.4.20 #1 SMP Fri Jan 3 17:38:55 CET 2003 Last login: Wed Apr 16 01:29:18 2003 from cliente ebarbeito@servidor:~$
Como veis… no pide contraseña ni nada y nos entra del tirón jeje :) Ya podemos crearnos nuestro enlace en el escritorio: agregar un lanzador de alguna terminal virtual que usemos (yo utilizo aterm para estos casos) con el parámetro necesario para ejecutar un comando, que serÃa un ssh -l usuario servidor
Y ya esta… de este modo tendremos acceso instantáneo desde la máquina cliente al ’servidor’. Yo la verdad que me he enrollado un montón… es muy simple; más de lo que lo hago. He preferido pecar de pesado y hacer denso el truquito este para que vierais que salidas iba dando y tal.
Ala, a disfrutarlo con salud! ;)
[ NOTA ] : TenÃa escrito todo esto en un archivo que guardaba para ponerlo aquà algún dÃa de estos (creo que lo escribà a mediados de febrero de este año). Todo lo expuesto aquà lo he sacado mediante la experiencia y gracias a un thread en la lista de correo en español de usuarios de Debian. ¿Qué quiero decir con esto? Pues que me reservaba la publicación de este truquillo para cuando investigara un poco más y pudiera detallarlo todo de un modo mejor; pero como me veo que no va a poder ser y que ya es alargarlo demasiado pues… lo publico tal y como lo escribà hace ya meses: quizás le venga bien a alguno, quien sabe.
De todos modos, este tema está muy documentdado; tenéis otros textos de lo mismo:
»» [ aquà ] y [ aquà ]
[…] Bulma: SSH con contraseña pública/privada blog de Enrique Barbeito GarcÃa OpenSSH Public Key Authentication […]
[…] Para enviar una notificacion remota puede hacerse via SSH. Sera necesario configurar un acceso sin contraseña (Enrique Barbeito tiene un estupendo tutorial sobre el tema) y luego bastará con ejecutar el comando: […]
[…] Para enviar una notificacion remota puede hacerse via SSH. Sera necesario configurar un acceso sin contraseña (Enrique Barbeito tiene un estupendo tutorial sobre el tema) y luego bastará con ejecutar el comando: […]