Est-il sécuritaire de stocker les mots de passe comme des variables d'environnement (plutôt qu'en texte brut) dans les fichiers de config?
Je travaille sur quelques applications dans les rails, django (et un peu de php), et l'une des choses que j'ai commencé à faire de certains d'entre eux est le stockage de base de données et autres mots de passe comme des variables d'environnement plutôt que du texte brut dans certains fichiers de configuration (ou dans settings.py pour django apps).
En discutant de cela avec un de mes collaborateurs, il a suggéré que c'est une mauvaise pratique que peut-être ce n'est pas aussi parfaitement sécurisé comme il pourrait sembler à première vue.
Donc, je voudrais savoir: est - ce une pratique sécurisée? Est-il plus sécurisé pour stocker les mots de passe en texte brut dans ces fichiers (en s'assurant, bien sûr, de ne pas laisser ces fichiers en public repos ou de quoi que ce soit)?
- Heroku mandats que vous obtenez de la base de données des mots de passe à partir des variables d'environnement - ils doivent avoir pris en compte ces risques souligné ici, mais semble toujours être l'option gagnante.
- Comment êtes-vous de chargement de la variable d'environnement? Est-ce à partir d'un fichier?
- Mon vieux de vérification sur cette question: security.stackexchange.com/questions/20282/...
- Même env vars et les fichiers dans le dossier d'accueil utilisateur de paradigme pour AWS. [docs.aws.amazon.com/cli/latest/userguide/...
- Je suppose que la réponse à cette question dépendra fortement de l'OS, c'est différent sur Linux et Windows par exemple.
Vous devez vous connecter pour publier un commentaire.
Sur un niveau plus théorique, j'ai tendance à penser à des niveaux de sécurité dans l'une des manières suivantes (dans l'ordre croissant de la résistance) :
Les variables d'environnement sont plus sûr que les fichiers de texte, parce qu'ils sont volatils/jetable, pas sauvegardé;
c'est à dire si vous ne définissez que local, variable d'environnement, comme "ensemble pwd=que ce soit," et puis d'exécuter le script,
avec quelque chose qui sort de votre commande shell à la fin du script, la variable n'existe plus.
Votre cas se situe dans les deux premières, qui je dirais est assez précaire. Si vous allez pour ce faire, je ne recommanderais pas de déploiement à l'extérieur de votre intranet/réseau domestique, et alors seulement pour des fins de test.
Comme mentionné avant, les deux méthodes ne fournissent pas toute couche supplémentaire de "sécurité" une fois que votre système est compromise. Je crois que l'une des plus fortes raisons parlent en faveur des 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 tous les autres développeurs de voir (et oups! il m'est arrivé aussi ...).
Pas de stocker vos mots de passe dans des fichiers, il est impossible pour eux d'être stockés dans le système de contrôle de version.
Chaque fois que vous devez stocker un mot de passe, c'est l'insécurité. Période. Il n'y a aucun moyen de stocker des nations unies mot de passe crypté en toute sécurité. Maintenant que des variables d'environnement vs fichiers de config est plus "secure" est peut-être discutable. À mon humble avis, si votre système est compromis, il n'a pas vraiment d'importance où il est stocké, bon hacker peut en suivre la trace.
cat /proc/1/environ
par exemple.ps axe
de voir que d'être ignoré.ps axe
.strace -e open ps axe
montre qu'il est d'obtenir cette information de/proc/[pid]/environ
, qui a la permission d'exécution (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 à peu près tout).Désolé de ne pas avoir assez de rep de commentaire, mais je voulais aussi ajouter que si vous ne faites pas attention, votre shell peut capturer que le mot de passe dans la commande de l'histoire ainsi. Si l'exécution de quelque chose comme
$ pwd=mypassword my_prog
manuellement n'est pas aussi éphémère que vous pourriez espérer.read -s MY_PASS_VAR
qui permettra de protéger contre les deux shell-histoire des recherches et des épaules les surfeurs.Cela dépend de votre modèle de menace.
Êtes-vous essayer de prévenir vos utilisateurs à partir de l'aspersion des mots de passe sur leurs systèmes de fichiers où ils sont susceptibles d'être oublié et mal gérées? Si oui, alors oui, parce que les variables d'environnement sont moins persistants que les fichiers.
Êtes-vous essayer de les protéger contre quelque chose de malveillant qui s'attaque directement à votre programme? Si oui, alors non, parce que les variables d'environnement n'ont pas le même niveau de contrôle d'accès que les fichiers ne.
Personnellement, je pense que négligent les utilisateurs sont le plus souvent motivés adversaires, donc j'irais avec la variable d'environnement approche.
Je pense que quand cela est possible, vous devez stocker vos informations d'identification dans un gitignored fichier, et non comme des variables d'environnement.
L'une des choses à considérer lors du stockage des informations d'identification dans les ENV (environnement) variables vs un fichier, c'est que des variables d'environnement peuvent très facilement être consulté par toute bibliothèque ou à la dépendance que vous utilisez.
Cela peut être fait à des fins malveillantes ou non. Par exemple, une bibliothèque auteur pourrait courriel traces de pile, plus les variables d'environnement pour eux-mêmes à des fins de débogage (pas les meilleures pratiques, mais il est possible de le faire).
Si vos informations d'identification sont dans un fichier, puis avec un pic est beaucoup plus difficile.
Plus précisément, pensez au sujet d'un mécanisme national de prévention de nœud. Pour un mécanisme national de prévention de regarder vos informations d'identification s'ils sont dans l'ENV est une simple question de
process.ENV
. Si d'autre part ils sont dans un fichier, c'est beaucoup plus de travail.Si vos informations d'identification de fichier est la version contrôlée ou non est une autre question. Pas version le contrôle de vos informations d'identification de fichier expose à moins de personnes. Il n'est pas nécessaire pour tous les devs à savoir la production d'informations d'identification. Depuis cette vie jusqu'au principe du moindre privilège, je dirais git d'ignorer vos informations d'identification de fichier.