61

Io lavoro su alcune app in binari, django (e un po 'di php), e una delle cose che ho iniziato a fare in alcune di esse è la memorizzazione di database e altre password come variabili di ambiente piuttosto che di testo normale in determinate configurazioni file (o in settings.py, per le app di django).È sicuro archiviare le password come variabili di ambiente (anziché come testo normale) nei file di configurazione?

Discutendo di questo con uno dei miei collaboratori, ha suggerito che si tratta di una cattiva pratica - che forse questo non è perfettamente sicuro come potrebbe sembrare a prima vista.

Quindi, mi piacerebbe sapere - è una pratica sicura? È più sicuro archiviare le password come testo normale in questi file (assicurandosi, ovviamente, di non lasciare questi file in archivi pubblici o altro)?

+4

Heroku impone di ottenere le password del database dai vars dell'ambiente: devono aver considerato questi rischi indicati qui ma sembra ancora essere l'opzione vincente. –

+0

Come stai caricando la variabile ambientale? Proviene da un file? – jsarma

+0

La mia vecchia verifica su questa domanda: http://security.stackexchange.com/questions/20282/is-passing-sensitive-data-through-the-process-environment-secure/ –

risposta

25

Ad un livello più teorico, tendo a pensare a livelli per la sicurezza nei modi seguenti (in ordine crescente di forza):

  • Nessuna sicurezza. Testo normale Chiunque sappia dove guardare, può accedere ai dati.
  • Sicurezza con offuscamento. Memorizzi i dati (testo in chiaro) in un posto complicato, come una variabile d'ambiente, o in un file che ha l'aspetto di un file di configurazione. Un hacker finirà per capire cosa sta succedendo o inciampare su di esso.
  • Protezione fornita dalla crittografia che è banale da interrompere, (si pensi al cesare!).
  • Protezione fornita dalla crittografia che può essere interrotta con un certo sforzo.
  • Protezione fornita dalla crittografia che non è pratico da interrompere in base all'hardware corrente.
  • Il sistema più sicuro è uno che non può usare! :)

Le variabili d'ambiente sono più sicuro di file di testo in chiaro, perché sono volatili/usa e getta, non salvato; Ad esempio, se si imposta solo una variabile di ambiente locale, ad esempio "imposta pwd = qualunque", e si esegue lo script, con qualcosa che esce dalla shell dei comandi alla fine dello script, la variabile non esiste più. Il tuo caso rientra nei primi due, che direi piuttosto insicuro. Se si dovesse fare ciò, non raccomanderei l'implementazione al di fuori della rete Intranet/home, e solo a scopo di test.

+1

E dov'è il confronto tra variabili di ambiente e file di solo testo? – KillianDS

+0

Direi che il testo semplice è "Nessuna sicurezza", e l'utilizzo delle variabili di ambiente è "Per offuscamento": in pratica li metti da qualche parte dove le persone probabilmente non guardano, o potrebbero non riconoscerle come password, ma se lo fanno 're hosed. –

+0

Interessante. Grazie mille per questa risposta. Quindi le variabili di ambiente non sono molto meglio del testo normale, quindi? – jay

29

Ogni volta che si memorizza una password, non è sicuro. Periodo. Non c'è modo di memorizzare una password non crittografata in modo sicuro. Ora quale delle variabili di ambiente rispetto ai file di configurazione è più "sicuro" è forse discutibile. IMHO, se il tuo sistema è compromesso, non importa dove è memorizzato, un hacker diligente può rintracciarlo.

+7

Per le variabili d'ambiente, mi aspetto unix qui ... Variabili d'ambiente sono molto meno sicuri dei file. Chiunque può controllare l'ambiente di un processo in esecuzione, ma i file possono almeno avere ACL. – Vatine

+7

Dato che lo sviluppatore deve memorizzare queste password, questa non è una risposta straordinariamente utile. Dove suggerisci che li conservi? –

+1

@PeterNixey: questo è il punto. Se lui * ha * per immagazzinarli, allora li può immagazzinare ovunque gli piaccia. Potrebbe anche renderlo il sysmessage all'accesso. Insicuro non è sicuro. Una volta che hai gettato la sicurezza fuori dalla finestra, è un campo aperto. –

40

Come menzionato in precedenza, entrambi i metodi non forniscono alcun livello aggiuntivo di "sicurezza" una volta che il sistema è stato compromesso. Credo che uno dei motivi più forti per favorire le variabili di ambiente è il controllo della versione: ho visto troppe configurazioni del database, ecc. Che sono accidentalmente memorizzate nel sistema di controllo della versione come GIT per ogni altro sviluppatore da vedere (e whoops! È successo anche a me ...).

Non memorizzare le password nei file rende impossibile la loro memorizzazione nel sistema di controllo delle versioni.

+4

Un'alternativa abbastanza ragionevole per * non * memorizzare le impostazioni di configurazione segrete nel controllo versione è archiviarle in un repository di controllo versione o in un progetto * separato * dal repository per il codice. –

+0

@KennyEvitt che lascia ancora le password non sicure, in chiaro, in una posizione condivisa che chiunque abbia accesso al repository può trovare e nessun modo per tracciare chi ha effettuato l'accesso. – FistOfFury

+1

@FistOfFury Certo, chiunque abbia accesso al repository ... può accedere al repository. Il punto di memorizzazione dei segreti in un repository * separato * è esattamente tale da poter controllare l'accesso a quei segreti in modo diverso rispetto al codice stesso. Ma i repository possono essere protetti, ad es. è possibile memorizzare i segreti crittografati nella 'posizione condivisa'. E potresti persino tenere traccia delle informazioni sull'accesso al repository nella posizione condivisa. Ma, naturalmente, consentire a chiunque di accedere a informazioni implica che possono copiare tali informazioni e quindi accedervi in ​​qualsiasi momento in futuro senza restrizioni o tracciamento. –

18

Mi spiace di non averne abbastanza per commentare, ma volevo anche aggiungere che se non stai attento, la tua shell potrebbe catturare quella password nella sua cronologia dei comandi.Quindi eseguire qualcosa come $ pwd=mypassword my_prog manualmente non è così effimero come si poteva sperare.

+5

se si antepone l'intero "comando env var +" con uno spazio, quindi non viene memorizzato nella cronologia – shadi

+0

grazie a @shadi. Impara qualcosa di nuovo ogni giorno! Mi chiedo se questo è specifico di shell/facile da disattivare o se è qualcosa che ci si può aspettare abbastanza coerentemente? – brianclements