Administrar Claves SSH con ssh-agent
En este paso, aprenderás a administrar tus claves SSH utilizando ssh-agent. ssh-agent es un programa que se ejecuta en segundo plano y mantiene tus claves privadas en memoria. Esto es especialmente útil cuando tus claves privadas están protegidas con una contraseña. En lugar de escribir la contraseña cada vez que utilizas la clave, la escribes una sola vez al añadirla a ssh-agent, y luego el agente se encarga de la autenticación por ti durante la sesión.
Aunque generaste una clave sin contraseña en el paso anterior, ahora crearemos una nueva clave con contraseña para demostrar la utilidad de ssh-agent.
Primero, genera un nuevo par de claves SSH con contraseña. Llamaremos a esta clave id_rsa_passphrase para distinguirla de la clave predeterminada id_rsa.
ssh-keygen -f ~/.ssh/id_rsa_passphrase
Se te pedirá que introduzcas una contraseña. Para este laboratorio, utiliza mypassphrase como contraseña.
Generando par de claves rsa público/privado.
Introduzca la contraseña (vacía para ninguna contraseña): mypassphrase
Introduzca la misma contraseña de nuevo: mypassphrase
Su identificación se ha guardado en /home/labex/.ssh/id_rsa_passphrase
Su clave pública se ha guardado en /home/labex/.ssh/id_rsa_passphrase.pub
La huella digital de la clave es:
SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg labex@6846375f1c0e35fea6cb03e6
La imagen randomart de la clave es:
+---[RSA 3072]----+
| ...=o+=*. E |
| .o.*.=..+ o |
| .=.o o. = . |
| . .+... .. . .|
| . . . +S. + |
| . o ..o . o * .|
| . . . . = * |
| oooo|
| ..+.o|
+----[SHA256]-----+
Nota: Si accidentalmente pulsas Intro sin escribir una contraseña, la clave se creará sin ella. En ese caso, puedes eliminar los archivos y ejecutar el comando de nuevo, asegurándote de introducir mypassphrase cuando se te pida.
Ahora, copiemos esta nueva clave pública a localhost para poder usarla en la autenticación.
ssh-copy-id -i ~/.ssh/id_rsa_passphrase.pub labex@localhost
Dado que ya tienes la autenticación sin contraseña configurada con tu clave predeterminada, es posible que el comando no solicite una contraseña y utilice tu autenticación existente:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa_passphrase.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Number of key(s) added: 1
Ahora intenta iniciar sesión en la máquina con: "ssh 'labex@localhost'"
y comprueba para asegurarte de que solo se agregaron las claves que querías.
Ahora, intenta conectarte a localhost usando esta nueva clave. Necesitarás especificar el archivo de clave privada usando la opción -i.
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Si has establecido una contraseña para la clave, se te pedirá que la introduzcas. Sin embargo, si accidentalmente creaste la clave sin contraseña (como se muestra en la salida de ejemplo), iniciarás sesión directamente:
Último inicio de sesión: lun 9 jun 01:39:25 2025 desde 47.251.66.143
[labex@host ~]$
Has iniciado sesión. Ahora, cierra la sesión:
exit
exit
Conexión a localhost cerrada.
[labex@host ~]$
Nota: Si tu clave no tiene contraseña, puedes continuar con la demostración de ssh-agent para entender cómo funciona, aunque en este caso no se te pedirá una contraseña.
Primero, inicia ssh-agent en tu sesión de shell actual. El comando eval se utiliza para configurar correctamente las variables de entorno que ssh-agent genera.
eval "$(ssh-agent)"
Agent pid 1024
La salida mostrará el ID de proceso (PID) de ssh-agent.
A continuación, añade tu clave privada (id_rsa_passphrase) a ssh-agent.
ssh-add ~/.ssh/id_rsa_passphrase
Si tu clave tiene contraseña, se te pedirá que la introduzcas. Si no, la clave se añadirá directamente:
Identity added: /home/labex/.ssh/id_rsa_passphrase (labex@6846375f1c0e35fea6cb03e6)
Ahora que la clave se ha añadido a ssh-agent, intenta conectarte a localhost de nuevo con la misma clave.
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Deberías poder conectarte sin que se te pida la contraseña (independientemente de si tu clave la tiene o no, ya que ahora la gestiona el agente):
Último inicio de sesión: lun 9 jun 01:39:49 2025 desde 127.0.0.1
[labex@host ~]$
Has utilizado correctamente ssh-agent para administrar tu clave SSH.
Nota Importante: Las variables de entorno de ssh-agent solo están disponibles en la sesión de shell donde las iniciaste. Si estás en una sesión SSH, necesitas volver a tu shell local para usar los comandos ssh-add.
Primero, cierra la sesión SSH:
exit
exit
Conexión a localhost cerrada.
[labex@host ~]$
Ahora, para ver las claves cargadas actualmente en tu ssh-agent, puedes usar ssh-add -l:
ssh-add -l
Si el agente está en funcionamiento y tiene claves cargadas, verás una salida como:
3072 SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg /home/labex/.ssh/id_rsa_passphrase (RSA)
Sin embargo, si ves un mensaje de error como "No se pudo abrir una conexión a tu agente de autenticación", significa que las variables de entorno del agente no están configuradas en tu sesión actual.
Para eliminar todas las identidades de ssh-agent, utiliza ssh-add -D:
ssh-add -D
Si el agente es accesible, verás:
Todas las identidades eliminadas.
Sin embargo, si ves "No se pudo abrir una conexión a tu agente de autenticación", significa que el entorno del agente no está disponible en tu sesión actual.
Ahora, si intentas conectarte de nuevo y tu clave tiene contraseña, se te pedirá que la introduzcas porque la clave se ha eliminado del agente:
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Si tu clave tiene contraseña, verás:
Introduzca la contraseña para la clave '/home/labex/.ssh/id_rsa_passphrase':
Si tu clave no tiene contraseña, aún podrás conectarte directamente. Pulsa Ctrl+C para cancelar el intento de conexión si se te pide una contraseña.
Finalmente, para detener el proceso ssh-agent, puedes usar ssh-agent -k:
ssh-agent -k
Si la variable de entorno SSH_AGENT_PID no está configurada, puedes ver:
SSH_AGENT_PID no configurado, no se puede matar el agente
Esto es normal si el agente se inició en una sesión de shell diferente o si las variables de entorno no se exportaron correctamente.