Tengo una red a la que solo se puede acceder a través de los servidores bastion a través de ssh. En él, estoy desarrollando aplicaciones web que están expuestas a los usuarios finales a través de GUIs servidas a través de websockets. Todo el tráfico que entra y sale de la red viaja a través de un túnel SSH desde cualquier host de servicio, a través del bastión, hasta la máquina del usuario final.
Por lo tanto, el tráfico desde el límite de la red hasta el cliente final ya está cifrado. Y, ya tengo una configuración del sistema para asociar usuarios finales con pares de claves SSH-RSA que se rotan periódicamente.
Entonces, aquí está mi idea loca:
En cualquier aplicación web en la red que requiera la autenticación del usuario, haga que el usuario final proporcione su nombre de usuario en la red, así como su clave pública. Haga que el servicio de autenticación de la aplicación web verifique que esta clave pública ya esté asociada con el usuario final en el almacén de claves de la red, luego genere un desafío utilizando la clave. Del lado del cliente, el usuario final descifra el desafío utilizando su clave privada y presenta el resultado final al servidor para la autenticación.
Aquí está el kicker: una carga de servicios en esta red se implementa en JavaScript en NodeJS. Debido a que NodeJS puede llamar a los servicios del sistema, puedo descargar el trabajo de generar desafíos utilizando claves públicas para un proceso más tradicional. Pero, desde el punto de vista del cliente, es posible que tenga que descifrar el desafío en el navegador usando la clave privada.
Poner la clave privada en el navegador es bastante fácil. El hecho de cargar o no la clave privada en un navegador es una buena idea es otra cuestión, por completo.
Pero, más específicamente:
- ¿Hay algún candente "Oh, no hagas eso!" fallas de seguridad en la configuración resumida arriba?
- ¿Cuáles son algunos paquetes estándar utilizados en Linux para generar desafíos usando una clave pública RSA?
- ¿Alguien sabe de un buen paquete para descifrar mensajes usando una clave RSA pública implementada en JavaScript ?