Quelques outils pour gérer les clés secrètes en Django

Quelques outils pour gérer les clés secrètes en Django

Cet article est repris de l’archive et appartient à l’ancien propriétaire du site, il a été repris sur celui-ci dans une forme d’hommage

On ne veut pas mettre sa SECRET_KEY en prod, et utiliser un service pour générer la clé, ça va deux minutes.

Générer une clé secrète:

import random import string   def secret_key(size=50): pool = string.ascii_letters + string.digits + string.punctuation return «  ».join(random.SystemRandom().choice(pool) for i in range(size))

Générer une clé secrete avec une commande manage.py:

from django.core.management.base import BaseCommand, CommandError from polls.models import Question as Poll   class Command(BaseCommand): help = ‘Generate a secret key’   def add_arguments(self, parser): parser.add_argument(‘size’, default=50, type=int)   def handle(self, *args, **options): self.stdout.write(secret_key(options[‘size’]))

A mettre dans ./votreapp/management/command/generate_secret_key.py 🙂

Une fonction pour lire la clé depuis un fichier texte ou générer la clé si elle n’existe pas:

import io import os   try: import pwd except ImportError: pass   try: import grp except ImportError: pass     def secret_key_from_file( file_path, create=True, size=50, file_perms=None, # unix uniquement file_user=None, # unix uniquement file_group=None # unix uniquement ): try: with io.open(file_path) as f: return f.read().strip() except IOError as e: if e.errno == 2 and create: with io.open(file_path, ‘w’) as f: key = secret_key(size) f.write(key)   if any((file_perms, file_user, file_group)) and not pwd: raise ValueError(‘File chmod and chown are for Unix only’)   if file_user: os.chown(file_path, uid=pwd.getpwnam(file_user).pw_uid)   if file_group: os.chown(file_path, gid=grp.getgrnam(file_group).gr_gid)   if file_perms: os.chmod(file_path, int(str(file_perms), 8))   return key   raise

Et une fonction pour récupérer la clé depuis une variable d’environnement ou un fichier:

def get_secret_key( file_path=None, create=True, size=50, file_perms=None, file_user=None, file_group=None, env_var= »DJANGO_SECRET_KEY » ): try: return os.environ[env_var] except KeyError: if file_path: return secret_key_from_file(file_path, create=create, size=size) raise

Le but de cette dernière est d’avoir ça dans son fichier de settings:

SECRET_KEY = get_secret_key('secret_key')

Et de foutre ‘secret_key’ dans son .gitignore.

Comme ça:

  • Si on n’a pas de clé secrète, on en génère une.
  • Si on a une, elle est dans un fichier qui n’est PAS dans settings.py.
  • On peut commiter settings.py. Chaque env de dev et prod a sa clé secrète automatiquement.
  • On peut overrider la clé avec une variable d’environnement si on le souhaite.

sam artois

A propos de l'auteur

Samuel Artois est un développeur Python passionné d'automatisation et de marketing. Depuis plusieurs années, il a développé une expertise solide dans ces domaines et a su mettre ses compétences en pratique sur de nombreux projets.

Laisser un commentaire