Come si gestiscono dati sensibili quando si utilizza Github e Heroku?

48

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

Se usi Heroku per ospitare la tua applicazione, devi far controllare il tuo codice in un repository Git. Se lavori su un progetto open-source, è più probabile che condividerai questo repository su Github o altri host Git.

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

Come lavorare con questo caso d'uso?

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

    
posta Jonas 03.09.2012 - 19:07
fonte

4 risposte

29

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

(Il seguente esempio e la mia intera risposta riguardano app di rails)

$ 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 sono archiviate nel repository git. (Nota. Quando esegui l'app localmente, imposta questi valori nel tuo file .bashrc

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

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

    
risposta data 09.01.2013 - 19:09
fonte
17

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

Obfuscation (solo per il codice)

Per le parti del codice che vuoi nascondere, potresti metterle in un progetto diverso, compilarle e controllare solo il codice compilato, non la fonte? Questa è la non crittografia e non adatta alla crittografia di password o chiavi. Le persone possono ancora decodificare il codice compilato, ma non ottengono la fonte.

Deposito GIT privato

Deve essere un repository git pubblico ?

Archiviazione server

È possibile memorizzare queste informazioni in un file protetto nella directory home dell'account utente in 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, potrebbe essere usata una variabile d'ambiente. È necessario da qualche parte sul server per memorizzare qualche tipo di chiave, o non c'è modo di proteggere nulla.

Crittografia simmetrica (solo per te)

Se sei l'unico sviluppatore, puoi inserire una chiave sul server e avere la stessa chiave sul tuo computer e utilizzare uno schema di crittografia simmetrica per proteggere alcuni dati come una password o un certificato. Condividere una chiave simmetrica con gli amici diventa complicato.

Crittografia asimmetrica (per più sviluppatori)

Se altri sviluppatori hanno bisogno di controllare cose segrete in un repository git pubblico, la crittografia a chiave pubblica / privata (asimmetrica) è stata creata per questo genere di cose. Installa una chiave privata sul tuo server (non controllarla nel controllo del codice sorgente!) E genera una chiave pubblica da esso. Cripta i tuoi dati segreti usando la chiave pubblica del server. Solo il server può decodificare i dati utilizzando 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ò decodificarli.

Strumento

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 di chiusura

Se il "server" è un server web che utilizza https, allora dovresti già avere un keystore sicuro di qualche tipo sul server per memorizzare la chiave privata. È una specie di strabiliante che una società di hosting non prendere indennità per questo. Forse hanno qualche suggerimento su come gli altri risolvono la sfida che stai affrontando?

    
risposta data 05.09.2012 - 16:09
fonte
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 tuo progetto è open source ma non vuoi condividere i dettagli di hosting, devi mantenere un fork privato del tuo progetto ai fini della distribuzione.

    
risposta data 04.09.2012 - 04:42
fonte
6

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

Invece, le password, le chiavi crittografiche, ecc. dovrebbero essere tenute separate dal codice. Memorizzali in un file di configurazione separato o in un valore di configurazione che viene letto dal codice. Non è necessario memorizzarli in git.

Importante: Non inserire mai chiavi di crittografia, password o altri segreti nel codice sorgente! Questa è una pessima pratica.

Vedi anche:

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

    
risposta data 09.01.2013 - 23:29
fonte

Leggi altre domande sui tag