Sobre el agente de SSH

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-agentEs 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-agentque 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-addes 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 Keychain
ssh-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-agentusará 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_SOCKpara 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_SOCKapuntando hacia él.

imagen

El reenvío de agentes está asociado con cierto riesgo


Cuando redirige un socket de dominio ssh-agentUnix 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:

imagen

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 ForwardAgentpor defecto.


Bloquee su agente ssh cuando use el reenvío de agente. ssh-add -xbloquea al agente con una contraseña y la ssh-add -Xdesbloquea. 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 ProxyJumpuna 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, ProxyJumpredirige 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:

  1. Ejecutar ssh -J bastion.example.com cloud.computer.internalpara conectarse a cloud.computer.internaltravés de su servidor bastión bastion.example.com. cloud.computer.internalEs el nombre de host que se puede encontrar buscando DNS en bastion.example.com.
  2. Su cliente SSH usa las claves de su agente para conectarse bastion.example.com.
  3. Después de conectar SSHD al bastión, se conecta cloud.computer.internaly transfiere esta conexión a su cliente SSH local.
  4. 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 sshdconecta cloud.computer.internaly 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 ProxyJump

Digamos bastion-host this bastion.example.com. Puedo configurar mi ~/.ssh/configasí:

Host bastion.example.com
	User carl

Host *.computer.internal
	ProxyJump bastion.example.com
	User carl

Luego solo corro ssh cloud.computer.internalpara 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 ProxyCommandy 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 %psimplemente abre la conexión de socket sin procesar en cloud.computer.internalel puerto 22. La entrada / salida estándar del comando ssh primario se pasa directamente para ProxyCommandque el ssh primario pueda autenticarse en el host interno a través de una conexión proxy.



imagen
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



All Articles