Introducción
SSH-agent es parte de OpenSSH. En esta publicación explicaré qué es un agente, cómo usarlo y cómo funciona para mantener sus claves seguras. También describiré el reenvío de agentes y cómo funciona. Lo ayudaré a reducir el riesgo de usar el reenvío de agentes y compartiré una alternativa al reenvío de agentes que puede usar al acceder a sus hosts internos a través de los bastiones.¿Qué es un agente SSH?
ssh-agent
Es un administrador clave para SSH. Almacena sus claves y certificados en la memoria, sin cifrar y listos para usar ssh
. Esto elimina la necesidad de ingresar una contraseña cada vez que se conecta al servidor. Se ejecuta en segundo plano en su sistema, separado de ssh
, y generalmente comienza en el primer inicio ssh
.El agente SSH mantiene las claves secretas seguras porque no :- No escribe ninguna información clave en el disco.
- No le permite exportar sus claves privadas.
Las claves secretas almacenadas en el Agente se pueden usar para un solo propósito: firmar un mensaje.Pero si un agente solo puede firmar mensajes, ¿cómo SSH encripta y desencripta el tráfico?En el primer estudio de claves públicas y privadas de SSH, es natural suponer que SSH utiliza estos pares de claves para cifrar y descifrar el tráfico. Eso es exactamente lo que pensé. Pero este no es el caso. El par de claves SSH se usa solo para la autenticación durante la conexión inicial.Por ejemplo, aquí se explica cómo verificar una clave de usuario durante una conexión SSH, desde la perspectiva del servidor:- El cliente proporciona al servidor una clave pública.
- El servidor genera y envía un breve mensaje aleatorio pidiéndole al cliente que lo firme con una clave privada.
- El cliente le pide al agente SSH que firme el mensaje y envía el resultado al servidor.
- El servidor verifica la firma utilizando la clave pública del cliente.
- Ahora el servidor tiene pruebas de que el cliente posee la clave privada.
Más tarde, durante el proceso de conexión, se genera un conjunto de claves nuevas, efímeras y simétricas, que se utilizan para cifrar el tráfico de sesión SSH. Es posible que estas teclas ni siquiera duren una sesión completa; El evento rekey ocurre a intervalos regulares.Protocolo de agente
SSH utiliza un socket de dominio Unix para comunicarse con el agente a través del protocolo del agente SSH . La mayoría de las personas usa el ssh-agent
que viene con OpenSSH, pero hay muchas alternativas de código abierto.El protocolo del agente es tan simple que podría escribir un agente SSH básico en un día o dos. Tiene solo unas pocas operaciones básicas:- Agregar un par de claves regular (claves públicas y privadas descifradas)
- Agregar un par de claves limitado (claves públicas y privadas descifradas)
- Agregar clave (regular o limitada) de la tarjeta inteligente (solo clave pública)
- Eliminar clave
- Listado de claves almacenadas en el agente
- Firmar un mensaje con una clave almacenada en el agente
- Bloquee o desbloquee a un agente completo con una contraseña
¿Qué es una clave limitada? Esta suele ser una clave que tiene una vida limitada o requiere una confirmación explícita por parte del usuario cuando la usa.El comando ssh-add
es su puerta de entrada al agente SSH. Realiza todas estas operaciones excepto la firma. Cuando ejecuta ssh-add sin ningún parámetro, buscará algunas claves estándar en su directorio de inicio y las agregará a su agente. Por defecto, busca:~/.ssh/id_rsa
~/.ssh/id_ed25519
~/.ssh/id_dsa
~/.ssh/id_ecdsa
Tan pronto como agregue las llaves al llavero, se usarán automáticamente ssh
.ssh-
y macOS Keychainssh-agent
, incluido con macOS, puede almacenar la frase de contraseña para las claves en macOS Keychain, lo que hace que sea aún más fácil volver a agregar claves al agente después de un reinicio. Dependiendo de la configuración de su Llavero, es posible que deba desbloquearlo después de reiniciar. Para guardar frases clave en Keychain, ejecute el comando ssh-add -K [ ]
. Las frases de contraseña generalmente se almacenan en "Elementos locales". ssh-agent
usará estas frases guardadas automáticamente según sea necesario.¿Qué es el reenvío de agentes?
La función de reenvío de agente permite que su agente SSH local se comunique a través de una conexión SSH existente y se autentique de forma transparente en un servidor más remoto. Por ejemplo, suponga que inicia sesión en EC2 a través de SSH y desea clonar un repositorio privado de GitHub desde allí. Sin reenvío de agente, tendrá que almacenar una copia de su clave privada de GitHub en el host EC2. Cuando se redirige al agente, el cliente SSH en EC2 puede usar las claves en su computadora local para la autenticación en GitHub.Cómo funciona el reenvío de agentes
En primer lugar, un poco de historia. Las conexiones SSH pueden tener múltiples canales. Aquí hay un ejemplo común: se realiza una conexión interactiva a bastion-host (jump box) en un canal. Cuando el reenvío de agente está habilitado para la conexión (generalmente usando ssh -A
), se abre un segundo canal en segundo plano para reenviar cualquier solicitud de agente a su computadora local.En términos de ssh
, no hay diferencia entre remoto y local ssh-agent
. SSH siempre mira la variable de entorno $SSH_AUTH_SOCK
para encontrar el socket de dominio Unix para el agente. Cuando se conecta a un host remoto con el reenvío de agente habilitado, SSHD creará un socket de dominio Unix remoto asociado con el canal de reenvío de agente y lo exportará $SSH_AUTH_SOCK
apuntando hacia él.
El reenvío de agentes está asociado con cierto riesgo
Cuando redirige un socket de dominio ssh-agent
Unix a un host remoto, esto plantea un riesgo de seguridad: cualquier persona con acceso root en el host remoto puede acceder discretamente a su agente SSH local a través del socket. Pueden usar sus claves para hacerse pasar por otras máquinas en la red.Aquí hay un ejemplo de cómo se vería esto:
Cómo reducir su riesgo con el reenvío de agentes
Aquí hay algunas formas de hacer que la redirección de agentes sea más segura:- No habilitar
ForwardAgent
por defecto.
Bloquee su agente ssh cuando use el reenvío de agente. ssh-add -x
bloquea al agente con una contraseña y la ssh-add -X
desbloquea. Cuando está conectado a un host remoto con reenvío de agente, nadie puede ingresar a su agente sin una contraseña.O use un agente SSH alternativo que le pregunte cuándo está en uso. Sekey usa Touch ID en macOS para almacenar claves en el enclave de seguridad de MacBook Pro.O no utilice el reenvío de agente en absoluto. Si está intentando acceder a hosts internos a través de bastion, hay ProxyJump
una alternativa mucho más segura para este caso de uso. (vea abajo)Uso ProxyJump
: una alternativa más segura
Cuando quieres pasar por bastion-host (jumpbox), realmente no necesitas un reenvío de agente. El mejor enfoque es usar la directiva ProxyJump
.En lugar de redirigir al agente a través de un canal separado, ProxyJump
redirige la entrada y salida estándar de su cliente SSH local a través del bastión y más al host remoto. Así es como funciona:- Ejecutar
ssh -J bastion.example.com cloud.computer.internal
para conectarse a cloud.computer.internal
través de su servidor bastión bastion.example.com
. cloud.computer.internal
Es el nombre de host que se puede encontrar buscando DNS en bastion.example.com
. - Su cliente SSH usa las claves de su agente para conectarse
bastion.example.com
. - Después de conectar SSHD al bastión, se conecta
cloud.computer.internal
y transfiere esta conexión a su cliente SSH local. - Su cliente SSH local vuelve a realizar la conexión, esta vez con
cloud.computer.internal
Puede pensarlo como SSH en una sesión SSH; excepto que ssh nunca se ejecuta en bastión. En cambio, se sshd
conecta cloud.computer.internal
y le da el control de esta conexión (entrada y salida estándar) a su SSH local, que luego realiza una segunda conexión.Configurando ProxyJumpDigamos bastion-host this bastion.example.com
. Puedo configurar mi ~/.ssh/config
así:Host bastion.example.com
User carl
Host *.computer.internal
ProxyJump bastion.example.com
User carl
Luego solo corro ssh cloud.computer.internal
para conectarme al destino interno a través del bastión, sin reenvío de agente.Si ProxyJump no funciona ...Las versiones anteriores de SSH y SSHD (anteriores a la versión 7.2, lanzada en 2016) no son compatibles ProxyJump
. Pero puede realizar una operación equivalente usando ProxyCommand
y netcat . Aquí hay un ejemplo:ssh -o ProxyCommand="ssh bastion.example.com nc %h %p" cloud.computer.internal
La magia aquí es que SSH en sí es el servidor proxy que usa para SSH. La parte nc %h %p
simplemente abre la conexión de socket sin procesar en cloud.computer.internal
el puerto 22. La entrada / salida estándar del comando ssh primario se pasa directamente para ProxyCommand
que el ssh primario pueda autenticarse en el host interno a través de una conexión proxy.
Aprenda los detalles de cómo obtener una profesión solicitada desde cero o subir de nivel en habilidades y salario tomando los cursos en línea de SkillFactory:Lee mas