web-dev-qa-db-fra.com

Stockage des secrets (mots de passe) dans un fichier séparé

Quelle est la façon la plus simple de stocker les secrets d'application (mots de passe, jetons d'accès) pour un script Python? Je pensais que ce serait un *.yml fichier comme dans Ruby mais étonnamment j'ai trouvé que ce n'était pas le cas. Alors qu'est-ce que c'est alors? Quelles sont les solutions les plus simples?

Je veux les mettre dans un fichier séparé parce que de cette façon je serai incapable pour pousser ce fichier vers un dépôt github.

35
アレックス

Je pense que le stockage des informations d'identification dans un autre fichier * py est votre pari le plus sûr. Il suffit ensuite de l'importer. L'exemple ressemblerait à ceci

config.py

username = "xy"
password = "abcd"

main.py

import config
login(config.username, config.password)
49
kecer

Je m'occupais exactement de la même question et je me suis finalement retrouvé avec la même solution que kecer suggérée. Comme je dois l'utiliser avec des dizaines de scripts, j'ai créé ma propre bibliothèque. Permettez-moi de partager cette solution avec vous.

credlib.py - bibliothèque universelle pour gérer les informations d'identification

class credential:
    def __init__(self, hostname, username, password):
        self.hostname = hostname
        self.username = username
        self.password = password

mycredentials.py - mon fichier local pour stocker toutes les informations d'identification

from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")

mysystemlib.py - il s'agit d'une bibliothèque générale pour accéder à mon système (le nouveau système d'informations d'identification et l'héritage sont pris en charge)

from credlib import credential

def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition

    if len(args) == 1 and isinstance(args[0], credential):
        hostname = args[0].hostname
        username = args[0].username
        password = args[0].password
    Elif len(args) == 3:
        hostname = args[0]
        username = args[1]
        password = args[2]
    else:
        raise ValueError('Invalid arguments')

    do_login(hostname, username, password) # this is original system login call

main.py - script principal qui combine les informations d'identification et les bibliothèques système

from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)

Veuillez noter que la manière héritée de nom d'hôte/nom d'utilisateur/mot de passe fonctionne toujours afin qu'elle n'affecte pas les anciens scripts:

mysystemlib.system_login("srv02", "user", "pass")

Cela présente de nombreux avantages:

  • même système d'informations d'identification sur tous nos scripts python
  • les fichiers avec des mots de passe sont séparés (les fichiers peuvent avoir des autorisations plus strictes)
  • les fichiers ne sont pas stockés dans nos référentiels git (exclus via .gitignore) afin que nos python puissent être partagés avec d'autres sans exposer les informations d'identification (chacun définit ses propres informations d'identification dans ses fichiers locaux)
  • si un mot de passe doit être changé, nous le faisons en un seul endroit
5
CraZ