2013-03-04 9 views
29

Für das Leben von mir habe ich überall gesucht und habe die Antwort nicht gefunden. Ich hoffe, ich poste kein Duplikat.Wo geheime Schlüssel zu speichern DJANGO

Es wird überall empfohlen, dass Sie Ihre geheimen Schlüssel in einer separaten Datei von Ihrem allgemeinen settings.py aufbewahren sollten. Außerdem sollten Sie Ihre "secret.py" -Datei, die Schlüssel wie SECRET_KEY, AWS_SECRET_KEY usw. enthält, niemals festschreiben.

Meine Frage ist: In Ihrem Produktionsserver müssen Sie Ihre geheimen Schlüssel referenzieren, das bedeutet, dass Ihre "secret.py" Einstellungsdatei irgendwo auf dem Server leben sollte, oder? Wenn ja, wie schützen Sie Ihre geheimen Schlüssel in der Produktion?

Antwort

18

Es gibt einige Optionen für die Produktion. Ich setze meine sensiblen Datenvariablen als Umgebungsvariablen in den Produktionsumgebungen ein. Dann rufe ich die Variablen in den settings.py über os.environ.get() wie so:

secret_KEY=os.environ.get('secret_KEY') 

Eine weitere mögliche Option ist in der secret.py Datei über Ihren deploy Skript zu kopieren.

Ich bin sicher, es gibt auch andere spezifische Optionen für verschiedene Webserver.

+2

Für Linux: http://unix.stackexchange.com/questions/21598/how-doi-i-set-a-user-environment-variable-permanently-not-session. Für mein Beispiel oben würden Sie 'export secret_KEY = 'ABABABABABDSFJKEWLSK' in Ihrem' .bash_profile', '.bash_login' oder' .profile' hinzufügen - je nachdem, welches existiert. –

+0

Ich habe meinen geheimen Schlüssel in .bash_profile verschoben und os.environ.get benutzt, und es hat meine Seite total zerstört, obwohl 'echo $ SECRET_KEY' gut funktioniert hat. – swizzard

+2

Das ist schlecht für die Sicherheit: Umgebungsvariablen des Prozesses können von anderen Benutzern gelesen werden. –

6

Sie sollten Ihre Einstellungen modular speichern. Damit meine ich, Ihre Einstellungen auf mehrere Dateien zu verteilen.

Zum Beispiel können Sie base_settings.py haben, um alle Ihre Grundeinstellungen zu speichern; dev_settings.py für Ihre Entwicklungsservereinstellungen; und schließlich prod_base_settings.py für alle Produktionseinstellungen. Alle Nicht-Basiseinstellungsdateien werden alle Basiseinstellungen importieren und dann nur ändern, was notwendig ist:

# base_settings.py 
... 

# dev_settings.py 
from base_settings import * 
DEBUG = TRUE 
... 

# prod_base_settings.py 
from base_settings import * 
DEBUG = FALSE 
... 

Dieser Ansatz ermöglicht es Ihnen, verschiedene Einstellungen aus verschiedenen Setups zu haben. Sie können auch alle diese Dateien festschreiben, nur dann können Sie auf dem Produktionsserver die eigentliche Produktionseinstellungsdatei prod_settings.py erstellen, in der Sie alle sensiblen Einstellungen angeben. Diese Datei sollte nicht überall begangen werden und deren Inhalt sicher aufbewahrt:

# prod_settings.py 
from prod_base_settings import * 
SECRET_KEY = 'foo' 

Wie für die Dateinamen können Sie, was Sie Dateinamen entsprechenden fühlen, sind verwenden. Ich persönlich erstellen eigentlich ein Python-Paket für die Einstellungen und dann halten die verschiedenen Einstellungen in der Verpackung:

project/ 
    project/ 
    settings/ 
     __init__.py 
     base.py 
     dev.py 
     ... 
    app1/ 
    models.py 
    ... 
    app2/ 
    models.py 
    ... 
+0

Vielen Dank für Ihre Antwort. Ich habe jedoch untersucht, wie man diese Schlüssel schützt. – nitochi

+6

Indem Sie alle geheimen Einstellungen in der separaten Datei haben, schützen Sie sie. Es schützt nur dann nicht, wenn der Server gehackt wird, wo die Datei kompromittiert wird. Aber in diesem Fall sind Umgebungsvariablen nur verwundbar, wie jede andere Methode, die ich kenne. Es gibt Methoden, um solche Informationen vollständig zu sichern, aber alle involvieren einen Dritten, der die sicheren Daten speichert, und dann kann Ihr Server sie nach den Informationen fragen, aber um sie sicher zu machen, werden diese Dienste Ihnen bei jeder Anfrage eine Benachrichtigung senden, wo Sie sie haben um die Anfrage zu validieren, damit sie nicht vollständig automatisiert sind. – miki725

4

statt if/then Logik Sie ein Werkzeug für Ausklammern sensible Daten entworfen verwenden sollten. Ich benutze YamJam https://pypi.python.org/pypi/yamjam/. Es bietet alle Vorteile der os.environ-Methode, ist aber einfacher - Sie müssen diese Umgebungsvariablen immer noch festlegen, Sie müssen sie irgendwo in ein Skript einfügen. YamJam speichert diese Konfigurationseinstellungen in einem Computerkonfigurationsspeicher und ermöglicht außerdem das Überschreiben eines Projekts nach Projekt.

from YamJam import yamjam 

variable = yamjam()['myproject']['variable'] 

ist die grundlegende Verwendung. Und wie die Methode os.environ ist es nicht Framework-spezifisch, Sie können es mit Django oder einer anderen App/Framework verwenden. Ich habe sie alle ausprobiert, mehrere settings.py-Dateien, spröde Logik von if/then und Umgebungsgerangel. Am Ende bin ich zu Jamie gekommen und habe es nicht bereut.

4

Ich weiß, dass es eine lange Zeit war, aber ich habe nur eine kleine Django-App geöffnet, die ich benutze, um einen neuen geheimen Schlüssel zu erzeugen, wenn er noch nicht existiert. Es heißt django-generate-secret-key.

pip install django-generate-secret-key 

Dann, wenn die Bereitstellung/Bereitstellung eines neuen Servers mein Django-Projekt ausgeführt wird, laufe ich den folgenden Befehl ein (von ansible):

python manage.py generate_secret_key 

Es ist einfach:

  • prüft, ob ein geheimer Schlüssel muss generiert werden
  • generiert es in einer secretkey.txt Datei (kann angepasst werden)

Alles, was Sie brauchen, dann in Ihre Einstellungsdatei zu haben ist:

with open('/path/to/the/secretkey.txt') as f: 
    SECRET_KEY = f.read().strip() 

können Sie jetzt von einem vollautomatischen Provisioning-Prozess profitieren, ohne eine statische geheimen Schlüssel in Ihrem Repository mit speichern.

+0

Hmm, mit dem neuesten Django (1.11) bekomme ich: 'FileNotFoundError: [Errno 2] Keine solche Datei oder kein Verzeichnis: '/ home /.../ project/secretkey.txt'' –

+0

@BabkenVardanyan hast du' python manage 'ausgeführt. py generate_secret_key' zuerst? Wenn die Datei nicht erstellt wurde oder etwas nicht in Ordnung ist, öffnen Sie bitte ein Problem: https://github.com/MickaelBergem/django-generate-secret-key/issues/new, damit wir darüber sprechen können –

Verwandte Themen