¿Cómo puedo crear un servicio que inicie sesión automáticamente en un servicio de terceros sin almacenar las credenciales en texto sin formato?

6

Sé que almacenar las credenciales de inicio de sesión en texto sin formato es uno de los principales elementos de seguridad, pero estoy trabajando en algo en lo que no puedo pensar en ninguna otra solución.

Mi servicio se conecta al correo electrónico de un usuario a través de IMAP. Para poder conectarme al servidor de correo electrónico, mi servicio debe conocer las credenciales de inicio de sesión de la cuenta de correo electrónico del usuario.

Normalmente, usaría algún tipo de mecanismo de cifrado o hash para almacenar las credenciales de los usuarios en la base de datos, pero como los hashes (se supone que son) de una sola vía, no puedo iniciar sesión en el servidor de correo electrónico con credenciales hash.

¿Cómo puedo crear un sistema seguro para mi servicio si el usuario tiene que tener credenciales para conectarse a un sistema de terceros, así como a mi sistema?

    
pregunta Peter Olson 20.05.2012 - 00:25
fuente

2 respuestas

5

Deberá almacenar la contraseña de correo electrónico del usuario en una forma recuperable. Aún puedes encriptar las contraseñas, pero no puedes hacerles hash.

El almacenamiento de las contraseñas de sus usuarios en forma recuperable conlleva algunos riesgos de seguridad. Si alguna vez se filtra la base de datos de contraseñas de usuarios, se produce una grave violación de la seguridad. Sin embargo, esa es la naturaleza de su servicio. La gente suele recomendar el hash para intentar mitigar este riesgo, pero como no puede usar el hashing de contraseñas en su aplicación en particular, tendrá que usar otras medidas para mitigar el riesgo.

Esta es mi recomendación sobre cómo hacerlo de la manera más segura posible. Configure una máquina separada (o VM) que se use únicamente con el fin de administrar las contraseñas de correo electrónico. Ejecuta un servicio, llamémoslo el servicio de mantenimiento de contraseñas, que expone algunas API simples:

  • Registrar cuenta IMAP. La persona que llama proporciona información sobre una cuenta de correo electrónico: por ejemplo, el nombre de usuario y la contraseña. El servicio de mantenimiento de contraseñas almacena esta información.

  • Leer correo electrónico. La persona que llama identifica una cuenta IMAP que se registró anteriormente con su servicio. El servicio de mantenimiento de contraseñas busca el nombre de usuario y la contraseña de esa cuenta IMAP, se conecta al servidor IMAP y se autentica, descarga cualquier correo electrónico nuevo y devuelve los mensajes de correo electrónico deseados a la persona que llama.

Este servicio de mantenimiento de contraseñas es como un Hotel California para las contraseñas de correo electrónico: las contraseñas se ingresan, pero nunca se abandonan. El servicio de mantenimiento de contraseñas es responsable de almacenar las contraseñas de la forma más segura posible, y nunca exponerlas a otros. Puede almacenar las contraseñas en una base de datos separada, cifrada bajo una clave especial. La clave de cifrado se puede almacenar en un archivo de configuración al que este servicio puede acceder, pero no a nadie más. El servicio de mantenimiento de contraseñas ahora puede controlar el acceso a las cuentas de correo electrónico de sus usuarios. Por ejemplo, puede realizar un registro seguro (para que pueda rastrear intrusiones), limitar la velocidad (para reducir el impacto de una violación de sus otros sistemas) u otras protecciones. También puede bloquear quién o qué puede acceder a él.

Ahora, escriba el resto de su sistema para que sea un cliente del servicio de mantenimiento de contraseñas. Configure el servicio de mantenimiento de contraseñas de modo que solo sea accesible para su código (y no para el público), y use una autenticación sólida para la conexión de su código con él. Asegúrese de no almacenar las contraseñas de correo electrónico de los usuarios en ningún otro lugar de su sistema. Cuando el usuario proporciona una contraseña de correo electrónico a su aplicación, debe invocar inmediatamente la API "Registrar cuenta IMAP" del servicio de mantenimiento de contraseñas, pasarla y eliminar todas las demás copias de la contraseña.

Esto no brindará una protección perfecta, pero le brinda un lugar para estar de pie: una forma de obtener la mayor protección posible para las contraseñas de sus usuarios. Con este tipo de enfoque y cierta diligencia, creo que puede proporcionar un nivel razonable de seguridad a sus usuarios.

    
respondido por el D.W. 21.05.2012 - 02:06
fuente
1

Su servicio debe probarse ante el servicio de terceros autorizado para acceder a ese servicio. Cualquier credencial que use para hacer esto debe almacenarse de manera segura. Aparte de usar un HSM para almacenar su clave y realizar las operaciones de cifrado en su extremo (y hacer que el servicio de terceros participe en un protocolo de clave pública compatible), creo que no podrá almacenar una contraseña equivalente en la casilla. ejecutando su servicio.

Si el usuario debe tener (e ingresar cuando sea necesario) las credenciales para cada sistema involucrado, usted puede crear un sistema seguro, en el sentido de que no necesita almacenar y ser capaz de -para-recuperar esas credenciales. Cuando un sistema de este tipo se pierde, no está en seguridad sino en conveniencia para el usuario .

    
respondido por el mlp 20.05.2012 - 03:55
fuente

Lea otras preguntas en las etiquetas