2013-03-10 15 views
29

Io uso Python e Django per creare applicazioni web, che memorizziamo nel controllo del codice sorgente. Normalmente il modo in cui Django è impostato, le password sono in chiaro nel file settings.py.Python/Django - Evita di salvare le password nel codice sorgente

Memorizzare la mia password in testo normale mi aprirebbe a una serie di problemi di sicurezza, in particolare perché questo è un progetto open source e il mio codice sorgente sarebbe controllato in versione (tramite git, su Github, per il mondo intero a vedere !)

La domanda è: quale sarebbe la migliore procedura per scrivere in modo sicuro un file settings.py in un ambiente di sviluppo Django/Python?

risposta

35

Anche se non sono riuscito a trovare nulla di specifico su Python su stackoverflow, ho trovato uno website that was helpful e ho pensato di condividere la soluzione con il resto della comunità.

La soluzione: variabili di ambiente.

Nota: Sebbene le variabili di ambiente siano simili sia in Linux/Unix/OS X che nei mondi Windows, non ho testato questo codice su una macchina Windows. Perfavore fammi sapere se funziona.

nella shell bash/sh, Tipo:

export MYAPP_DB_USER='myapp' 
export MYAPP_DB_PASSWORD='testing123' 

E nel file settings.py Django:

DATABASE_USER = os.environ.get("MYAPP_DB_USER", '') 
DATABASE_PASSWORD = os.environ.get("MYAPP_DB_PASSWORD", '') 

In questo caso, il nome utente e la password di default sarebbe una stringa vuota se la variabile di ambiente non esistesse.

+6

... e, il file con le password impostate su .gitignore –

+0

Il libro Due scoop di Django fornisce un codice per generare un'eccezione nel caso in cui le variabili di ambiente non esistano nel capitolo 5: https: // django .2scoops.org/ –

+1

In particolare, vedi il codice Due scoop [sul loro github] (https://github.com/twoscoops/django-twoscoops-project/blob/master/project_name/project_name/settings/production.py) –

0

Anche se le variabili d'ambiente sono convenienti per un sacco di configurazione, mettendo le password in variabili d'ambiente è notsecure. Con l'alternativa essendo un file di configurazione esterno regolare il controllo di versione, ecco alcuni diversi svantaggi:

  • variabili d'ambiente potrebbero accidentalmente fuoriuscire (attraverso canali di debug che potrebbe avere trasmessi via testo in chiaro, agli utenti finali, o per luoghi inaspettati nel filesystem come ~ /.* sh_history).

  • I file di configurazione potrebbero accidentalmente essere aggiunti al controllo di versione e finire in archivi accessibili a persone senza privilegi di implementazione.

Leggi il post Environment Variables Considered Harmful for Your Secrets per più argomenti: L'ambiente è accessibile a tutto il processo, è ereditato da bambino (e possibilmente 3rd-party) processi, e non esiste una chiara assunzione tra gli sviluppatori esterni per il trattamento di ambiente variabili confidenziali.

Il formato di file di configurazione più semplice in Python è semplicemente a Python module.

Problemi correlati