Gestión de claves con OpenSSH, confianza entre hosts
Hace algún tiempo que no escribo, ya que mi nuevo horario de trabajo no me lo permite mucho, y porque estoy algo liado con el proyecto del Camino de Santiago, pero no quiero dejar morir este blog.
Hoy os voy a comentar como poder utilizar el potencial de OpenSSH para iniciar sesiones en máquinas remotas autenticandose con el sistema de autenticación RSA/DSA. Este método de autenticación es una alternativa al sistema de autenticación estandar de contraseña segura que OpenSSH usa por defecto.
Este método se basa en un par de claves numéricas complementarias, denominadas clave privada y pública, que nos permitirá en muchos casos establecer conexiones seguras sin tener que introducir contraseñas manualmente.
Muchos de vosotros os estareis preguntando para qué puede valer esto. Una de las miles de utilidades
puede ser la de transferir ficheros entre máquinas mediante un script. Si utilizamos el comando
scp,:
scp ArchivoOrigen usuario@host:directorio/ArchivoDestino |
por defecto se nos preguntará la contraseña del usuario destino, por lo que al realizar de forma automatizada la transferencia (usando un script) se nos preguntará la contraseña, que o bien tendremos que introducir a mano o almancernar en algún lugar del script, con la perdida de seguridad que ello conlleva.
Imaginemos que tenemos dos máquinas, entre las que queremos transferir ficheros sin tener que introducir contraseñas. Para ello vamos a utilizar la autenticación RSA/DSA, que creará un sistema de confianza entre las dos máquinas. Vamos a crear dicho sistema entre los hots yocliente y yoservidor.
En primer lugar tendremos que acceder a la máquina yocliente y ejecutar los siguientes comandos
dentro de la carpeta .ssh de la home del usuario que realizará la conexión a yoservidor:
[usuario_cliente@yocliente] $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/usuario_cliente/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/usuario_cliente/.ssh/id_rsa. Your public key has been saved in /home/usuario_cliente/.ssh/id_rsa.pub. The key fingerprint is: c0:40:50:27:e8:d9:b8:55:d6:a4:5f:af:e5:30:5d:9b usuario_cliente@yocliente [usuario_cliente@yocliente] $ |
[usuario_cliente@yocliente] $ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/usuario_cliente/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/usuario_cliente/.ssh/id_dsa. Your public key has been saved in /home/usuario_cliente/.ssh/id_dsa.pub. The key fingerprint is: f5:b2:f3:2d:43:1b:22:44:98:6c:fe:42:df:a3:15:09 usuario_cliente@yocliente [usuario_cliente@yocliente] $ |
Los anteriores comandos piden en primer lugar donde salvar la llave privada, si simplemente pulsamos intro, se salvará en la ruta por defecto, y en segundo lugar, la frase clave con la que encriptar la llave privada.
A continuación el ssh-keygen muestra donde se ha salvado la llave privada (/home/usuario_cliente/.ssh/id_dsa) y donde está la llave pública que le corresponde (/home/usuario_cliente/.ssh/id_dsa.pub), que no es más que el mismo nombre de archivo con la extensión .pub añadida al final.
De esta forma habremos generado un juego de claves privada y pública. Pero para poder autenticarnos en nuestro equipo remoto (yoservidor) con nuestra llave privada, lo único que tendremos que hacer es añadir el contenido de nuestra llave pública rsa en el archivo .ssh/authorized_keys dentro del directorio personal del usuario al que queremos acceder (generalmente $HOME/.ssh/authorized_keys) y el contenido de nuestra llave pública dsa en el archivo .ssh/authorized_keys2.
La llave pública podrá ser leida por cualquier usuario, pues por algo es pública, mientras que la llave privada es secreta, por lo que por defecto ssh-keygen establecerá los permisos del archivo con esta llave para que sólo el dueño pueda leerla y modificarla.
De igual forma que hemos generado el juego de llaves privada y pública en yocliente y hemos copiado las claves públicas a yoservidor en sus respectivos authorized_keys, tendremos que hacer la operación a la inversa en yoservidor.
Una vez configurado todo, tendremos que asegurarnos de que ambos host aceptan conexiones el uno del otro, añadiendo :
sshd: ALL |
al fichero /etc/hosts.allow
Hecho todo esto ya podremos pasar información entre hosts:
$usuario_cliente@yocliente:$ scp -v mi_fichero usuario_servidor@yoservidor:/home/usuario_servidor/ficheros |
De esta forma ya podremos transferir ficheros, mediante confianza entre máquinas. Un handicap que se nos puede presentar es que a la hora de transferir los ficheros se nos pregunte por la “frase clave”. Para conseguir que nos se nos pregunte cada vez que hagamos una transferencia podremos utilizar la utilidad: ssh-agent.
Unicamente tendremos que arrancar el agente:
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XX4LkMJS/agent.26916; export SSH_AUTH_SOCK; SSH_AGENT_PID=26917; export SSH_AGENT_PID; echo Agent pid 26917; |
y posteriormente añadir nuestra “frase clave” al agente, para que él se encargue de proporcionarla:
$ ssh-add ~/.ssh/identity Need passphrase for /home/usuario_cliente/.ssh/identity Enter passphrase for /home/usuario_cliente/.ssh/identity (enter passphrase) |
Enlace de interes
OpenSSH key Management