Agentes SSH

Un agente SSH es un programa que guarda de forma segura las frases-clave asociadas con las claves privadas y responde a consultas autentificadas de los clientes SSH. El agente recuerda la passphrase de manera que el usuario no tenga que teclearla cada vez que la clave es usada.

El agente crea un socket en un subdirectorio de /tmp en el que escucha las peticiones de conexión SSH. Cualquiera que tenga acceso a dicho socket puede acceder al agente. Los permisos unix para el socket son suficientemente restrictivos.

Los programas que se usan son ssh-agent y ssh-add . Utilizamos ssh-add para añadir claves privadas a la cache del agente ssh. A partir de ese momento el cliente ssh no nos importunará solicitando la passphrase, comúnicandose con el agente para superar el proceso de autentificación. El agente ssh-agent actúa como un daemon que permanece dando el servicio de autentificación a los clientes SSH.

ssh-add

El programa ssh-add permite añadir, listar y suprimir claves de la cache del agente:

someone@localhost:~/.ssh$ ssh-add ~/.ssh/conpass
Enter passphrase for /home/someone/.ssh/conpass: **********
Identity added: /home/someone/.ssh/conpass (/home/someone/.ssh/conpass)
someone@localhost:~/.ssh$ ssh-add -l
2048 da:13:....:ee /home/someone/.ssh/conpass (RSA)
Una vez establecida la clave en el agente es posible conectarse sin necesidad de proporcionar la frase clave:

someone@localhost:~/.kde/shutdown$ ssh remote.machine
Linux remote.machine 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux

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.
Last login: Tue Mar 11 14:03:59 2008 from localhost.deioc.ull.es
user@remote.machine:~$

Arrancando un Agente SSH

Para arrancar el agente SSH se ejecuta el comando:

eval `ssh-agent`
Esto se hace asi porque el resultado retornado por ssh-agent es una cadena conteniendo un script bash. Este guión establece las variables de entorno necesarias para que las futuras llamadas a clientes SSH puedan encontrar al agente. Observe el resultado de una ejecución sin eval ni backticks:
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-jaDVTd5583/agent.5583; export SSH_AUTH_SOCK;
SSH_AGENT_PID=5584; export SSH_AGENT_PID;
echo Agent pid 5584;

La variable SSH_AUTH_SOCK contiene el camino al socket de dominio UNIX que será utilizado por los clientes ssh, scp, etc. para comunicarse con el agente.

El pid proporcionado en SSH_AGENT_PID nos permite eliminar al agente mediante kill. Sin embargo una llamada a kill no elimina las variables de entorno establecidas. La forma correcta de terminar el agente es usando la opción -k de ssh-agent:

pp2@localhost:~/Lbook$ eval `ssh-agent`
Agent pid 5606
pp2@localhost:~/Lbook$ env | grep -i ssh
SSH_AGENT_PID=5606
SSH_AUTH_SOCK=/tmp/ssh-ALUJyJ5605/agent.5605
CVS_RSH=/usr/bin/ssh
pp2@localhost:~/Lbook$ eval `ssh-agent -k`
Agent pid 5606 killed
pp2@localhost:~/Lbook$ env | grep -i ssh
CVS_RSH=/usr/bin/ssh
pp2@localhost:~/Lbook$

El Protocolo

  1. El usuario escribe el comando que da lugar a la conexión inicial y especifica el username asi como la petición de usar una clave. El programa cliente envía el username y la petición de uso de la clave.

  2. El demonio de SSH mira en el fichero authorized_keys y construye un reto basado en esa clave y lo envía al cliente.

  3. El cliente recibe el reto asociado con la clave y lo redirige al agente. Supongamos que la clave fué previamente cargada con ssh-add

  4. El agente construye la respuesta y la devuelve al proceso ssh el cual la envía al proceso sshd que escucha en el otro extremo. El cliente ssh nunca ve la clave privada, lo que ve es la respuesta.

  5. El servidor sshd valida la respuesta. Si es correcta permite el acceso al sistema.

Ejercicio 2.1.16   Establezca claves con passphrase, instale un agente ssh y compruebe su buen funcionamiento.

Bloqueando el acceso a un Agente

Es posible cerrar el acceso al agente usando la opción -x de ssh-add:

pp2@europa:~$ ssh-add -x
Enter lock password:
Again:
Agent locked.
pp2@europa:~$ ssh orion
Enter passphrase for key '/home/pp2/.ssh/id_dsa': ********
Linux orion 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux

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.
Last login: Mon Apr 27 13:29:32 2009 from europa.deioc.ull.es
casiano@orion:~$

Para abrir el acceso al agente usaremos la opción -X de ssh-add:

pp2@europa:~$ ssh-add -X
Enter lock password: ****************
Agent unlocked.
pp2@europa:~$

Poniendo Fecha de Caducidad

La opción -t lifetime de ssh-add puede ser utilizada para limitar el tiempo de caducidad de las identidades en un agente. El tiempo se expresará en segundos o bien de la forma time[qualifier], donde time es un entero positivo y qualifier es:

           nada    segundos
           s | S   segundos
           m | M   minutos
           h | H   horas
           d | D   dias
           w | W   semanas

Véase también



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19