¿Cómo se admite la creación segura de una cuenta de usuario sobre una API externa a través de un trabajo en cola?

7

Por lo tanto, esta pregunta está profundizando en la seguridad y el cifrado, y muchos no han encontrado el problema. Las respuestas pueden ser teóricas. Déjame resumir el escenario ...

  1. El frontend de un sitio web se maneja a través de una API de backend. El backend tiene un punto final que maneja un formulario de registro genérico con username y password . Está utilizando SSL.
  2. La API de backend maneja el registro a través de una cola de trabajo asíncrona. La cola no devuelve respuestas al servidor API. Es una operación de configurar y olvidar para poner en cola el registro.
  3. Los trabajadores recogen los trabajos en cola. Los trabajadores se encargan de crear la cuenta de usuario. Estos trabajadores necesitan acceso a la contraseña de usuario de texto simple para que puedan activar una llamada de registro de API de terceros con la contraseña.

Por lo tanto, el verdadero quid del problema es la sincronización de la contraseña con la API de terceros sin revelarla a los curiosos. La cola plantea el problema de no tener acceso directo a la contraseña de texto sin formato desde los datos POST globales, lo que significa que debe almacenarse de alguna manera en la cola.

La cola puede almacenar fácilmente la contraseña con hash y copiarla directamente en la tabla de usuarios. Sin embargo, esta solución no permite la sincronización de la contraseña con la API de terceros, ya que ya está cifrada. Jugué con cifrado bidireccional, pero me preocupa de todo corazón dejar que la contraseña sea susceptible de descifrado por parte de un atacante.

¿Alguien puede pensar en una forma segura de manejar este escenario de sincronización de contraseña?

La cola es un requisito y se supone que esto puede ser leído por cualquier persona con acceso al servidor. Las contraseñas no necesariamente tienen que estar sincronizadas; la contraseña para la API de terceros podría ser una derivación del original siempre que haya un medio seguro para descifrar a través del usuario registrado sin proporcionar su contraseña. Básicamente, esto es para simular el inicio de sesión único con una API de terceros que no es compatible con SSO.

    
pregunta Corey Ballou 12.03.2013 - 21:25
fuente

5 respuestas

1

Esto parece descomponerse simplemente;

  • Tengo una cola de trabajos que contiene contraseñas de texto simple.
  • Me gustaría evitar que otros usuarios del servidor accedan a esas contraseñas.

Esto parece que debería ser bastante fácil, suponiendo que "otros usuarios del servidor" no significa una cuenta de superusuario.

Lo que debe hacer es diseñarlo para que su enlace frontend <-> jobqueue actúe como un diodo, los trabajos puedan entrar, pero no pueden salir datos de la cola de trabajo en la dirección del extremo delantero.

Algunos ejemplos simples;

  • La cola de trabajos existe en una base de datos a la que el front-end no tiene acceso. Los datos se cifran bajo una clave generada en tiempo de ejecución.
  • La cola de trabajos solo existe en la memoria RAM en un proceso marcado como no rastreable (en Linux necesitará AppArmor y Creo que esto es posible eliminando la capacidad CAP_SYS_PTRACE )
  • La cola de trabajos no existe, haga que las llamadas de back-end sean sincrónicas.

Dicho esto, hacer cualquier cosa que no sea el de hashear inmediatamente las contraseñas de texto simple es antipattern imho.

    
respondido por el lynks 13.03.2013 - 18:08
fuente
0

Debería usar bcrypt para copiar la contraseña y descartar el texto sin formato tan pronto como llegue al servidor API de su interfaz. / p>

Para la contraseña de API de terceros, use un generador de números pseudoaleatorios criptográficamente seguro para crear una contraseña aleatoria larga que almacene en el registro del usuario. Dependiendo de la sensibilidad de esta API, es posible que desee cifrar simétricamente la contraseña de la API antes de almacenarla en la base de datos. Le sugeriría usar Keyczar para administrar el cifrado si desea cifrar las contraseñas de la API.

    
respondido por el titanous 13.03.2013 - 16:25
fuente
0

Lo que no entiendo es por qué estás propagando la contraseña misma a la API de terceros. Eso no es Single Sign On. Eso es la estupidez de la contraseña única.

En su lugar hash su contraseña y guárdela. Luego genere una contraseña aleatoria para el usuario, una por cada tercero que inicie sesión. Y regístrate usando eso. De esa manera, solo las contraseñas individuales del sitio entran en la cola.

Viendo tu pregunta actual: esto es imposible. Supongo que la cola de trabajos y la API de backend están en el mismo servidor. Si no confías en la seguridad de la cola, tampoco puedes confiar realmente en la seguridad del servidor. Y tiene que almacenar la contraseña de alguna manera, en algún lugar en texto sin formato, o en un formato desde el cual su servidor pueda extraer la contraseña en texto sin formato.

    
respondido por el Manishearth 13.03.2013 - 16:37
fuente
0

Esta respuesta es diferente de las preguntas anteriores que sugieren que debe copiar la contraseña, almacenarla en una base de datos, etc. Esas soluciones son innecesariamente complejas en mi mente.

Si está finalizando la API de terceros en todas partes , entonces usted puede / debe inicializar y hacer hash de la contraseña y simplemente enviar ese bloc con hash al backend. Un enfoque podría tener este aspecto:

  1. Hash la contraseña con BCrypt / Scrypt con un salt
  2. Envíe ese hash al back-end como la contraseña del usuario y actualícelo cuando el usuario cambie su contraseña.

  3. Utilice la misma solución hash para sus servidores web de autenticación

En otras palabras, no le envíes a la API de terceros una contraseña de texto simple, envíales un hash que creas. Solo asegúrese de volver a crear este formato de hash en todos y cada uno de los servidores web o servidores web de validación.

Luego, cuando haga un proxy de las solicitudes de autenticación a la API de terceros, tome el PW de texto claro POSTADO POR HTTPS, haga un hash / semilla, luego envíelo a la API para una validación adicional.

Este enfoque evitará que el observador casual de la cola se haga pasar por un usuario y la sal evitará que se cree una tabla de arco iris.

    
respondido por el random65537 13.03.2013 - 18:44
fuente
0

Espere, a menos que tenga su kernel configurado para permitir que la raíz vea cualquier memoria en el sistema, ¿por qué no usar pipe ()? Se almacena solo en la memoria volátil, es seguro dentro del sistema y admite la transferencia de datos síncrona y asíncrona.

Si la cola es solo para conectar a los trabajadores directamente a la API, parece que no habría una forma práctica de explotar el sistema.

    
respondido por el Josh 22.03.2013 - 15:51
fuente

Lea otras preguntas en las etiquetas