ssh-agent, incluido con la distribución de OpenSSH, es un programa especialmente diseñado para manejar las claves RSA y DSA de forma agradable y segura (vea la Parte 1 de esta serie para una introcucción a la validación RSA y DSA.) ssh-agent, a diferencia de ssh, es un servicio diseñado con el único objetivo de almacenar en caché el descifrado de sus claves privadas.
ssh incluye soporte para comunicarse con ssh-agent, permitiendo a ssh adquirir sus claves privadas descifradas sin preguntarle por la contraseña en cada nueva conexión. Simplemente utilice ssh-add para añadir sus claves privadas a la caché de shh-agent. En un único proceso; después de utilizar ssh-add, ssh usará su clave privada desde ssh-agent, en lugar de preguntarle por una contraseña.
Echemos un vistazo a como trabaja todo este sistema de caché de claves con ssh-agent. Al iniciar ssh-agent desde consola, muestra unas variables de entorno importantes antes de desconectarse de la consola y continuar su proceso en segundo plano. He aquí un ejemplo de la salida generada por ssh-agent cuando se inicia:
$ 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;
Como puede ver, la salida de ssh-agent es en realidad una serie de comandos en bash; si se ejecutan, estos comandos ajustarías un par de variables de entorno, SSH_AUTH_SOCK y SSH_AGENT_PID. Debido a la inclusión del comando export, estas variables de entorno estarán disponibles para cualquier comando adicional que se lance posteriormente. Bien, todo pasaría si estas líneas fueran evaluadas por la consola, pero ahora solamente se ha enviado a stdout. Para solucionarlo, podemos llamar a ssh-agent como sigue:
$ eval `ssh-agent`
Este comando le dice a bash que lance ssh-agent y evalúe su salida. Invocando de esta forma (con comillas inclinadas, no con comillas simples normales), las variables SSH_AGENT_PID y SSH_AUTH_SOCK serán ajustadas y exportadas por su consola, estando estas variables a disposiciñon de todos los procesos nuevos que se puedan iniciar durante su sesión.
La mejor manera de lanzar ssh-agent es añadir la línea anterior a su
Por supuesto, ssh-agent se inicia con una caché de claves descifradas vacía.
Antes de que podamos utilizar ssh-agent, en primer lugar hay que añadir
nuestra(s) clave(s) privada(s) a la caché de ssh-agent utilizando el comando
ssh-add. En el siguiente ejemplo uso ssh.add para añadir mi clave privada RSA
$ ssh-add ~/.ssh/identity Need passphrase for /home/drobbins/.ssh/identity Enter passphrase for /home/drobbins/.ssh/identity (enter passphrase)
Como puede ver, ssh-add pregunta por mi contraseña a fin de que la clave privada pueda ser descifrada y se almacena en la caché de ssh-agent, lista para usar. Una vez que haya usado ssh-add para agregar su clave (o claves) privada a la caché de ssh-agent SSH_AUTH_SOCK se define en su actual consola (debe ser así, si lanzó ssh-agent desde su ~/.bash_profile), entonces ya puede usar ssh y scp para establecer conexiones con sistemas remotos sin suministrar su contraseña.
ssh-agent es realmente cool, pero su configuración por defecto tiene unos pocos inconvenientes. Echemos un vistazo a ellos.
Por uno lado, con
Otro problema por defecto en ssh-agent es que la instalación no es compatible con cron jobs. Los trabajos iniciados por el proceso cron, no heredan la variable de entorno SSH_AUTH_SOCK, y por consiguiente no sabrán que hay un proceso ssh-agent en ejecución ni cómo ponerse en contacto con él. Este problema también es corregible.
Para resolver estos problemas, He escrito un práctico front-end basado en bash llamado keychain. Lo que hace especial a keychain es el hecho de que permite utilizar un solo proceso ssh-agent por sistema, no sólo por sesión. Esto significa que usted sólo tiene que hacer un ssh-add por clave privada, y punto. Como veremos en breve, incluso keychain ayuda a optimizar el proceso ssh-add tratando de añadir solamente las claves privadas que no estén en ejecución en la caché de ssh-agent.
Aquí hay una muestra de como funciona keychain. Cuando se inicia a partir de su
#!/bin/bash #example ~/.bash_profile file /usr/bin/keychain ~/.ssh/id_rsa #redirect ~/.ssh-agent output to /dev/null to zap the annoying #"Agent PID"; message source ~/.ssh-agent > /dev/null
Como puede ver, con keychain suministramos al fichero
La instalación de keychain es fácil. En primer lugar, vaya a la
# emerge keychain
Ahora que keychain esta en
#!/bin/bash #on this next line, we start keychain and point it to the private keys that #we'd like it to cache /usr/bin/keychain ~/.ssh/id_rsa ~/.ssh/id_dsa source ~/.ssh-agent > /dev/null #sourcing ~/.bashrc is a good thing source ~/.bashrc
Una vez configurado su
Una vez que introduzca su contraseña, sus claves privadas se almacenarán en caché, y keychain finalizará. Entonces, se cargará ~/.ssh-agent, inicializando su sesión para ser usada con ssh-agent. Ahora, si reinicia su sesión nuevamente, notará que keychain encontrará ssh-agent como proceso existente; que no finalizó cuando cerró su sesión. Además, keychain verificará que las claves privadas especificadas están listas en la caché de ssh-agent. Si no es así, entonces le pedirá la contraseña, pero si todo va bien, su actual ssh-agent todavía contendrá la clave privada que previamente añadió, lo que significa que no se le preguntará por una contraseña:
Felicidades, acaba de iniciar sesión y debería ser capaz de usar ssh y scp en sistemas remotos; no necesita usar ssh-add después de iniciar la sesión, y ssh y scp no le pedirán una contraseña. De hecho, siempre y cuando el proceso inicial ssh-agent siga en marcha, podrá acceder y establecer conexiones ssh sin suministrar una contraseña. Y es muy probable que su proceso ssh-agent continue ejecutandose hasta que la máquina sea reiniciada; probablemente lo configure en un sistema Linux, ¡es posible que no sea necesario que introduzca su contraseña en varios meses!. Bienvenido al mundo de la seguridad, conexiones libres de contraseñas usando la validación RSA y DSA.
Adelante, cree varias sesiones nuevas, y verá que keychain "enganchará"; al
mismo proceso ssh-agent cada vez. No hay que olvidar que puede enganchar sus
cron jobs y scripts al proceso ssh-agent en ejecución. Para utilizar los
comandos ssh o scp desde scripts de consola y cron jobs, asegúrese de que
obtiene su fichero
$ source ~/.ssh-agent
Luego, cualquier comando ssh o scp serán capaces de encontrar el actual proceso ssh-agent en ejecución y establecer una coneción segura libre de contraseñas igual que desde la consola.
Después de tener funcionando keychain, asegurese de teclear
Recordará que en la parte 1, expliqué que el uso de claves privadas sin cifrar es una práctica peligrosa, ya que permite a cualquiera robar su clave privada y usarla para acceder a sus cuentas remotas de cualquier sistema sin suministrarle contraseña. Bien, mientras que keychain no es vulnerable a este tipo de abuso (que es siempre y cuando utilice las claves privadas cifradas), hay una debilidad potencialmente explotable directamente relacionada con el hecho que keychain se enganche facilmente a un proceso ssh-agent de larga duración. ¿Que pasaría, pensé, sin algún intruso consiguiera averiguar mi contraseña o frase de acceso a mi sistema local? Si de alguna manera se pudiera acceder bajo mi usuario, keychain les garantizaría el acceso instantáneo a mis claves privadas descifradas, por lo que no es obvio para ellos tener acceso a mis otras cuentas.
Ahora, antes de continuar, vamos a poner este riesgo de seguridad en
perspectiva. Si algún usuario malintencionado de alguna manera pudiera validarse
como yo, keychain permitiría el acceso a mis cuentas remotas. Sin embargo, aun
así, sería muy difícil para el intruso robar mis claves privadas descifradas ya
que todavía están encriptadas en el disco. Además, para tener acceso a mis
claves privadas requiere que un usuario realmente se valide como yo. Así que,
abusar de ssh-agent sería más difícil que simplemente robar una clave privada
sin cifrar, que sólo requiere que un intruso acceda de alguna manera a mis
ficheros en
La opción
A pesar de ello, utilizando kechain con
Ahora que la gestión de claves para OpenSSH esta completa, debe estar familiarizado con las claves RSA y DSA y saber como utilizarlas de forma conveniente y segura. Asegúrese de comprobar los siguientes recursos: