Une des causes de l'anti-motif local_settings.py est que l'insertion de valeurs SECRET_KEY, AWS , Etc., dans des fichiers de paramètres pose problème:
Ma question est de savoir comment garder toutes les clés secrètes.
Je fais mes projets Django avec Windows 7 et Powershell, donc pour moi, définir la variable d'environnement était légèrement différent. Une fois que cela a été défini, je viens de faire ce qui suit dans mon fichier settings.py
:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
Pour définir une variable d'environnement dans Windows à l'aide de PowerShell, suivez les instructions indiquées dans le lien ci-dessous:
Stockez vos données local_settings.py
dans un fichier crypté avec GPG - de préférence sous forme de lignes key=value
que vous analysez et attribuez à un dict (l’autre approche intéressante serait de les avoir comme python exécutable, mais le code exécutable dans les fichiers de configuration me fait trembler).
Il y a un module python gpg donc ce n'est pas un problème. Extrayez vos clés de votre trousseau de clés et utilisez les outils de gestion de trousseaux de clés GPG pour ne plus avoir à taper votre mot de passe de trousseau. Assurez-vous de lire les données directement à partir du fichier crypté et non simplement de créer un fichier temporaire déchiffré dans lequel vous avez lu. C'est une recette d'échec.
Ce n'est qu'un aperçu, vous devrez le construire vous-même.
De cette façon, les données secrètes restent uniquement dans l'espace mémoire du processus, et non dans un fichier ou dans des variables d'environnement.
Idéalement, local_settings.py
ne devrait pas être enregistré pour le serveur de production/déployé. Vous pouvez conserver la copie de sauvegarde ailleurs, mais pas dans le contrôle de source.
local_settings.py
peut être archivé avec la configuration de développement juste pour la commodité, de sorte que chaque développeur doit le changer.
Cela résout-il votre problème?
La question initiale était de savoir comment garder les secrets dans les variables d'environnement. Ceci est largement discuté dans le livre Two Scoops of Django . Vous trouverez ci-dessous un résumé de ce qu’ils ont dit, suivi d’une mise en garde concernant l’utilisation de cette technique.
À partir de la page 48 (Section 5.3) de l'édition de 1.11:
Chaque système d'exploitation pris en charge par Django (et Python) fournit le fichier possibilité facile de créer des variables d'environnement.
Voici les avantages de l'utilisation de variables d'environnement pour les clés secrètes:
- Garder le secret sur les paramètres vous permet de stocker chaque fichier de paramètres dans le contrôle de version sans hésiter. Tout votre code Python devrait vraiment être stocké dans le contrôle de version, y compris vos paramètres.
- Au lieu que chaque développeur maintienne sa propre version copier-coller de local_settings.py.example pour le développement, tout le monde partage les mêmes paramètres contrôlés par la version/local.py.
- Les administrateurs système peuvent déployer rapidement le projet sans avoir à modifier les fichiers contenant du code Python.
- La plupart des plateformes en tant que service recommandent l’utilisation de variables d’environnement pour la configuration et intègrent des fonctionnalités permettant de définir et les gérer.
Sur la page suivante, le livre continue:
Avant de commencer à définir des variables d’environnement, vous devez disposer du fichier Suivant:
- Un moyen de gérer les informations secrètes que vous allez stocker.
- Une bonne compréhension du fonctionnement des paramètres bash sur les serveurs ou une volonté d’héberger votre projet sur une plate-forme en tant que service.
Ils décrivent comment définir les variables d'environnement localement et en production (avec Heroku à titre d'exemple - vous devrez vérifier si vous utilisez un autre hôte, ce n'est qu'une possibilité):
Comment définir les variables d'environnement localement
exportation SOME_SECRET_KEY = 1c3-cr3am-15-yummyComment définir des variables d'environnement en production
Paramètres de configuration: définissez SOME_SECRET_KEY = 1c3-cr3am-15-yummy
Enfin, à la page 52, ils expliquent comment accéder à la clé. Par exemple, vous pouvez mettre les deux premières lignes ci-dessous dans votre fichier de paramètres pour remplacer la chaîne de clé brute qui y est placée par défaut:
>>> import os >>> os.environ['SOME_SECRET_KEY'] '1c3-cr3am-15-yummy'
Cet extrait récupère simplement la valeur de l'environnement SOME_SECRET_KEY variable du système d’exploitation et l’enregistre dans une variable Python appelé SOME_SECRET_KEY.
Suivre ce modèle signifie que tout le code peut rester dans le contrôle de version, et tous les secrets restent en sécurité.
Notez que cela ne fonctionnera pas dans certains cas, par exemple si vous utilisez un serveur Apache. Pour traiter les situations dans lesquelles ce modèle ne fonctionnera pas, consultez la section 5.4 de leur manuel ("Lorsque vous ne pouvez pas utiliser de variables d’environnement"). Dans ce cas, ils recommandent d'utiliser un fichier secret.
À la fin de 2017, cette technique de stockage des secrets dans vos variables d'environnement est la meilleure pratique recommandée dans Two Scoops et dans le modèle de conception de Twelve Factor App. Il est également recommandé dans les documents Django. Cependant, il existe des risques de sécurité: si un développeur, ou un code, a accès à votre système, il aura accès à vos variables d'environnement et pourrait les rendre publiques par inadvertance (ou de manière publicitaire). Ce que Michael Reinsch a dit ici:
http://movingfast.io/articles/environment-variables-considered-harmful/
J'ai écrit une fonction getcreds () qui récupère la clé secrète d'un fichier. Je garde le fichier dans un endroit accessible par www-data. Ainsi, chaque fois que j'ai besoin d'informations d'identification dans settings.py, je lance simplement l'appel à getcreds () en transmettant le nom du fichier en argument. Il retourne une liste de toutes les lignes du fichier et bingo j'ai les secrets cachés. Voici le code ...
from __future__ import unicode_literals, absolute_import
import os
def getcreds(fname, project, credsroot='/var/www/creds', credsdir=None):
""" return a list of userid and password and perhaps other data """
if credsdir is None:
credsdir = os.path.join(credsroot, project)
creds = list()
fname = os.path.join(credsdir, fname).replace("\\", "/")
with open(fname, 'r') as f:
for line in f:
# remove leading/trailing whitespace and append to list
creds.append(line.strip())
assert creds, "The list of credentials is empty"
return creds
Voici une façon de le faire compatible avec le déploiement sur Heroku:
Créez un fichier gitignored nommé .env
contenant:
export Django_SECRET_KEY = 'replace-this-with-the-secret-key'
Puis éditez settings.py
pour supprimer le SECRET_KEY
actuel et ajoutez-le à la place:
SECRET_KEY = os.environ['Django_SECRET_KEY']
Ensuite, lorsque vous souhaitez exécuter le serveur de développement localement, utilisez:
source .env
python manage.py runserver
Lorsque vous avez finalement déployé sur Heroku, allez dans l'onglet Paramètres de votre application et ajoutez Django_SECRET_KEY au fichier de configuration.
Vous devrez peut-être utiliser os.environ. get ("SOME_SECRET_KEY")