2013-03-04 7 views
29

Pour la vie de moi, j'ai cherché ceci partout et n'ai pas trouvé la réponse. J'espère ne pas poster un doublon.Où stocker les clés secrètes DJANGO

Il est conseillé partout où vous devriez garder vos clés secrètes dans un fichier séparé de votre settings.py général. En outre, vous ne devez jamais valider votre fichier "secret.py" contenant des clés telles que SECRET_KEY, AWS_SECRET_KEY, etc.

Ma question est la suivante: Dans votre serveur de production, vous devez référencer vos clés secrètes, cela signifie que votre fichier de paramètres "secret.py" devrait être installé quelque part sur le serveur, n'est-ce pas? Si oui, comment protégez-vous vos clés secrètes en production?

Répondre

18

Il y a pas mal d'options pour la production. La façon dont je le fais est en définissant mes variables de données sensibles en tant que variables d'environnement sur les environnements de production. Puis-je récupérer les variables du settings.py via os.environ.get() comme ceci:

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

Une autre option possible est de copier dans le fichier secret.py via votre script deploy.

Je suis sûr qu'il existe également d'autres options spécifiques pour différents serveurs Web.

+2

Pour linux: http://unix.stackexchange.com/questions/21598/how-do-i-set-a-user-environment-variable-permanently-not-session. Pour mon exemple ci-dessus, vous devez ajouter 'exporter secret_KEY = 'ABABABABABDSFJKEWLSK' dans votre fichier' .bash_profile', '.bash_login' ou' .profile' - selon ce qui existe. –

+0

J'ai déplacé ma clé secrète vers .bash_profile et j'ai utilisé os.environ.get, et cela a complètement cassé mon site, même si 'echo $ SECRET_KEY' fonctionnait correctement. – swizzard

+2

Ceci est mauvais pour la sécurité: les variables d'environnement du processus peuvent être lues par d'autres utilisateurs. –

6

Vous devez stocker vos paramètres de manière modulaire. Par là, je veux répartir vos paramètres entre plusieurs fichiers.

Par exemple, vous pouvez avoir base_settings.py pour stocker tous vos paramètres de base; dev_settings.py pour les paramètres de votre serveur de développement; et enfin prod_base_settings.py pour tous les paramètres de production. Tous les paramètres non-base fichiers importer tous les paramètres de base et seulement changer tout ce qui est nécessaire:

# base_settings.py 
... 

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

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

Cette approche vous permet d'avoir différents paramètres de différentes configurations. Vous pouvez également valider tous ces fichiers, sauf que sur le serveur de production, vous pouvez créer le fichier de paramètres de production réel prod_settings.py où vous spécifiez tous les paramètres sensibles. Ce fichier ne doit pas être commis partout et son contenu sécurisé maintenu:

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

En ce qui concerne les noms de fichiers que vous pouvez utiliser ce que vous jugez les noms de fichiers appropriés. Personnellement, je crée en fait un package Python pour les paramètres, puis garder les différents paramètres à l'intérieur du package:

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

Merci pour votre réponse. Cependant, je regardais comment protéger ces clés. – nitochi

+6

En ayant tous les paramètres secrets dans le fichier séparé est une façon de le protéger. Il ne protège pas au cas où le serveur est piraté où le fichier est compromis. Mais dans ce cas, les variables d'environnement sont seulement vulnérables, comme toutes les autres méthodes que je connais. Il existe des méthodes pour sécuriser complètement ces informations, mais toutes impliquent un tiers stockant les données sécurisées, puis votre serveur peut leur demander des informations, mais pour les sécuriser, à chaque requête, ces services vous enverront une notification où vous avez pour valider la demande afin qu'ils ne soient pas complètement automatisés. – miki725

4

lieu de si/alors logique, vous devez utiliser un outil conçu pour la factorisation des données sensibles. J'utilise YamJam https://pypi.python.org/pypi/yamjam/. Il permet tous les avantages de la méthode os.environ mais il est plus simple - vous devez toujours définir ces variables environ, vous devrez les placer dans un script quelque part. YamJam stocke ces paramètres de configuration dans un magasin de configuration de machine et permet également à un projet par projet de surcharger.

from YamJam import yamjam 

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

L'utilisation de base. Et comme la méthode os.environ, elle n'est pas spécifique à un framework, vous pouvez l'utiliser avec Django ou toute autre application/framework. Je les ai tous essayés, plusieurs fichiers settings.py, une logique fragile de si/alors et des disputes d'environnement. À la fin, je suis passé au yamjam et je ne l'ai pas regretté.

4

Je sais que ça fait longtemps, mais j'ai juste ouvert une petite application Django que j'utilise pour générer une nouvelle clé secrète si elle n'existe pas encore. Il s'appelle django-generate-secret-key.

pip install django-generate-secret-key 

Ensuite, lorsque l'approvisionnement/le déploiement d'un nouveau serveur exécutant mon projet Django, je lance la commande (de Ansible) suivant:

python manage.py generate_secret_key 

simplement:

  • vérifie si une la clé secrète doit être générée
  • génère dans un fichier secretkey.txt (peut être personnalisé)

Tout ce que vous avez besoin est alors d'avoir dans votre fichier de paramètres:

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

Vous pouvez désormais bénéficier d'un processus d'approvisionnement entièrement automatisé sans avoir à stocker une clé secrète statique dans votre référentiel.

+0

Hmm, avec le dernier django (1.11) je reçois: 'FileNotFoundError: [Errno 2] Aucun fichier ou répertoire: '/ home /.../projet/keykey.txt'' –

+0

@BabkenVardanyan avez-vous exécuté' python manage. py generate_secret_key' d'abord? S'il n'a pas créé le fichier ou si quelque chose ne va pas, alors s'il vous plaît ouvrir un problème ici: https://github.com/MickaelBergem/django-generate-secret-key/issues/new afin que nous puissions parler de cela –

Questions connexes