Come si gestiscono i dati sensibili quando si utilizzano Github e Heroku?


49

Non sono ancora abituato al modo in cui funziona Git (e mi chiedo se c'è qualcuno oltre a Linus;)).

Se usi Heroku per ospitare la tua applicazione, devi controllare il tuo codice in un repository Git. Se lavori su un progetto open source, avrai maggiori probabilità di condividere questo repository su Github o altri host Git.

Alcune cose non dovrebbero essere verificate nel repository pubblico; password del database, chiavi API, certificati, ecc ... Ma queste cose devono ancora far parte del repository Git poiché lo usi per inviare il tuo codice a Heroku.

Come lavorare con questo caso d'uso?

Nota: so che Heroku o PHPFog possono usare le variabili del server per aggirare questo problema. La mia domanda è più su come "nascondere" parti del codice.


3
Comincerei con l'utilizzo di un repository privato. Quindi, a seconda di quanto mi fidi, potrei .gitignore i miei file di configurazione che contengono i dati sensibili e li versione solo localmente. (Il locale è una posizione centrale non esterna che può essere un server interno o chissà)
Rig

Risposte:


30

Il metodo preferito per mantenere segrete le password / le chiavi api su heroku consiste nell'impostare i valori di configurazione tramite l'applicazione della riga di comando di heroku. Il seguente esempio tratto da un articolo del centro di sviluppo di heroku

(L'esempio seguente e la mia intera risposta si riferiscono alle app di rotaie)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Quindi fai riferimento a questi valori di configurazione nel tuo codice usando la variabile ENV []

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

In questo modo le tue password sensibili non vengono memorizzate nel repository git. (Nota: quando si esegue l'app localmente, impostare questi valori nel .bashrcfile

Inoltre, non sono sicuro del tipo di applicazione che stai eseguendo, ma in Rails, heroku non utilizza il tuo file database.yml, imposta semplicemente il nome utente / la password del database in base alle impostazioni dell'app. Quindi puoi evitare di salvare quelle credenziali in Git

Inoltre, se stai eseguendo la tua applicazione e vuoi che rimanga privata, un'ottima alternativa a github è bitbucket che offre repository privati ​​gratuiti.


17

Diverse idee ... La crittografia a chiave pubblica è la risposta più flessibile.

Offuscamento (solo per codice)

Per le parti del codice che vuoi nascondere, potresti inserirle in un altro progetto, compilarle e controllare solo il codice compilato, non l'origine? Questo è non è la crittografia e non adatto per la crittografia delle password o chiavi. Le persone possono ancora decodificare il codice compilato, ma non ottengono la fonte.

Repository GIT privato

Deve essere un repository git pubblico ?

Archiviazione server

È possibile memorizzare queste informazioni in un file protetto nella home directory dell'account utente con cui viene eseguita l'applicazione? Vorrei copiare il modo in cui ssh fa questo con ~ / .ssh / id_rsa e un chmod di 600. In caso contrario, è possibile utilizzare una variabile di ambiente. È necessario un punto del server per archiviare un tipo di chiave o non è possibile proteggere nulla.

Crittografia simmetrica (solo per te)

Se sei l'unico sviluppatore, potresti mettere una chiave sul server e avere quella stessa chiave sul tuo computer e utilizzare uno schema di crittografia simmetrica per proteggere alcuni dati come una password o un certificato. La condivisione di una chiave simmetrica con gli amici diventa confusa.

Crittografia asimmetrica (per più sviluppatori)

Se altri sviluppatori hanno bisogno di controllare cose segrete in un repository git pubblico, la crittografia a chiave pubblica / chiave privata (asimmetrica) è stata creata per questo tipo di cose. Installa una chiave privata sul tuo server (non controllarla nel controllo del codice sorgente!) E genera una chiave pubblica da esso. Crittografa i tuoi dati segreti usando la chiave pubblica del server. Solo il server può decodificare quei dati usando la sua chiave privata. Puoi persino controllare la chiave pubblica nel controllo del codice sorgente in modo che altre persone possano crittografare i dati utilizzando la stessa chiave pubblica e solo il server può decrittografarla.

Attrezzo

Openssl è probabilmente l'unico strumento di crittografia di cui avrai mai bisogno. Non scrivere il tuo algoritmo di crittografia o la tua implementazione di un algoritmo pubblicato.

Pensieri finali

Se il "server" è un web server che utilizza https, allora dovresti già avere un keystore sicuro di qualche tipo sul server in cui archiviare la chiave privata. È un po 'strabiliante che una società di hosting non tenga conto di Questo. Forse hanno qualche suggerimento su come gli altri risolvono la sfida che stai affrontando?


Per aggiungere, WRT allo storage lato server - Non so se puoi farlo con Heroku, ma ho visto configurazioni in cui uno script viene sparato dall'hook post-ricezione e / o qualcosa come Capistrano sul server di distribuzione per copiare il file del database di distribuzione nella posizione corretta. Ciò consente di mantenere completamente il file di database fuori dal repository e di disporre di un meccanismo automatico per garantire che tali informazioni siano ancora disponibili.
Shauna,

Anche i repository GIT privati ​​dovrebbero proteggere i dati sensibili. Nel caso in cui venga reso pubblico per caso per un po '. Inoltre, penso che la crittografia asimmetrica debba sempre essere utilizzata, anziché simmetrica. Non vedo alcun aspetto negativo, solo questo lato positivo: puoi persino lasciare le API da qualche parte per semplificare la crittografia di nuovi dati sensibili da codificare.
Tiberiu-Ionuț Stan,

7

Se vuoi eseguire il tuo codice su Heroku, devi darlo a loro - non puoi tenerlo "segreto" dal tuo provider di hosting.

Per quanto riguarda i repository Git pubblici, se il progetto è open source ma non si desidera condividere i dettagli di hosting, è necessario mantenere un fork privato del progetto ai fini della distribuzione.


1
Grazie, ma qual è il flusso di lavoro per questo?
Jonas,

6

Non dovresti nascondere parti del codice. La sicurezza del tuo sistema non dovrebbe fare affidamento sulla segretezza del codice; questo è noto come "sicurezza attraverso l'oscurità", che è disapprovato dagli esperti di sicurezza perché funziona molto male.

Invece, password, chiavi crittografiche, ecc. Dovrebbero essere mantenute separate dal codice. Memorizzarli in un file di configurazione separato o in un valore di configurazione letto dal codice. Non è necessario conservarli in git.

Importante: non codificare mai chiavi crittografiche, password o altri segreti nel codice sorgente! Questa è una brutta pratica.

Guarda anche:

Plug: IT Security.SE è un ottimo posto per porre domande sulla sicurezza!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.