Memorizzare la chiave privata asimmetrica nel binario dell'applicazione?

12

Vorrei dare a un processo in stile demone (cioè nessuna interazione dell'utente) l'accesso a una chiave segreta condivisa in modo che possa accedere a un file di dati crittografato condiviso. Le applicazioni utente che accedono agli stessi dati crittografati memorizzano la chiave segreta condivisa nel portachiavi del sistema operativo dell'utente (ad esempio, Keychain OS X o Gnome Keyring, ecc.). Il portachiavi del sistema operativo, a sua volta, protegge la chiave segreta con la password di accesso dell'utente (o altra specifica dell'utente).

La crittografia qui viene utilizzata per proteggere i dati mentre transita nelle reti pubbliche tra server e client. I dati in questione sono dati grezzi da esperimenti scientifici. Per lo più non prezioso (vale a dire improbabile che un utente malintenzionato possa interrompere la crittografia e sfogliare i dati), ma alcuni di essi sono potenzialmente molto preziosi e gli utenti desiderano mantenere i propri dettagli privati finché non decidono di condividerli pubblicamente (ad es. da osservatori casuali sulla rete). Il valore dei dati è difficile da determinare senza analisi scientifiche, quindi osservare l'attività degli utenti (incluse le query) mentre transitano sul cavo non crittografato fornisce alcuni indizi agli osservatori sul valore di un dato.

Il processo daemon è un server di query per il sistema. Legge dai dati condivisi, elabora una query e restituisce identificatori per un set di risultati al client che quindi estrae i dati identificati dall'archivio condiviso.

Consentiamo la sincronizzazione dei dati crittografati con le workstation / portatili locali degli utenti, quindi la crittografia dei dati su disco è tutt'al più un fastidio per un determinato utente malintenzionato. Noi anche consentiamo agli utenti di eseguire il server di query localmente (ancora avviato da init.d / launchd), quindi voglio fare tutto il possibile per proteggere la chiave segreta archiviata con il demone. Il rischio maggiore è che un determinato utente malintenzionato sia in grado di scoprire la chiave segreta dal demone sul proprio sistema. L'esposizione di quella chiave richiederebbe la modifica della chiave, l'aggiornamento di tutti gli utenti e la successiva crittografia del database.

Qual è il modo migliore per memorizzare la chiave segreta condivisa per il processo demone? Posso mettere la chiave sul disco e crittografare il file su disco, ma il processo daemon deve quindi avere la chiave per decrittografarlo. Ciò sembra equivalente alla semplice condivisione della chiave segreta per i dati crittografati originali. Il mio approccio ingenuo sarebbe quello di memorizzare la chiave nel binario dell'applicazione, ma non riesco a immaginare che sia l'opzione migliore. Qualche consiglio?

    
posta Barry Wark 18.01.2011 - 19:12
fonte

5 risposte

12

Questo si trasforma rapidamente in un problema di "tartarughe fino in fondo". Devi solo decidere a che punto smettere di crittografare le cose e fare affidamento su un altro metodo. Penso che l'obiettivo dovrebbe essere quello di fermare gli utenti occasionali, ma non determinati hacker, per ottenere facilmente i dati protetti.

Ho combattuto con un metodo simile in un'applicazione web che doveva memorizzare la password del DB e la password del certificato SSL. Quello che ho finito è stato crittografare quelle password in un file di configurazione per l'app utilizzando una diversa password principale. La password principale è stata memorizzata come variabile di ambiente impostata dallo script di avvio dell'applicazione. Poiché la password principale è stata impostata solo nello script di avvio, è stato abbastanza semplice consentire a un singolo utente di accedere allo script insieme alla possibilità di eseguirlo utilizzando le autorizzazioni standard dei file UNIX.

Il mio pensiero era che per ottenere l'accesso a questo script in caso contrario, era necessario essere già root, a quel punto, non importa. Se non ti puoi fidare di root (o il server è stato violato) probabilmente hai altri problemi.

Inoltre, c'è un po 'di sicurezza attraverso l'oscurità qui in quanto tutti i dettagli di come funziona non sono documentati molto bene di proposito. Dovresti eseguire il backtrace su come funziona lo script di avvio, quindi capire quale algoritmo è utilizzato, come viene formattato il sale + plantext, ecc. Se vuoi ottenere la password del DB e arrivare così lontano, immagino che probabilmente potresti già avere solo suddiviso direttamente nel server DB.

    
risposta data 18.01.2011 - 22:12
fonte
7

Come al solito, il miglior punto di partenza è ponendoti alcune domande: qual è il tuo modello di minaccia? Cosa stai cercando di proteggere? Con chi stai cercando di proteggerlo? Perché stai usando Crypto in primo luogo? Nessuno di questi è chiaro dalla domanda. (Crypto non è una polvere magica da folletto.) E senza risposte a queste domande, non possiamo darti una soluzione: la soluzione giusta dipenderà da ciò che stai cercando di ottenere.

In generale non ci sarà una grande soluzione a questo problema. La chiave privata avrà un testo in chiaro da qualche parte sul disco (o in equivalente in chiaro), se si desidera essere in grado di avviare il sistema senza il coinvolgimento dell'utente. Colpisci rapidamente "tartarughe fino in fondo", come altri hanno suggerito.

Un passo che puoi fare è assicurarti che la chiave privata sia protetta dai controlli di accesso al filesystem: ad es., è leggibile da root ma non dagli utenti ordinari.

Nota a margine: esistono approcci sofisticati, ma probabilmente non sono adatti al tuo ambiente a basso costo. (1) Un altro approccio sicuro è quello di memorizzare la chiave privata in un modulo di sicurezza hardware collegato al server. Se il server viene compromesso, il software non può rubare la chiave privata (ma può ancora istruire il modulo di sicurezza hardware per firmare / decrittografare messaggi arbitrari). (2) Un approccio più sofisticato consiste nell'utilizzare un TPM e nel bloccare la chiave privata in un particolare software. Sfortunatamente gli attuali SO non forniscono un buon supporto per questo, quindi sarebbe molto impegnativo fare te stesso come amministratore di sistema: richiederebbe un supporto significativo per gli sviluppatori.

    
risposta data 19.01.2011 - 08:16
fonte
1

Non c'è un portachiavi disponibile per l'account per il demone?

    
risposta data 18.01.2011 - 19:23
fonte
1

Per completezza, la soluzione che abbiamo scelto era una combinazione delle risposte di @SteveSyfuhs e @ AngerClown. Su OS X, stiamo facendo uso del portachiavi di sistema ( /Library/Keychains/System.keychain ). Su Linux, stiamo memorizzando la chiave di crittografia in un file con i bit di autorizzazione 400 (cioè di sola lettura solo dal proprietario), di proprietà di root.

    
risposta data 23.01.2011 - 04:32
fonte
1

Barry, mi piace la tua soluzione e ho un'idea per fare un ulteriore passo avanti. Che ne dici di mantenere l'immagine della macchina che usi per creare nuove macchine impostate automaticamente sull'utilizzo di 400 sul file chiave, quindi all'avvio avvia il software del server come root, leggi la chiave in memoria, elimina la chiave, quindi cambia utente che esegue il software del server su un account non di root.

    
risposta data 29.09.2011 - 06:00
fonte

Leggi altre domande sui tag