Ho una rete accessibile solo tramite server bastion su ssh. In esso, sto sviluppando applicazioni web che sono esposte agli utenti finali tramite GUI su websocket. Tutto il traffico in entrata e in uscita dalla rete passa attraverso un tunnel SSH da qualsiasi host di servizio, attraverso il bastione, fino alla macchina dell'utente finale.
Quindi, il traffico dal confine della rete al client finale è già crittografato. E, ho già una configurazione di sistema per associare gli utenti finali con le coppie di chiavi SSH-RSA che vengono ruotate periodicamente.
Quindi, ecco la mia pazza idea:
Su qualsiasi app Web nella rete che richiede l'autenticazione dell'utente, chiedere all'utente finale di fornire il proprio nome utente sulla rete, nonché la propria chiave pubblica. Avere il servizio di autenticazione dell'app Web verificare che questa chiave pubblica sia effettivamente già associata all'utente finale nel keystore della rete, quindi generare una richiesta utilizzando la chiave. Lato client, l'utente finale decrittografa la sfida utilizzando la propria chiave privata e presenta il risultato finale al server per l'autenticazione.
Ecco il kicker: un carico di servizi in questa rete sono implementati in JavaScript su NodeJS. Poiché NodeJS può chiamare servizi di sistema, posso scaricare il lavoro di generare sfide utilizzando le chiavi pubbliche per un processo più tradizionale. Ma, lato client, potrei aver bisogno di decifrare la sfida nel browser usando la chiave privata.
Ottenere la chiave privata nel browser è abbastanza facile. Se caricare o meno la chiave privata in un browser è anche una buona idea è un'altra domanda, interamente.
Ma, più precisamente:
- C'è qualche sfolgorante "Oh, non farlo!" difetti di sicurezza nella configurazione riassunta sopra?
- Quali sono alcuni pacchetti standard usati in Linux per generare sfide usando una chiave pubblica RSA?
- Qualcuno sa di un buon pacchetto per decifrare i messaggi usando una chiave RSA pubblica implementata in JavaScript ?