¿Cuál es el propósito de ssh-agent?

71

He leído la definición oficial:

ssh-agent es un programa para contener claves privadas utilizadas para la autenticación de clave pública (RSA, DSA, ECDSA). La idea es que ssh-agent se inicie al 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, el agente se puede ubicar y usar automáticamente para la autenticación al iniciar sesión en otras máquinas usando ssh (1).

"... un programa para contener claves privadas ..." - En mi humilde opinión - las claves ssh son generadas por el usuario con el comando ssh-keygen y se almacenan de forma simple y directa en ~ / .ssh - ¿por qué necesito algún demonio para mantener estas claves? De todos modos, ¿cómo los mantiene exactamente? ¿No se almacenan simplemente en .ssh?

"se inician como clientes del programa ssh-agent" - No lo entiendo. ¿Dónde se necesitaría eso? Usualmente solo uso ssh como esto:

 ssh -i ~/.ssh/private_key_name username@hostname

¿Qué significa exactamente el manual por "clientes"? No ejecute simplemente el comando ssh desde la terminal para conectarse: ¿qué otros clientes están allí y por qué no pueden simplemente usar una ruta a ese archivo privado ssh, al igual que el comando ssh?

agente_herrero
fuente

Respuestas:

76

El agente SSH maneja la firma de los datos de autenticación por usted. Al autenticarse en un servidor, debe firmar algunos datos con su clave privada, para demostrar que usted es, bueno, usted.

Como medida de seguridad, la mayoría de las personas protegen sensiblemente sus claves privadas con una frase de contraseña, por lo que cualquier intento de autenticación requeriría que ingrese esta frase de contraseña. Esto puede ser indeseable, por lo que el agente ssh almacena en caché la clave por usted y solo necesita ingresar la contraseña una vez, cuando el agente quiere descifrarla (y a menudo ni siquiera eso, ya que el agente ssh puede integrarse con pam, que hacen muchas distribuciones).

El agente SSH nunca entrega estas claves a los programas del cliente, sino que simplemente presenta un socket sobre el cual los clientes pueden enviarle datos y sobre el cual responde con datos firmados. Un beneficio adicional de esto es que puede usar su clave privada incluso con programas en los que no confía completamente.

Otro beneficio del agente SSH es que se puede reenviar a través de SSH. Entonces, cuando ssh al host A, mientras reenvía a su agente, puede ssh de A a otro host B sin necesidad de su clave presente (ni siquiera en forma cifrada) en el host A.

Dennis Kaarsemaker
fuente
10
Siento que esta es la respuesta más completa, pero aún falta un punto. El uso de un agente clave también permite usar múltiples claves fácilmente. En lugar de tener que especificar la ruta a la clave, cuando use un agente de claves, ssh probará cada clave que contenga.
Patrick
3
@Patrick, que también puede ser una desventaja: pruebe demasiadas claves no válidas en un servidor y cerrará la conexión antes de llegar a la clave válida. Por supuesto, para eso es buena ~/.ssh/configla IdentityFileopción, con o sin el agente
Tobias Kienzler
@Patrick que parece igualmente posible sin un agente
Andrey Fedorov
@AndreyFedorov Sí, puede tener varias claves sin un agente, pero también puede especificar en ~/.ssh/configqué clave usar para qué host remoto, de modo que sepa exactamente cuál necesita.
Patrick
3
¿se puede suponer que ssh-agentno es necesario si una clave privada no está protegida por una frase de contraseña?
pkaramol
16

El beneficio ssh-agentes que solo necesita ingresar su frase de contraseña una vez. Si su clave RSA privada no está encriptada con una frase de contraseña, entonces ssh-agent no es necesario. El sshcomando sería un ejemplo de un cliente.

jordanm
fuente
7

Si está habitualmente sshING en una variedad de máquinas diferentes, cada uno con su propia clave y contraseña, y haga correr ssh-agentle permite introducir la contraseña para cada tecla una vez 1 al inicio de la sesión y entonces se puede autenticar a cada máquina tantas veces como desee sin tener que volver a ingresar su frase de contraseña.

Otro beneficio es que, según la manpágina, el agente nunca envía una clave privada a través de su canal de solicitud; así que si saltas entre diferentes cajas, tus claves privadas están protegidas.

1 Puede configurar el lifetiempo que las claves se mantienen en el agente.

jasonwryan
fuente
6

El artículo de Wikipedia probablemente tiene la mejor descripción:

La verificación al servidor se basa en la autenticación de desafío-respuesta. ssh se conecta al servidor con un nombre de usuario y la solicitud de una clave. El demonio ssh recibe la solicitud y envía un desafío basado en la clave pública almacenada en el archivo de autenticación. ssh usa la clave privada para construir una respuesta clave y la envía al sshd en espera en el otro extremo de la conexión. No envía la clave privada en sí. El daemon ssh valida la respuesta clave y, si es válida, otorga acceso al sistema. ssh-agent simplifica esto al crear un socket que escucha las conexiones SSH. El usuario simplemente inicia ssh-agent, diciéndole cómo encontrar sus claves (si no están en la ubicación predeterminada), ingresa la frase de contraseña para cada clave que se utilizará, una sola vez,

De nuevo textualmente del artículo de Wikipedia:

... ssh-agent crea un socket y luego verifica las conexiones desde ssh. Todos los que pueden conectarse a este socket también tienen acceso al agente ssh. Los permisos se establecen como en un sistema Linux o Unix habitual. Cuando se inicia el agente, crea un nuevo directorio en / tmp con permisos restrictivos. El zócalo se encuentra en la carpeta.

Por lo general, se coloca en un sistema o en los archivos rc del usuario como $HOME/.bashrco $HOME/.profile(para bash shells) para que el ssh-agentconjunto de variables de entorno se incorpore completamente a su entorno.

En mi sistema Fedora 14, se inicia bastante temprano como parte del subsistema X11. En este archivo /etc/X11/xinit/xinitrc-common,:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

La variable $SSH_AGENTse utiliza en otros scripts de inicio de X11 como aquí /etc/X11/xinit/Xclients:

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

Al incorporarlo aquí, las siguientes variables de entorno se configuran como parte de un shell principal, por lo tanto, todos los hijos bifurcados también deberían tenerlas, por ejemplo:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

Hay un poco más de complejidad en esto, pero en pocas palabras esto es básicamente lo que está sucediendo ssh-agent.

Por ejemplo, en GNOME, en ssh-agentrealidad se inicia por usuario como una aplicación de inicio:

                     ss de aplicaciones de inicio

TL; DR

En pocas palabras, ssh-agentexiste para que cuando se requieran sus claves ssh solo tenga que desbloquearlas una vez con su frase de contraseña (suponiendo que tengan una), y desde entonces estén disponibles en su forma descifrada en la memoria (RAM).

slm
fuente
1

"se inician como clientes del programa ssh-agent" se refiere a la idea de que ssh-agent se inicia durante la inicialización de la sesión de inicio de sesión (local) para que todos los programas obtengan las variables de entorno $SSH_AGENT_PIDy $SSH_AUTH_SOCKque son necesarias para conectar el agente.

Otra ventaja de sacar el manejo de claves privadas de ssh es que ssh-agent puede ser reemplazado por gpg-agent. Por lo tanto, puede usar claves OpenPGP (con capacidad de autenticación) para SSH. Esa es una buena solución para las claves OpenPGP en una tarjeta inteligente.

Hauke ​​Laging
fuente