web-dev-qa-db-fra.com

Où stocker les clés secrètes DJANGO

Pour la vie de moi, je l'ai cherché partout et je n'ai pas trouvé la réponse. J'espère que je n'en poste pas de double.

Il est conseillé partout que vous devez conserver vos clés secrètes dans un fichier distinct de votre settings.py général. En outre, vous ne devez jamais valider votre fichier "secret.py" qui contient des clés telles que SECRET_KEY, AWS_SECRET_KEY et ainsi de suite.

Ma question est: 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 vivre quelque part autour du serveur, n'est-ce pas? Si oui, comment protégez-vous vos clés secrètes en production?

45
nitochi

Voir les documentation de déploiement de Django pour une discussion à ce sujet .

Il existe plusieurs options de production. Je le fais en définissant mes variables de données sensibles comme des variables environnementales sur les environnements de production. Ensuite, je récupère les variables dans le settings.py via os.environ ainsi:

import os
SECRET_KEY = os.environ['SECRET_KEY']

Une autre option possible consiste à copier dans le secret.py fichier via votre script de déploiement.

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

28
Dan Hoerst

Vous devez stocker vos paramètres de manière modulaire. J'entends par là répartir vos paramètres sur 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 fichiers de paramètres non de base importeront tous les paramètres de base et ne modifieront ensuite que 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écifierez tous les paramètres sensibles. Ce fichier ne doit être engagé nulle part et son contenu doit être sécurisé:

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

En ce qui concerne les noms de fichiers, vous pouvez utiliser les noms de fichiers que vous jugez appropriés. Personnellement, je crée un package Python pour les paramètres, puis je conserve 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
    ...
8
miki725

Je sais que cela fait longtemps, mais je viens d'ouvrir une petite application Django que j'utilise pour générer une nouvelle clé secrète si elle n'existe pas encore. Elle s'appelle Django -generate-secret-key .

pip install Django-generate-secret-key

Ensuite, lorsque je provisionne/déploie un nouveau serveur exécutant mon Django, j'exécute la commande suivante (depuis Ansible):

python manage.py generate_secret_key

Cela signifie simplement:

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

Il vous suffit 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.

4
Mickaël

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

from YamJam import yamjam

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

Est l'utilisation de base. Et comme la méthode os.environ, elle n'est pas spécifique au framework, vous pouvez l'utiliser avec Django ou toute autre application/framework. Je les ai toutes essayées, plusieurs fichiers settings.py, fragiles logique du if/then et de l’environnement. Au final, je suis passé au yamjam et je ne l'ai pas regretté.

4
Dundee MT