Qué es y cómo funciona ssh-agent

El agente ssh (ssh-agent) es un programa auxiliar que realiza un seguimiento de las claves de identidad del usuario y sus frases de contraseña. El agente puede usar las claves para iniciar sesión en otros servidores sin que el usuario escriba una contraseña o frase de contraseña nuevamente. Esto implementa una forma de inicio de sesión único (SSO).

El agente SSH se utiliza para la autenticación de clave pública SSH. Utiliza claves SSH para la autenticación. Los usuarios pueden crear claves SSH con el comando ssh-keygen e instalarlas en los servidores con el comando ssh-copy-id. (Lo que viene siendo un intercambio de llaves)

Podemos decir que se trata de un programa para contener claves privadas, utilizadas para la autenticación de claves públicas (RSA, DSA, ECDSA, Ed25519). ssh-agent generalmente se inicia en el comienzo de una sesión X o una sesión de inicio de sesión, y todas las demás ventanas o programas se inician como clientes del programa ssh-agent. Mediante el uso de variables de entorno en las que el agente puede ubicarse y usarse automáticamente para autenticación al iniciar sesión en otras máquinas con ssh.

Este programa entra dentro del temario del examen de certificación de LPIC 1, en la parte del 102.

Iniciando ssh-agent

En la mayoría de los sistemas GNU/Linux, ssh-agent se configura automáticamente y se ejecuta al iniciar sesión, y no se requieren acciones adicionales para usarlo. Sin embargo, aún se debe crear una clave SSH para el usuario. Recuerda con ssh-keygen, no te lo digo más veces 🙂

Si ssh-agent no se inicia automáticamente al iniciar sesión, se puede iniciar manualmente con el comando:

ssh-agent

Con un salida similar a la siguiente:

root@servubuntu:~# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-vumHBxvnTxLX/agent.15800; export SSH_AUTH_SOCK;
SSH_AGENT_PID=15801; export SSH_AGENT_PID;
echo Agent pid 15801;

En la líneas anteriores, que es la salida para la shell de Bourne, se nos indica los pasos que tenemos que seguir para establecer las variables de entorno correspondientes.

El comando ssh-agent genera comandos para establecer ciertas variables de entorno en el shell. Los comandos de salida por defecto son compatibles con /bin/sh y /bin/bash. Para generar comandos para el shell C ( /bin/csh o /bin tcsh), debemos agregar -c. Podemos forzar con -s para que nos muestre los comandos adecuados para la shell de Bourne.

Veamos un ejemplo para csh.

root@servubuntu:~# ssh-agent -c
setenv SSH_AUTH_SOCK /tmp/ssh-HrBMTxspxymg/agent.15902;
setenv SSH_AGENT_PID 15903;
echo Agent pid 15903;

Aunque existe una forma aún más fácil de empezar a trabajar con ssh-agent sin tener que realizar los pasos de declarar y exportar las variables de entorno, de la siguiente manera:

eval `ssh-agent`

Con un resultado similar a este:

root@servubuntu:~# eval `ssh-agent`
Agent pid 15992

La forma más fácil de verificar el valor de la variable de entorno SSH_AUTH_SOCK. Si está configurado, se supone que el agente se está ejecutando. Puede ser verificado por:

echo $SSH_AUTH_SOCK

Una muestra:

root@servubuntu:~# echo $SSH_AUTH_SOCK
/tmp/ssh-DO8ZdFWWY3iC/agent.1599

O simplemente:

root@servubuntu:~# env | grep -i ssh
SSH_AUTH_SOCK=/tmp/ssh-DO8ZdFWWY3iC/agent.15991
SSH_AGENT_PID=15992

Además, para permitir inicios de sesión basados en claves en los servidores, la autenticación de clave pública debe estar habilitada en el servidor. En OpenSSH está habilitado por defecto. Está controlado por la opción PubkeyAuthentication en sshd_config.

Agregar claves SSH al agente

De forma predeterminada, el agente utiliza claves SSH almacenadas en el directorio .ssh en el directorio de inicio del usuario. El comando ssh-add se usa para agregar identidades al agente. En la forma más simple, simplemente ejecutamos sin argumento para agregar los archivos predeterminados ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh /id_ed25519 y ~/.ssh/ identity. De lo contrario, asignamos el nombre del archivo de clave privada para agregar como argumento.

El agente al iniciarse, si lo hacemos por primera vez no tiene ninguna llave, para agregarlas:

ssh-add

El siguiente comando enumerará las claves privadas actualmente accesibles para el agente:

ssh-add -l

Si utilizamos el parámetro -L, se nos mostrarán las llaves públicas.

ssh-add -L

Si, en cambio, queremos eliminar todas las llaves utilizadas por el agente:

ssh-add -D

Reenvío de agentes SSH

Además, el protocolo SSH implementa el reenvío de agentes, un mecanismo mediante el cual un cliente SSH permite que un servidor SSH use el agente ssh local en el servidor en el que el usuario inicia sesión, como si fuera local allí. Cuando el usuario utiliza un cliente SSH en el servidor, el cliente intentará ponerse en contacto con el agente implementado por el servidor, y luego el servidor reenvía la solicitud al cliente que contactó originalmente con el servidor, que luego lo reenvía al agente local. De esta forma, ssh-agent y agent forwarding implementan un inicio de sesión único que puede progresar de forma transitiva.

Una característica maravillosa del inicio de sesión único proporcionado por SSH es que funciona independientemente de los límites de la organización y la geografía. Puede implementar fácilmente el inicio de sesión único en servidores del otro lado del mundo, en servicios en la nube o en las instalaciones del cliente. No se necesita coordinación central.

Para utilizar el reenvío de agentes, la opción ForwardAgent debe establecerse en «yes» en el cliente y la opción AllowAgentForwarding debe establecerse en «yes» en el servidor. Todo ello en el fichero de configuración.

Ejecutando ssh-agent

El comando ssh-agent generalmente se ejecuta desde los scripts de inicialización al iniciar sesión . Alternativamente, cualquier usuario puede configurarlo para que se ejecute, por ejemplo, el archivo ~/.xsession del usuario o ~/.profile

El agente genera la configuración de las variables de entorno que esto establece. La variable de entorno SSH_AUTH_SOCK está configurada para apuntar a un socket de dominio UNIX utilizado para comunicarse con el agente, y la variable de entorno SSH_AGENT_PID está configurada para el ID de proceso del agente. Para configurar las variables de entorno en el entorno de shell del usuario, el agente generalmente se ejecuta con algo como lo siguiente:

eval `ssh-agent`

El comando ssh-agent acepta las siguientes opciones:

    • -a bind-adress Obliga a vincular el socket del dominio Unix a la ruta del archivo dado, en lugar del socket predeterminado.
    • -c Fuerza la generación de comandos C-shell en stdout. Por defecto, el shell se detecta automáticamente.
    • -d Habilita el modo de depuración.
    • -E fingerprint_hash Especifica qué algoritmo usar para generar huellas digitales de clave SSH. Los valores válidos incluyen md5 y sha256.
    • -k Mata al agente actualmente en ejecución.
    • -s Fuerza la generación de comandos de shell Bourne (/bin/sh) en stdout. Por defecto, el shell se detecta automáticamente.
    • -t tiempo Especifica un número máximo de segundos que las identidades se mantienen en el agente. El valor está en segundos, pero puede tener el sufijo m durante minutos, h durante horas, d durante días y w durante semanas. Sin esta opción, el agente mantiene las claves en su memoria mientras se ejecuta. Esto se puede anular cuando se ejecuta el comando ssh-add.

Y esto es todo. La verdad es que el tema tiene mucha miga y seguro que me he dejado muchas cosas. Esta entrada es para sentar las bases para entradas que vendrán, como por ejemplo una dedicada al reenvío de agentes SSH. Se agradecen comentarios.

Fuentes consultadas

Página de man de ssh-agent

Vilecha.com – Manejo de SSH – Agente SSH

SSH.com – ssh-agent – Single Sign-On using SSH