Attualmente sto costruendo un'applicazione la cui unica vera complessità risiede nella sicurezza della chiave privata. Non mi sento a mio agio nel mantenere la chiave privata nell'immagine del disco, da cui il server l'avrebbe letta, quindi ho pensato di creare un "servizio di firma" dedicato che ascolta una connessione in ingresso all'avvio, da cui ricevere la chiave privata su HTTPS da un server offline, che sarà brevemente connesso a internet, al fine di inviare la chiave privata al servizio web. Questo servizio simulerebbe, in pratica, un Hardware Security Module (HSM), ma a costo di una cloud VM, che è una frazione di quella di un HSM.
Oltre a questo, il servizio di firma, che riceve la chiave privata in questo modo, esporrà un'interfaccia sicura, piuttosto che un'interfaccia che consente di firmare messaggi arbitrari. Quindi, ad esempio, il servizio potrebbe essere impostato per esporre un'interfaccia che accetta un elenco di transazioni che pagano a un insieme predefinito di "indirizzi di ricezione", e quindi il servizio restituirebbe una transazione firmata che sposta il valore da tutti questi ricevono gli indirizzi sulla chiave privata che controlla.
In altre parole, la chiave privata risiede nello spazio di memoria dell'applicazione che espone solo un'interfaccia sicura, richiedendo quindi che un utente malintenzionato comprometta la VM su cui è in esecuzione questa applicazione e legge la chiave privata dallo spazio di memoria del processo di applicazione. Penetrare l'ambiente cloud, quindi, non causerebbe la perdita della chiave privata o consentirebbe all'utente malintenzionato di firmare messaggi arbitrari.
Domande:
- Questo approccio ha senso? Offre un guadagno in sicurezza?
- Quali problemi relativi alla sicurezza devo sapere quando invio la chiave privata al servizio web?
- IP correlato: il programma che invia la chiave privata al servizio web invierà in base all'indirizzo IP del servizio web. Quanto sarebbe difficile per un utente malintenzionato ricevere questi dati, destinati al servizio? Devo impostare una VPN tra la rete da cui verrà inviata la chiave e l'ambiente cloud?
- Google Cloud ha un servizio di bilanciamento del carico HTTPS , che puoi dare Chiave privata HTTPS, e siederà davanti alla tua app e mescolerà le richieste ad essa, mettendo Google a capo dell'autenticazione delle VM in esecuzione nell'ambiente cloud (da cui il nostro servizio di firma riceverà la chiave privata). Quindi, se 1) ci connettiamo all'IP del servizio di firma (per armarlo con la chiave privata) e 2) verificate che il certificato sia autentico, significherebbe che un utente malintenzionato dovrebbe compromettere il servizio proxy HTTPS di Google Cloud per ricevere la chiave privata, di 1) man-in-the-middling la connessione destinata alla VM e 2) utilizzando la chiave privata detenuta da Google Cloud per firmare la richiesta HTTPS come autentica. Questo avrebbe senso come un modo per esternalizzare la sicurezza delle chiavi private? (Il furto della chiave privata potrebbe anche verificarsi dall'attaccante che esegue la propria immagine disco nel nostro ambiente cloud, che invia semplicemente la chiave privata ricevuta a se stesso, ma ciò potrebbe essere evitato richiedendo l'esecuzione di immagini disco nel nostro ambiente cloud con una chiave anche mantenuto offline (ad esempio nello stesso posto della chiave privata del servizio di firma))
Quindi, l'HSM (la VM che esegue il servizio di firma) 1) espone un'interfaccia sicura per la firma dei messaggi e 2) mantiene la chiave privata nello stesso spazio di memoria della logica che ne limita l'uso. Amazon AWS HSM costa circa $ 10.000 all'anno, quindi questo, in effetti, simulerebbe tale dispositivo a una frazione del costo (purché sia sicuro).