¿Cómo funciona la autenticación de clave pública ssh?

45

Mi comprensión básica es esta:

  • El sshd del servidor (conectado a) utiliza la clave pública para cifrar algún mensaje
  • El ssh o ssh-agent del cliente lo descifra y envía algo de vuelta (¿la suma de comprobación del mensaje? ¿su firma?)
  • El servidor sshd verifica que esto sea coherente con el mensaje para autenticar al usuario

¿Pero cuáles son los detalles? ¿Qué es el "mensaje", qué devuelve ssh(-agent) ? ¿Hacer esto con el mismo mensaje original una y otra vez siempre generará la misma comunicación?

¿Se puede reproducir este proceso de autenticación a través de herramientas bash si se utiliza ssh-agent ? P.ej. las claves públicas que proporciona ssh-agent pueden obtenerse a través de ssh-add -L , ¿qué pasa con el resto del proceso? ¿O eso requeriría una conexión manual al socket $SSH_AUTH_SOCK unix y alguna comunicación de bajo nivel?

Relacionado: diálogo de Thomas 'Server-Bob aquí , aunque eso sugiere que el cliente solo firma algunos datos aleatorios que luego se verificará contra todas las claves públicas del usuario del servidor authenticated_keys . Por otra parte, esta ilustración afirma que el mensaje está cifrado en la clave pública del usuario previamente determinado. (no la del cifrado ssh) y el cliente genera la suma de comprobación que también depende de algún ID de sesión aleatorio. ¿Cuál es la correcta? ¿O ambos solo cuentan parte de la historia realmente más compleja?

    
pregunta Tobias Kienzler 26.10.2012 - 13:22
fuente

2 respuestas

15

Los detalles de la autenticación dependen de la versión del protocolo y del tipo de clave. En todos los casos, siempre hay un desafío, con algo de aleatoriedad para evitar los ataques de repetición. Cuando la clave de usuario es de tipo DSA, necesariamente está implicada una verdadera firma digital, ya que DSA es un algoritmo de solo firma. El artículo al que se vincula muestra algo que supone que la clave de usuario puede realizar un cifrado asimétrico; Supongo que esto es algo que hizo SSHv1 (en SSHv1, todas las claves fueron RSA, y RSA puede hacer un cifrado asimétrico). Para el protocolo actual (SSHv2), la autenticación del cliente basada en clave pública se especifica en RFC 4252 , sección 7.

El concepto central sigue siendo el mismo: el cliente prueba su control de la clave privada realizando una operación que requiere el conocimiento de esa clave, pero de tal manera que la operación "inversa" se puede hacer con la clave pública que se encuentra en el .ssh/authorized_keys en el servidor.

    
respondido por el Thomas Pornin 26.10.2012 - 15:53
fuente
26

En resumen:

  • SSHv1: el servidor cifra un mensaje a una clave pública almacenada en authorized_keys , el cliente tiene que descifrarlo y devolver su suma de comprobación (modificada por un ID de sesión)
  • SSHv2: el cliente firma un mensaje (según el ID de sesión) y transmite la firma sin el mensaje pero con la clave pública utilizada. El servidor vuelve a crear el mensaje y verifica la firma (siempre que la clave pública esté en authorized_keys )

El documento PROTOCOL.agent resume esto:

  

Las claves de protocolo 1 y protocolo 2 están separadas debido a las diferentes   Uso criptográfico: las claves RSA privadas del protocolo 1 se utilizan para descifrar   Retos que fueron encriptados con la correspondiente clave pública,   mientras que las claves privadas RSA del protocolo 2 se utilizan para firmar desafíos con un   Clave privada de verificación con la clave pública correspondiente. Es   Se considera una práctica no válida utilizar la misma clave para firmar y   cifrado.

Aquí está la sección relevante de SSHv2 de RFC 4252 :

  

Para realizar la autenticación real, el cliente PUEDE enviar un mensaje   Firma generada utilizando la clave privada. El cliente PUEDE enviar el
  firma directamente sin primero verificar si la clave es
  aceptable. La firma se envía utilizando el siguiente paquete:

  byte      SSH_MSG_USERAUTH_REQUEST
  string    user name
  string    service name
  string    "publickey"
  boolean   TRUE
  string    public key algorithm name
  string    public key to be used for authentication
  string    signature
     

El valor de 'firma' es una firma del correspondiente   Clave privada sobre los siguientes datos, en el siguiente orden:

  string    session identifier
  byte      SSH_MSG_USERAUTH_REQUEST
  string    user name
  string    service name
  string    "publickey"
  boolean   TRUE
  string    public key algorithm name
  string    public key to be used for authentication
     

Cuando el servidor recibe este mensaje, DEBE verificar si el servidor   la clave suministrada es aceptable para la autenticación, y si es así, DEBE ser   Compruebe si la firma es correcta.

    
respondido por el Tobias Kienzler 26.10.2012 - 16:06
fuente

Lea otras preguntas en las etiquetas