Almacenamiento de claves privadas del usuario en la base de datos

1

Tengo la necesidad de almacenar claves privadas para varios usuarios, para que mi aplicación de servidor pueda firmar archivos en su nombre. Quiero almacenar estas claves de forma segura, pero no pude encontrar mucha información sobre este asunto.

También necesito admitir la característica clásica "Perdí mi contraseña": si un usuario pierde su contraseña, debemos poder generar una nueva para ellos y para que la clave privada no se pierda.

¿Cuáles son las mejores prácticas en este escenario?

P.S. Se ha formulado una pregunta muy similar sobre SO hace 3 años .

    
pregunta lautaro.dragan 27.10.2017 - 08:49
fuente

3 respuestas

1

NUNCA almacenaría este tipo de información sin la ayuda de un HSM.

En cuanto a sus necesidades, vault form hashicorp puede hacer esto (con la ayuda de un HSM) .

Sin embargo, su aplicación no debe obtener directamente las claves, pero debe solicitar a vault que realice el cifrado por usted.

También implemente salvaguardas y otras barreras de seguridad para limitar el abuso, ya que está transfiriendo 'datos' con la 'confianza de los usuarios' adjunta una vez que esté firmado por su sistema.

    
respondido por el LvB 27.10.2017 - 12:23
fuente
5

En mi humilde opinión tiene un diseño cuestionable aquí. Cuando leo

  

la aplicación de mi servidor puede firmar archivos en nombre de [mis usuarios]

todas las luces parpadean de repente en rojo. Si su solicitud puede firmar algo en nombre de un usuario, usted lo firma. Puede estar bien en su caso de uso, pero debe revisar cuidadosamente la cadena de responsabilidad. Si además necesita poder recuperar la clave privada si los usuarios pierden su contraseña, eso significa que tiene un acceso completo a esa clave incluso sin que se notifique a los usuarios (o sin su consentimiento explícito). Eso también significa que cualquier persona con privilegios de administrador en el servidor puede firmar cualquier cosa en nombre de cualquier usuario. En mi humilde opinión, las claves ya no pertenecen a los usuarios, sino que son solo información personal que necesita proteger de la divulgación no deseada. La protección común está entonces en capas:

  • seguridad física para proteger la máquina
  • reglas de seguridad internas para identificar quién tiene privilegios sobre qué
  • seguridad de la red para proteger el sistema de accesos remotos
  • varias capas de software para que un atacante tenga que romper al menos dos puntos de seguridad para acceder a la información: por ejemplo, los datos confidenciales deben almacenarse en forma cifrada, de modo que el atacante tenga acceso a ambos datos cifrados < fuerte> y la clave de descifrado
respondido por el Serge Ballesta 27.10.2017 - 12:11
fuente
0

Hay un par de problemas de uso aquí.

  • ¿Los usuarios realmente necesitan volver a obtener acceso a esa clave privada si olvidan su contraseña? Es decir. ¿Podría, en cambio, no generar un nuevo par de llaves y decirles que necesitan distribuir una nueva clave pública?
  • ¿La aplicación necesita acceso a las claves sin la presencia del usuario?

Si la respuesta a ambas es no, simplemente puede cifrar con su contraseña. Esto es seguro, ya que puede obtenerlo. Si un actor malintencionado tiene su contraseña (ignorando dos factores), puede iniciar sesión en el servicio como ellos de todos modos.

Si cualquiera de las respuestas es sí, lo mejor que puedes hacer es cifrar todas las claves de usuario con la misma clave. También desea considerar la estructura de seguridad arquitectónica. Es decir. debe mantener la base de datos en una máquina separada de la aplicación, apagarla fuera de Internet (lo ideal es que solo acepte conexiones desde la máquina IP del servidor web) y protegerla para que solo tenga abierto el puerto DB.

    
respondido por el Hector 27.10.2017 - 10:54
fuente

Lea otras preguntas en las etiquetas