¿Es segura la transmisión de un mensaje firmado con 'ssh-agent' como contraseña?

8

Hay un sistema de archivos encriptado en un servidor que ssh usa para usar la autenticación de clave pública. Dado que un reenviado ssh-agent puede firmar un mensaje de manera determinista (vea también ssh-agent protocol sección 2.6.2), considero que debo usar un mensaje almacenado en el servidor combinado 1 con su firma (usando una clave RSA privada almacenada en el cliente a través del ssh-agent reenviado) como contraseña ingresada al programa de cifrado para resolver mi pregunta ¿Cómo descifrar un contenedor cifrado a través de ssh sin ingresar una frase de contraseña mientras se requiere alguna autenticación de cliente? (pero básicamente cualquier aplicación de solicitud de contraseña podría estar involucrada aquí) y luego descartarse nuevamente. Pero, ¿es esta una buena idea (= segura)? ¿Qué tipo de combinación entre mensaje y firma debo usar? ¿Es necesario utilizar un par de claves diferente al de la autenticación ssh? ¿O estoy tratando de inventar una rueda triangular?

1 ¿La combinación del mensaje original con la firma ayuda de alguna manera en comparación con el simple uso de la firma sola? (Aparte de la entropía, pero supongamos que el estiramiento de las teclas se aplica de todos modos)

Aquí hay un breve resumen de cómo funciona la autenticación de clave pública SSHv2:
sshd en el servidor remoto espera que ssh o ssh-agent del cliente firmen un mensaje predeterminado con su clave privada (que no se almacena remotamente ) y el servidor puede verificarlo a través de la clave pública reenviada y compararlo con la base de datos authorized_keys del usuario.
ssh-agent : el reenvío generalmente consiste en conectarse a una tercera PC. La PC intermedia genera el mensaje, pero le pide al cliente original ssh-agent que lo firme, sin conocer nunca la clave privada. Esta misma instrucción de firma es lo que quiero usar para obtener un "secreto" (la firma, no la clave pública) que se puede usar como una contraseña que no se almacena en ningún lugar (y no se puede reproducir solo en el cliente si el mensaje -a-ser-firmado se almacena solo en el servidor) - no hay una tercera PC involucrada, solo el reenvío del agente.

Aquí hay una ilustración del proceso que pretendo implementar:

Client:                   Server:
>ssh-add SECRET RSA KEY
>ssh -A server            <-- connect, forward agent (authentication does not
                                         need to use that specific secret key)

                          Connect to the 'SSH_AUTH_SOCK' unix socket and ask
                          the client's ssh-agent to sign MESSAGE with SECRET RSA KEY
                          (knowing only the respective PUBLIC RSA KEY to identify it)
ssh-agent signs MESSAGE --> SIGNATURE
                          [optionally verify SIGNATURE]

                          Use SIGNATURE as PASSWORD,
                          pipe that to the program and forget it.

A mi entender, esto implica lo siguiente:
Si el servidor fuera robado, el ladrón tendría que interceptar la firma del cliente MESSAGE , de lo contrario no podría obtener PASSWORD . Si el cliente es robado, sin MESSAGE ni siquiera se puede generar SIGNATURE . Por lo tanto, tanto el servidor como el cliente deben ser robados y se debe obtener la frase de contraseña de SECRET RSA KEY , lo que sería tan molesto como la fuerza bruta de la contraseña original ...

editar Escribí un pequeño script en Python para esto, ssh-agent-sign

    
pregunta Tobias Kienzler 26.10.2012 - 17:39
fuente

3 respuestas

3

No es menos seguro que ingresar una contraseña a través de SSH para descifrar el contenedor.

Cualquier problema para descifrar un contenedor en un sistema remoto es un problema completamente diferente.

    
respondido por el Hubert Kario 03.11.2012 - 11:49
fuente
2

Aquí están mis pensamientos hasta ahora, qué podría hacer un atacante:

  • Ataques solo del servidor :
    • Agente : obtenga MENSAJE y conéctese al zócalo del agente ssh para obtener la FIRMA. Se puede mitigar con ssh-add -c , -x o -t
    • Ambos : escuchas ilegales
    • Ambos : ... la mayoría de las cosas que funcionarían localmente, por ejemplo. envuelva la solicitud de frase de contraseña, haga fuerza bruta en la frase de contraseña del contenedor (el método del Agente puede elegir fácilmente una más compleja, mientras que la frase de contraseña de la clave privada puede ser bastante fácil); ataques de arranque en frío, o leer la frase de acceso desde la memoria de un sistema en ejecución mientras el contenedor está montado
  • Ataques de cliente también :
    • Frase de contraseña : Keylogger
    • Agente : obtenga la clave privada sin cifrar

De todos modos, aquí hay una implementación real para obtener una firma: ssh-agent-sign (descargo de responsabilidad: lo escribí)

    
respondido por el Tobias Kienzler 08.11.2012 - 12:36
fuente
1

Heh, en realidad tuve la misma idea para cifrar datos en máquinas remotas cuando me topé con tu pregunta. No entiendo por qué necesita combinar MESSAGE y SIGNATURE para crear PASSWORD . ¿No es SIGNATURE suficiente? Si no es MESSAGE no ayudará. Como lo veo, lo primero que debe establecerse es si una firma es una clave tan fuerte como una clave privada. Para establecer eso, algunas cosas deben ser determinadas:

  • ¿La firma tiene la misma entropía que la clave privada? - La longitud de la firma es siempre del mismo tamaño que la clave utilizada. Así que con respecto a la longitud de la clave, la cantidad de entropía no se ve afectada.
  • ¿Es una firma tan aleatoria como la clave que se usó? (En realidad no lo sé)
  • ¿El contenido de MESSAGE tiene algún efecto en la aleatoriedad de SIGNATURE ? (Tampoco sé que)

Con respecto a MESSAGE : creo que sería prudente hacerlo lo más aleatorio posible usando openssl rand (sin embargo, tal vez no ).

No veo ningún problema con el protocolo en sí

Un consejo: en lugar de pasar la firma directamente a algo que desea cifrar, puede descifrar la clave real ( KEY ) que se debe usar. De esta manera, puede permitir que varias firmas descifren los mismos datos (al guardar la clave real varias veces cifradas con diferentes firmas). Así que el protocolo se vería así.

Client:                   Server:
>ssh-add SECRET
>ssh -A server            
                          Locate keyfile for available signature
                          Ask ssh-agent to sign MESSAGE from keyfile with SECRET
ssh-agent returns SIGNATURE
                          Use SIGNATURE to decrypt PASSWORD from keyfile
                          Use PASSWORD to decrypt the actual data

Creo que lo intentaré e intentaré implementarlo usando solo socat y bash, no debería ser tan difícil :-)

    
respondido por el andsens 04.06.2014 - 22:03
fuente

Lea otras preguntas en las etiquetas