La mia situazione è che ho bisogno di memorizzare dati sensibili in un database per un'applicazione web. I dati sensibili includono cose come token di aggiornamento per i sistemi Oauth2, chiavi segrete per altre API ecc.
Sto cercando di costruire questo presupponendo che un utente malintenzionato abbia già accesso al server e possa vedere i file binari che eseguono l'applicazione (nessun codice sorgente sul server), le variabili di ambiente e i database ecc.
Quindi sostanzialmente la cosa che sto cercando di proteggere da qui è che un utente malintenzionato può leggere le informazioni sensibili dal database.
Per far ciò suppongo di dover crittografare i dati prima di archiviarli nel database, ma questo mi ha lasciato il problema di come fornire l'applicazione web con le chiavi per crittografare e decrittografare i dati in primo luogo.
Se un utente malintenzionato ha già accesso al server, le variabili di ambiente, i file di configurazione e persino altri server che l'applicazione può rendere richieste HTTP sembrano inutili perché l'autore dell'attacco potrebbe semplicemente fare le stesse cose che l'applicazione fa per richiedere le chiavi comunque.
Quindi, da quello che posso capire implementando un flusso di lavoro in cui l'applicazione richiede che le chiavi non funzionino. Invece ho bisogno di un flusso di lavoro in cui l'applicazione è data le chiavi invece.
Inizialmente pensavo di poter inserire le chiavi manualmente all'avvio dell'applicazione e tenerle in memoria, ma il problema è che avrei bisogno di intervenire manualmente per avviare ogni istanza dell'applicazione. Idealmente voglio che la startup sia automatizzata il più possibile, il che significherebbe dare le chiavi a qualche tipo di script o qualcosa del genere, nel qual caso sono tornato al punto di partenza.
Finora l'unico modo in cui sono arrivato a fornire l'applicazione con i tasti in qualche modo in modo automatico è implementare un endpoint di qualche tipo che può essere POST
con i tasti.
L'idea è che avvii l'applicazione sul server, ma l'applicazione rifiuta tutte le richieste perché non ha ancora le chiavi. Le chiavi sono memorizzate su una macchina separata da qualche parte; questa macchina potrebbe essere in ufficio o in un altro server, ecc.
La macchina con le chiavi quindi POST
s all'endpoint dell'applicazione per assegnarle le chiavi su una connessione HTTPS e l'applicazione memorizza le chiavi in memoria fino a quando non viene riavviata, a quel punto avrà bisogno delle chiavi POST
ed ad esso di nuovo.
Una volta fornite le chiavi, l'applicazione accetterà richieste come normali e interromperà l'endpoint che ha accettato le chiavi.
Ciò significa che un utente malintenzionato potrebbe trovare l'endpoint e provare POST
inserendo le chiavi direttamente, ma è altamente improbabile che forniscano comunque le chiavi corrette e anche se l'applicazione accetta le chiavi nella piccola finestra di tempo dove l'endpoint sarebbe disponibile i dati decrittografati sarebbero comunque incomprensibili.
Quindi ora le mie domande sono, sto pensando troppo a questo, e c'è un modo migliore, standard nel settore, di fornire le chiavi a un'applicazione web allo scopo di crittografare / decifrare i dati in un database?
Se non c'è un metodo concordato per farlo, la mia idea sarebbe fattibile e che tipo di cose sto trascurando potrebbe effettivamente indebolire la sicurezza invece di rafforzarla?