Comment puis-je enregistrer mes clés secrètes et le mot de passe de manière sécurisée dans mon système de contrôle de version?
- Je conserver les paramètres importants comme les noms d'hôte et les ports de développement et de production de serveurs dans mon système de contrôle de version. Mais je sais que c'est mauvaise pratique de garder secrets (comme des clés privées et de la base de données des mots de passe) dans un dépôt VCS.
Mais des mots de passe, comme tout autre paramètre--semblent comme ils devraient être versionnés. Donc, ce que est la bonne façon de garder les mots de passe de la version contrôlée?
J'imagine qu'il consisterait à maintenir le secrets dans leur propre "secrets" paramètres du fichier et avoir que fichier crypté et la version contrôlée. Mais quelles technologies? Et comment le faire correctement? Est-il une meilleure façon entièrement d'aller à ce sujet?
Je vous pose la question en général, mais dans mon cas précis, je voudrais stocker des clés secrètes et mots de passe pour un Django/Python site à l'aide de git et github.
Aussi, un idéal solution serait de faire quelque chose de magique quand je push/pull avec git--par exemple, si les mots de passe cryptés modifications du fichier de l'exécution d'un script qui demande un mot de passe et le déchiffre en place.
EDIT: Pour plus de clarté, je suis demandant où stocker production secrets.
- En fait avant de l'argent pour garder le repo privé.
- J'ai en fait déjà payer pour un repository privé, mais le fait demeure, vous ne devriez pas conserver les informations sensibles de votre référentiel.
- Je pense qu'une grande partie de la raison des réponses satisfaisantes seront difficiles à obtenir, c'est que l'ancienne, en clair le mot de passe pour se connecter à une base de données est une relique de moins hostile ère. La bonne réponse est quelque chose comme "votre code ne doit pas avoir besoin d'un secret", mais les systèmes que vous accédez à ne pas vous donner beaucoup de choix.
- Aurez-vous accès à ces données confidentielles uniquement à partir de Python? Alors je vous recommande d'un fichier spécial de l'objet.
- un fichier spécial de l'objet? Qu'est-ce que cela? Où puis-je trouver de la documentation?
- Pourquoi? Il n'y a rien de valeur dans la version de contrôle des mots de passe pour les services extérieurs. La valeur principale de contrôle de version, c'est que vous pouvez inspecter l'historique des révisions de votre application appelée à être en ordre de marche et de les exécuter. Cependant, d'anciens mots de passe sont inutiles pour vous. Si ils ont été révoqué, ils ne jamais travailler à nouveau.
- ce que vous dites est logique, mais dans ce cas, que recommandez-vous?
- Double Possible: programmers.stackexchange.com/questions/205606/...
Vous devez vous connecter pour publier un commentaire.
Vous avez tout à fait raison de vouloir crypter votre fichier de paramètres, tout en conservant le fichier dans le contrôle de version. Comme vous le mentionnez, la meilleure solution serait que le Git de manière transparente crypter certains fichiers sensibles lorsque vous appuyez sur eux, de sorte que localement (c'est à dire sur toute la machine de votre certificat de), vous pouvez utiliser le fichier de paramètres, mais Git ou Dropbox ou celui qui est le stockage de vos fichiers sous VC ne pas avoir la capacité de lire les informations en clair.
Tutoriel sur la Transparence de Chiffrement/Déchiffrement, au cours de Push/Pull
Ce gist https://gist.github.com/873637 montre un tutoriel sur la façon d'utiliser le Git du smudge/nettoyer le filtre de pilote avec openssl pour chiffrer de manière transparente poussé fichiers. Vous avez juste besoin de faire un peu de configuration initiale.
Résumé de la Façon dont il Fonctionne
Vous aurez essentiellement être la création d'un
.gitencrypt
dossier contenant les 3 scripts bash,qui sont utilisés par Git pour le décryptage, le cryptage, et le soutien Git diff. Un maître-mot de passe et le sel (fixe!) est définie à l'intérieur de ces scripts, et vous DEVEZ vous assurer que .gitencrypt n'est jamais vraiment poussé.
Exemple
clean_filter_openssl
script:Similaires pour
smudge_filter_open_ssl
etdiff_filter_oepnssl
. Voir Les Gist.Votre repo avec des informations sensibles doivent avoir un .gitattribute fichier (non chiffré et inclus dans le repo) qui fait référence à la .gitencrypt répertoire (qui contient tout ce qui Git besoins pour crypter/décrypter le projet de manière transparente) et qui est présent sur votre machine locale.
.gitattribute
contenu:Enfin, vous devrez également ajouter le contenu suivant votre
.git/config
fichierMaintenant, lorsque vous appuyez sur le référentiel contenant vos informations sensibles à un dépôt distant, les fichiers seront chiffrés de manière transparente. Lorsque vous tirez sur une machine locale qui a la .gitencrypt répertoire contenant votre mot de passe), les fichiers de manière transparente décrypté.
Notes
Je tiens à noter que ce tutoriel n'est pas de décrire une façon, à seulement crypter votre fichier de paramètres. De cette manière transparente chiffrer l'intégralité d'un référentiel qui est poussé à la distance de CR d'accueil et de décrypter l'ensemble du référentiel de sorte qu'il est entièrement décrypté localement. Pour obtenir le comportement que vous voulez, vous pouvez placer des fichiers sensibles pour un ou plusieurs projets dans un sensitive_settings_repo. Vous pourriez étudier comment cette technique de chiffrement transparent fonctionne avec des submodules http://git-scm.com/book/en/Git-Tools-Submodules si vous avez vraiment besoin de le fichiers sensibles dans le même référentiel.
L'utilisation d'un fixe phrase pourrait théoriquement conduire à la force brute des vulnérabilités si les pirates ont eu accès à de nombreux chiffré repos/fichiers. OMI, la probabilité pour que ce soit très faible. Comme une note au bas de ce tutoriel mentionne pas l'utilisation d'un mot de passe multiterme entraînera des versions locales de pensions de titres sur des machines différentes, toujours montrant que des modifications ont eu lieu avec "git status".
Heroku pousse l'utilisation de variables d'environnement pour les paramètres et les clés secrètes:
Avec le Contremaître et
.env
fichiers Heroku fournir une enviable de la chaîne d'exporter, d'importer et de synchroniser les variables d'environnement.Personnellement, je crois que c'est mauvais pour enregistrer les clés secrètes aux côtés de code. C'est fondamentalement incompatible avec le contrôle de source, parce que les touches sont pour les services extrinsèque à la le code. Une aubaine serait qu'un développeur peut clone de la TÊTE et de l'exécution de l'application sans aucune configuration. Cependant, supposons qu'un développeur récupère un historique de révision du code. Leur copie comprendra l'année dernière base de données de mot de passe, de sorte que l'application ne pourra pas aujourd'hui de base de données.
Avec le Heroku méthode ci-dessus, un développeur peut la caisse de l'année dernière application, configurez-le avec les touches, et de l'exécuter avec succès contre, aujourd'hui, la base de données.
La façon la plus propre à mon avis est d'utiliser des variables d'environnement. Vous n'aurez pas à traiter avec .dist fichiers par exemple, et l'état du projet sur l'environnement de production seraient les mêmes que celles de votre machine.
Je recommande la lecture de Les Douze Facteur Apps'config chapitre, les autres aussi si vous êtes intéressés.
export MY_ENV_VAR=
, et lorsque vous déployez, il suffit de le remplir avec les valeurs de droite etsource
il. Si par garder tu veux dire la version les paramètres, vous ne devriez pas faire cela en premier lieu.Une option serait de mettre de projet lié à des informations d'identification dans un conteneur chiffré (TrueCrypt ou Keepass) et de le pousser à.
Mise à jour en tant que réponse de mon commentaire ci-dessous:
Question intéressante btw. Je viens de trouver ceci: github.com/shadowhand/git-encrypt qui semble très prometteur pour le cryptage automatique
git-encrypt
ressemble exactement à ce que je cherche " Quand on travaille avec une télécommande dépôt git qui est hébergé sur un tiers de serveur de stockage, la confidentialité des données, parfois, devient un sujet de préoccupation. Cet article vous guide à travers les procédures de configuration de dépôts git pour votre répertoire de travail sont aussi normaux (non cryptés), mais le contenu est crypté". (Bien sûr, je veux seulement un sous-ensemble de mon contenu crypté...)Je suggère d'utiliser des fichiers de configuration pour qui et pour pas version les.
Vous pouvez cependant la version des exemples de fichiers.
Je ne vois pas de problème de partage de paramètres de développement. Par définition, il ne doit pas contenir de précieuses données.
BlackBox a été récemment publié par StackExchange et alors que je n'ai pas encore l'utiliser, il semble exactement à résoudre les problèmes et prendre en charge les fonctionnalités demandées dans la présente question.
De la description sur https://github.com/StackExchange/blackbox:
Depuis posant cette question, j'ai décidé de trouver une solution, que j'utilise lorsque le développement de la petite application avec une petite équipe de personnes.
git-crypt
git-crypt utilise GPG pour chiffrer de manière transparente les fichiers quand leurs noms correspondent à certains modèles. Pour l'intance, si vous ajoutez à votre
.gitattributes
fichier......puis un fichier comme
config.secret.json
sera toujours poussé à distance repos avec le chiffrement, mais rester non crypté sur votre système de fichiers local.Si je veux ajouter une nouvelle clé GPG (une personne) à votre repo qui peut décrypter les fichiers protégés, puis exécutez
git-crypt add-gpg-user <gpg_user_key>
. Cela crée un nouveau commit. Le nouvel utilisateur sera en mesure de déchiffrer ultérieure s'engage.Non, il suffit de ne pas, même si c'est votre repo privé et vous n'avez jamais l'intention de le partager, de ne pas.
Vous devez créer un local_settings.py mettre sur VCS ignorer et dans votre settings.py faire quelque chose comme
Si vos secrets les paramètres sont que polyvalent, je me suis empressé de dire que vous faites quelque chose de mal
EDIT: je suppose que vous voulez garder une trace de vos mots de passe précédents versions - dire, pour un script qui permettrait d'éviter le mot de passe de réutiliser etc.
Je pense que GnuPG est la meilleure façon d'aller - il est déjà utilisé dans un git liées au projet (git-annex) pour chiffrer le contenu du référentiel stockées sur les services cloud. GnuPG (gnu pgp) fournit un très forte en fonction de clé de chiffrement.
Maintenant, si votre 'monmotdepasse' fichier n'a pas changé alors le chiffrement il entraînera avec le même texte chiffré, et il ne sera pas ajouté à l'index (pas de redondance). Moindre modification de monmotdepasse résultats radicalement différentes chiffré et monmotdepasse.gpg dans la zone de transit diffère beaucoup de celui de dépôt, ainsi sera ajouté à la commettre. Même si l'attaquant obtient une emprise de votre clé gpg il a encore besoin de bruteforcer le mot de passe. Si l'attaquant obtient un accès à distance dépôt avec texte chiffré, il est possible de comparer un tas d'chiffrés, mais leur nombre ne sera pas suffisant pour lui donner des non-négligeable avantage.
Plus tard, vous pouvez utiliser .gitattributes de fournir une volée de déchiffrement pour quitter la commande git diff de votre mot de passe.
Aussi vous pouvez avoir des clés séparées pour les différents types de mots de passe, etc.
D'habitude, j'ai séparé le mot de passe dans le fichier de configuration. et de les rendre dist.
Et quand je lance
main.py
, mettre le mot de passe réel dansdefault.cfg
que copié.ps. lorsque vous travaillez avec git ou hg. vous pouvez ignorer
*.cfg
de fichiers pour les rendre.gitignore
ou.hgignore
.dist
fichiers, comment fonctionnent-ils?Fournir un moyen de remplacer la config
C'est la meilleure façon de gérer un ensemble de sain d'esprit des valeurs par défaut pour la configuration que vous checkin sans exiger la config complète, ou contiennent des choses comme le nom d'hôte et les informations d'identification. Il ya quelques façons de le remplacer par défaut configs.
Variables d'environnement (comme d'autres l'ont déjà mentionné) sont un moyen de le faire.
La meilleure façon est de chercher un externe fichier de config qui remplace la configuration par défaut des valeurs. Cela vous permet de gérer la configuration par l'intermédiaire d'un système de gestion de configuration comme Chef, Puppet ou Cfengine. Gestion de la Configuration est la réponse standard pour la gestion des configurations distinctes de la base de code de sorte que vous n'avez pas à faire à une version mise à jour de la config sur un seul hôte ou un groupe d'hôtes.
FYI: Chiffrement creds n'est pas toujours une bonne pratique, surtout dans un endroit avec des ressources limitées. Il peut être le cas que le creds vous gagnera pas de risques supplémentaires d'atténuation et il suffit d'ajouter une couche supplémentaire de complexité. Assurez-vous de faire la bonne analyse avant de prendre une décision.
Chiffrer les mots de passe de fichiers, en utilisant par exemple GPG. Ajouter les clés sur votre ordinateur local et sur votre serveur. Décrypter le fichier et de le mettre à l'extérieur de votre dépôt des dossiers.
- Je utiliser un mot de passe.conf, situé dans mon repertoire. Sur tous les déployer, ce fichier est mis à jour.
Non, les clés privées et les mots de passe ne tombent pas sous le contrôle de révision. Il n'y a pas de raison de le fardeau de tout le monde avec un accès en lecture à votre dépôt avec la connaissance sensible de service informations d'identification utilisées dans la production, quand les plus susceptibles de ne pas tous d'entre eux devraient avoir accès à ces services.
De départ avec Django 1.4, votre Django projets sont livrés avec un
project.wsgi
module qui définit laapplication
de l'objet et c'est un endroit parfait pour commencer l'application de l'utilisation d'unproject.local
paramètres de module qui contient le site des configurations spécifiques.Ce module est ignoré du contrôle de révision, mais sa présence est requise lors de l'exécution de votre projet exemple comme une application WSGI, typique pour les environnements de production. C'est comment il devrait ressembler à:
Maintenant vous pouvez avoir une
local.py
module qui est le propriétaire et le groupe peut être configuré de sorte que seul le personnel autorisé et le Django processus peut lire le contenu du fichier.Si vous avez besoin de VCS pour vos secrets, vous devriez au moins les maintenir dans un deuxième référentiel séparés de vous code. De sorte que vous pouvez donner à vos membres de l'équipe de l'accès au référentiel de code source et qu'ils ne verront pas vos informations d'identification. En outre, l'hôte de ce référentiel à un autre endroit, par exemple. sur votre propre serveur avec un système de fichiers chiffré, pas sur github) et pour vérifier le système de production vous pouvez utiliser quelque chose comme git-sous-module.
Une autre approche pourrait être d'éviter complètement de sauver les secrets dans les systèmes de contrôle de version et au lieu d'utiliser un outil comme la voûte de hashicorp, un secret de stockage de clés de roulement et de l'audit, avec une API embarqué et de chiffrement.
C'est ce que je fais:
Les fichiers de modèle contiennent un espace réservé pour le secret, tels que:
mon.mot de passe=##MY_PASSWORD##
Sur le déploiement de l'application, le script est exécuté, qui transforme le fichier de modèle dans le fichier cible, remplaçant les espaces par des valeurs de variables d'environnement, comme le changement ##MY_PASSWORD## à la valeur de $MY_PASSWORD.
Vous pouvez utiliser EncFS si votre système dispose que. Ainsi, vous pouvez garder vos données cryptées comme un sous-dossier de votre référentiel, tout en offrant à votre demande un décrypté afficher les données de la montée de côté. Comme le cryptage est transparent, pas d'opérations spéciales sont nécessaires pour tirer ou pousser.
Toutefois, il serait nécessaire de monter le EncFS des dossiers, ce qui pourrait être fait par votre application à partir d'un mot de passe stocké ailleurs, en dehors de la version de dossiers (par exemple. les variables d'environnement).