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