2013-03-04 12 views
29

Na życie mnie szukałem wszędzie i nie znalazłem odpowiedzi. Mam nadzieję, że nie publikuję duplikatu.Gdzie przechowywać tajne klucze DJANGO

Zalecane jest, aby przechowywać tajne klucze w osobnym pliku z pliku ustawień ogólnych.py. Ponadto, nie powinieneś nigdy zatwierdzać pliku "secret.py", który zawiera klucze, takie jak SECRET_KEY, AWS_SECRET_KEY i tak dalej.

Moje pytanie brzmi: na serwerze produkcyjnym musisz odwołać się do tajnych kluczy, co oznacza, że ​​plik ustawień "secret.py" powinien znajdować się w pobliżu serwera? Jeśli tak, jak chronić swoje tajne klucze podczas produkcji?

Odpowiedz

18

Istnieje kilka opcji do produkcji. Sposób, w jaki to robię, polega na ustawieniu moich wrażliwych zmiennych danych na zmienne środowiskowe w środowiskach produkcyjnych. Potem pobierać zmienne w settings.py poprzez os.environ.get() tak:

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

Innym możliwym rozwiązaniem jest skopiowanie w pliku secret.py poprzez skryptu deploy.

Jestem pewien, że istnieją również inne konkretne opcje dla różnych serwerów internetowych.

+2

Dla systemu Linux: http://unix.stackexchange.com/questions/21598/how-do-i-set-a-user-environment-variable- permanentna-notacja-. Dla mojego przykładu powyżej, dodajesz 'export secret_KEY = 'ABABABABABDSFJKEWLSK'' w twoim' .bash_profile', '.bash_login' lub' .profile' - zależnie od tego, który istnieje. –

+0

Przeniosłem mój tajny klucz do .bash_profile i użyłem os.environ.get, a to całkowicie zepsuło moją witrynę, chociaż 'echo $ SECRET_KEY' działało bez zarzutu. – swizzard

+2

Jest to szkodliwe dla bezpieczeństwa: zmienne środowiskowe procesu mogą być odczytywane przez innych użytkowników. –

6

Ustawienia należy przechowywać w sposób modułowy. Rozumiem przez to rozłożenie twoich ustawień na wiele plików. Na przykład możesz mieć base_settings.py do przechowywania wszystkich ustawień podstawowych; dev_settings.py dla ustawień serwera programistycznego; i wreszcie prod_base_settings.py dla wszystkich ustawień produkcyjnych. Wszystkie pliki Ustawienia bazowe nie będzie importować wszystkie ustawienia bazowe, a następnie zmienić tylko to, co jest konieczne:

# base_settings.py 
... 

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

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

Takie podejście pozwala mieć różne ustawienia z różnych konfiguracjach. Możesz również zatwierdzić wszystkie te pliki, z wyjątkiem tego, że na serwerze produkcyjnym możesz utworzyć rzeczywisty plik ustawień produkcyjnych prod_settings.py, w którym określisz wszystkie czułe ustawienia. Plik ten nie może być zaangażowana w dowolnym miejscu, a jego zawartość przechowywane w bezpieczny sposób:

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

jak dla nazw plików można używać niezależnie od nazwy plików czujesz są odpowiednie. Osobiście faktycznie utworzyć pakiet Pythona do ustawień, a następnie przechowywać różne ustawienia wewnątrz opakowania:

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

Dziękuję za odpowiedź. Jednak szukałem, jak chronić te klucze. – nitochi

+6

Posiadanie wszystkich tajnych ustawień w oddzielnym pliku jest sposobem, w jaki go chronisz. Nie chroni tylko w przypadku, gdy serwer zostanie zhackowany w miejscu, w którym zostanie naruszony plik. Ale w takim przypadku zmienne środowiskowe są podatne na atak, tak jak każda inna znana mi metoda. Istnieją metody całkowitego zabezpieczenia takich informacji, ale wszystkie z nich dotyczą osób trzecich przechowujących bezpieczne dane, a następnie serwer może poprosić ich o informacje, ale aby je zabezpieczyć, na każde żądanie, te usługi wyślą Ci powiadomienie, gdzie masz aby zweryfikować żądanie, aby nie były całkowicie zautomatyzowane. – miki725

4

Zamiast if/następnie logika należy użyć narzędzia przeznaczonego do faktoringu z poufnych danych. Używam YamJam https://pypi.python.org/pypi/yamjam/. Pozwala to na wszystkie zalety metody os.environ, ale jest prostsze - nadal musisz ustawić te zmienne środowiskowe, musisz umieścić je gdzieś w skrypcie. YamJam przechowuje te ustawienia konfiguracyjne w pamięci konfiguracyjnej maszyny, a także umożliwia zastąpienie projektu przez projekt.

from YamJam import yamjam 

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

jest podstawowym użytkowania. Podobnie jak w przypadku metody os.environ, nie jest ona związana z konkretnymi ramami, można jej używać z Django lub inną aplikacją/frameworkiem. Wypróbowałem je wszystkie, wiele plików settings.py, kruchą logikę if/then i kłótnię o środowisko. W końcu przerzuciłem się na yamjam i nie żałowałem tego.

4

Wiem, że minęło dużo czasu, ale po prostu otworzyłem małą aplikację Django, której używam do generowania nowego tajnego klucza, jeśli jeszcze nie istnieje. Nazywa się django-generate-secret-key.

pip install django-generate-secret-key 

Potem, gdy zasilenie/wdrażania nowego serwera z systemem mojego projektu Django, I uruchom następujące polecenie (z ansibl):

python manage.py generate_secret_key 

prościej:

  • sprawdza czy Klucz tajny musi zostać wygenerowany
  • generuje go w pliku secretkey.txt (można dostosować)

Wystarczy wtedy jest mieć w swoim pliku ustawień:

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

Teraz można korzystać z pełni zautomatyzowany procesie tworzenia rezerw bez konieczności przechowywania statycznego tajnego klucza w swoim repozytorium.

+0

Hmm, z najnowszym django (1.11) dostaję: 'FileNotFoundError: [Errno 2] Brak takiego pliku lub katalogu: '/ home /.../ project/secretkey.txt'' –

+0

@BabkenVardanyan uruchomiłeś' python manage. py generate_secret_key' pierwszy? Jeśli nie utworzył pliku lub jeśli coś jest nie tak, proszę otworzyć problem tutaj: https://github.com/MickaelBergem/django-generate-secret-key/issues/new, abyśmy mogli porozmawiać o tym –

Powiązane problemy