J'approche d'un point où je vais déployer mon Django application dans l'environnement hostile autrement connu comme "Internet" et j'essaie de mieux comprendre les ramifications du Django SECRET_KEY
. L'une des procédures standard semble être de sécuriser la clé secrète dans le settings.py
. C'est suffisant. Les docs vont jusqu'à dire de ne pas valider votre clé secrète sur SVN, CVS, etc ... Car cela permet d'accéder facilement à votre clé. Cependant, si quelqu'un était tenté de valider la clé secrète dans son référentiel, cela indiquerait-il que la clé secrète est statique (voir question # 4)?
Quoi qu'il en soit, voici mes questions:
settings.py
? Par exemple, si un attaquant peut lire settings.py
, il peut très probablement simplement taper $ echo $Django_SECRET_KEY
!settings.py
? S'il peut lire settings.py
, il peut probablement lire Django_secret_key.txt
.settings.py
à > print settings.SECRET_KEY
?Une fois qu'un attaquant a déjà accès au système, il est déjà trop tard. La principale préoccupation pour ne pas divulguer la clé est qu'elle est souvent utilisée comme graine pour les sessions de hachage et de signature. L'idée est que votre production SECRET_KEY
Doit être complètement différente de votre développement ou mise en scène SECRET_KEY
. Vous pouvez en fait le générer de manière aléatoire à chaque redémarrage, bien que cela puisse avoir un impact sur l'expérience utilisateur (voir les détails ci-dessous).
Tant que vous adhérez au principe de changement de clé, il n'y a pas beaucoup de danger si vous vous engagez ou non (tant que vous vous assurez qu'il est changé une fois passé de dev à prod). Si vous ne le faites pas, une personne possédant la clé peut prédire le résultat des algorithmes de hachage (utilisés pour les sessions) ou même signer des sessions.
Si un attaquant a accédé à votre système, vous êtes déjà trop loin parce que ce n'est plus votre système. Une chose que vous devez vous assurer est que les autorisations de fichier sur votre fichier de paramètres ne sont lisibles que par l'utilisateur exécutant le serveur Web et par personne d'autre. Cela empêche une personne ayant obtenu illégalement un accès à un compte limité, différent du compte de serveur Web, de compromettre votre clé.
Il y a une bonne réponse ici sur Stack Overflow: Django SECRET_KEY écrit par sberder qui détaille à quoi il sert:
- signature d'objet JSON
- fonctions cryptographiques pour les hmacs salés ou l'amorçage du moteur aléatoire qui impacte:
- jeton de réinitialisation du mot de passe
- sécurité du formulaire de commentaire pour se protéger contre les fausses POST
- sécurité du formulaire
- protection contre l'altération des messages car le cadre de messages peut utiliser des cookies pour transmettre des messages entre les vues.
- protéger les données de session et créer des clés de session aléatoires pour éviter également la falsification.
- créer un sel aléatoire pour la plupart des hachages de mot de passe
- créer des mots de passe aléatoires si nécessaire
- se créer lors de l'utilisation de
startproject
- créer une clé CSRF
En réalité, la plupart des éléments répertoriés ici utilisent
SECRET_KEY
ÀDjango.utils.crypt.get_random_string()
qui l'utilise pour amorcer le moteur aléatoire. Cela ne sera pas affecté par un changement de valeur deSECRET_KEY
.L'expérience utilisateur directement impactée par un changement de valeur est:
- sessions, le décodage des données sera interrompu, ce qui est valable pour tout backend de session (cookies, base de données, fichier ou cache).
- le jeton de réinitialisation du mot de passe déjà envoyé ne fonctionnera pas, les utilisateurs devront en demander un nouveau.
- le formulaire de commentaires (si vous utilisez
Django.contrib.comments
) ne validera pas s'il a été demandé avant le changement de valeur et soumis après le changement de valeur. Je pense que c'est très mineur mais peut être déroutant pour l'utilisateur.- les messages (de
Django.contrib.messages
) ne valideront pas côté serveur dans les mêmes conditions de temps que pour le formulaire de commentaires.