Il tuo servizio non deve essere eseguito come root
in generale . Utilizzare un utente separato per archiviare il segreto è una precauzione saggia, ma la memorizzazione di file con proprietà root
non è migliore per la segretezza rispetto all'utilizzo di un altro utente dedicato per questo. Finché il tuo file segreto ha le autorizzazioni 600
o meno, sarà al sicuro da altri utenti non root
. Qualunque cosa che esegue root
ha comunque accesso completo. (a meno che tu non stia eseguendo alcune complicate impostazioni di SELinux)
Potrebbe essere utile per utilizzare due utenti per questa singola applicazione per isolare la gestione segreta dal normale funzionamento. O avere due demoni in esecuzione con comunicazioni in tempo reale o avere comandi di utilità per operare sul segreto, ottenendo il privilegio necessario (utente o gruppo) tramite sudo
.
Dovresti considerare i potenziali vettori di attacco.
-
SQLi se configurato correttamente non garantisce l'accesso al filesystem, ma gli attacchi Path Traversal potrebbero. Esistono altri tipi di attacchi alla tua applicazione ai quali dovresti essere protetto.
-
Gli exploit nelle librerie C (ad esempio OpenSSL con la crittografia HTTPS, l'elaborazione delle immagini, ecc.) potrebbero essere possibili. L'utilizzo di un utente separato sui processi esposti in rete può aiutare a limitare l'ambito o aggiungere difficoltà a un attacco.
-
Le interruzioni da altri vettori di attacco potrebbero essere un problema. (SSH, altri servizi sulla macchina) Assicurati che qualsiasi cosa con il potenziale di accesso root
sia ben protetta.
Tutte queste considerazioni dovrebbero aiutarti a proteggere il segreto stesso. Ora la domanda è, il segreto deve davvero essere archiviato in modo semplice?
Al livello più elementare, sì, il segreto deve essere memorizzato da qualche parte perché sia utilizzabile. Almeno deve essere memorizzato in memoria, ma è necessaria anche una memorizzazione permanente di qualche tipo.
Oltre alla separazione degli utenti di cui abbiamo discusso, potrebbe essere utile scaricare i segreti su un modulo di sicurezza hardware separato o persino su un mini-computer separato. (es. Raspberry Pi) Esiste qualche discussione sulla separazione fisica qui .
Ci sono pochissimi casi in cui il segreto può essere crittografato nella memoria permanente.
Se la tua preoccupazione è il furto del disco rigido, (lasciando il resto della macchina dietro), potresti avere uno script di avvio che interroga qualcun altro dell'hardware per identificatori univoci , e deriva un chiave di crittografia utilizzando una buona funzione di derivazione chiave basata su password; per decifrare il segreto.
Se il cliente può fornire una parte del segreto, sarebbe utile. Ho delineato un modo per ricava chiavi di decrittografia da password utente e token di sessione qui . Questo è un sistema elaborato ma efficace che si concentra sulla limitazione della quantità di tempo in cui un segreto è memorizzato, anche in memoria. (supponendo che non sia necessario un reset automatico della password)