Autenticación de servicios con PKI (pycrypto)

0

así que estoy tratando de resolver un problema en el trabajo. Tenemos una tienda de valor clave popular que hace seguridad a través de tokens. El almacén kv emite un token específico que determina qué clientes pueden consultar qué claves.

Quiero escribir un microservicio que ayude a otros microservicios a obtener este token. La idea es que el microservicio de autenticación (el que emite el token a otros servicios) tendrá una clave pública en su base de datos que se corresponda con una clave privada que posee cada servicio que necesita acceso al almacén kv (y por lo tanto necesita un token).

El servicio que necesita un token consultará el servicio de autenticación con su nombre y su clave privada (sobre ssl). Si el servicio de autenticación valida que la clave privada se corresponde matemáticamente con la clave pública, entonces el servicio de autenticación debería devolver el token.

Esto parece ser una idea sólida, pero necesito algunas ideas sobre cómo lograr esto. En todos los tutoriales de pycrypto que veo, se trata de cifrar y descifrar un mensaje, pero eso no es exactamente lo que quiero hacer. Solo quiero que el servicio de autenticación sepa acerca de las claves y, cuando se me presente una clave pública, solo diga "sí". Esto coincide con su clave privada, aquí está el token.

Al leer mi esquema, ¿puedo obtener algunas sugerencias sobre la mejor manera de utilizar esta metodología?

    
pregunta Louis_Santos 01.07.2016 - 22:42
fuente

1 respuesta

1

Primero, no pasas las claves privadas a otro servicio. En general, una clave debe considerarse comprometida si alguna vez se pasa a otro servicio. Si desea confiar totalmente en el microservicio de autenticación, simplemente use las contraseñas para la autenticación. Puede generarlos de manera segura evitando contraseñas débiles.

La forma correcta de autenticarse con el cifrado asimétrico es utilizar un modelo de desafío-respuesta . En este sentido, el servicio de autenticación generaría un número aleatorio, lo cifraría utilizando la clave pública del cliente y luego pasaría el valor cifrado al cliente. Al responder con el secreto de texto claro, el cliente prueba que tienen la clave privada correspondiente a la clave pública en la base de datos. Entonces los mensajes serían básicamente:

  1. Cliente - > Servidor: autenticar a Alice
  2. Servidor - > Cliente: descifrar cifrado (texto, clave pública de Alice)
  3. Cliente - > Servidor: texto en texto claro
  4. Servidor - > Cliente: Aquí está tu token ...

Probablemente, la mejor manera de hacerlo es utilizar TLS de autenticación mutua . Que gestiona el desafío / respuesta dentro de la pila de red. Cuando se llame al microservicio, ya sabrá que el usuario tiene la clave privada. Puedes devolver el token en ese punto. Los mensajes serían:

  1. Cliente - > Servidor: dame el token para Alice
  2. Servidor - > Cliente: Aquí está tu token ...

El primer paso, donde tiene lugar el protocolo de enlace TLS, involucrará múltiples mensajes electrónicos, pero se manejarán automáticamente.

    
respondido por el Neil Smithline 01.07.2016 - 23:03
fuente

Lea otras preguntas en las etiquetas