Entrez des mots de passe invisibles à l’aide de ce module Python


  • Français


  • Les mots de passe sont particulièrement problématiques pour les programmeurs. Vous n’êtes pas censé les stocker sans les chiffrer, et vous n’êtes pas censé révéler ce qui a été tapé lorsque votre utilisateur en saisit un. Cela est devenu particulièrement important pour moi lorsque j’ai décidé de renforcer la sécurité de mon ordinateur portable. Je chiffre mon répertoire personnel, mais une fois connecté, tout mot de passe stocké sous forme de texte brut dans un fichier de configuration est potentiellement exposé aux regards indiscrets.

    Plus précisément, j’utilise une application appelée Cabot comme mon client de messagerie. Il me permet de lire et de rédiger des e-mails dans mon terminal Linux, mais il attend normalement un mot de passe dans son fichier de configuration. J’ai restreint les autorisations sur mon fichier de configuration Mutt afin que moi seul puisse le voir, mais je suis le seul utilisateur de mon ordinateur portable, donc je ne suis pas vraiment préoccupé par les utilisateurs authentifiés qui regardent par inadvertance mes configurations. Au lieu de cela, je voulais me protéger contre la publication distraite de ma configuration en ligne, que ce soit pour me vanter ou pour le contrôle de version, avec mon mot de passe exposé. De plus, bien que je n’attende pas d’invités indésirables sur mon système, je voulais m’assurer qu’un intrus ne pourrait pas obtenir mon mot de passe simplement en exécutant cat sur ma config.

    Python GnuPG

    Le module Python python-gnupg est un wrapper Python pour le gpg application. Le nom du module est python-gnupg, qu’il ne faut pas confondre avec un module appelé gnupg.

    GnuPG (GPG) est le système de cryptage par défaut pour Linux, et je l’utilise depuis 2009 environ. Je me sens à l’aise avec lui et j’ai une grande confiance en sa sécurité.

    J’ai décidé que la meilleure façon d’obtenir mon mot de passe dans Mutt était de stocker mon mot de passe dans un fichier GPG crypté, de créer une invite pour que mon mot de passe GPG déverrouille le fichier crypté et de remettre le mot de passe à Mutt (en fait au offlineimap commande que j’utilise pour synchroniser mon ordinateur portable avec le serveur de messagerie).

    Obtenir des entrées utilisateur avec Python est assez facile. Vous appelez input, et quel que soit le type d’utilisateur est stocké en tant que variable :

    print("Enter password: ")
    myinput = input()

    print("You entered: ", myinput)

    Mon problème était que lorsque j’ai tapé un mot de passe dans le terminal en réponse à mon invite de mot de passe, tout ce que j’ai tapé était visible pour quiconque regardait par-dessus mon épaule ou parcourait l’historique de mon terminal :

    $ ./test.py
    Enter password: my-Complex-Passphrase

    Saisie du mot de passe invisible avec getpass

    Comme c’est souvent le cas, il existe un module Python qui a déjà résolu mon problème. Le module est getpass4, et du point de vue de l’utilisateur, il se comporte exactement comme input sauf sans afficher ce que l’utilisateur tape.

    Vous pouvez installer les deux modules avec pip :

    $ python -m pip install --user
    python-gnupg getpass4

    Voici mon script Python pour créer une invite de mot de passe :

    #!/usr/bin/env python
    # by Seth Kenlon
    # GPLv3

    # install deps:
    # python3 -m pip install --user python-gnupg getpass4

    import gnupg
    import getpass
    from pathlib import Path

    def get_api_pass():
        homedir = str(Path.home())
        gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True)
        passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None)

        with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f:
            apipass = (gpg.decrypt_file(f, passphrase=passwd))

        f.close()

        return str(apipass)
       
    if __name__ == "__main__":
        apipass = get_api_pass()
        print(apipass)

    Enregistrez le fichier sous password_prompt.py si vous voulez l’essayer. Si vous utilisez offlineimap et souhaitez utiliser cette solution pour saisir votre propre mot de passe, puis enregistrez-le dans un emplacement que vous pouvez pointer offlineimap à dans votre .offlineimaprc fichier (j’utilise ~/.mutt/password_prompt.py).

    Test de l’invite de mot de passe

    Pour voir le script en action, vous devez d’abord créer un fichier crypté (je suppose que vous avez déjà configuré GPG) :

    $ echo "hello world" > pass
    $ gpg --encrypt pass
    $ mv pass.gpg ~/.mutt/pass.gpg
    $ rm pass

    Exécutez maintenant le script Python :

    $ python ~/.mutt/password_prompt.py
    Enter your GPG password:
    hello world

    Rien ne s’affiche pendant que vous tapez, mais tant que vous saisissez correctement votre mot de passe GPG, vous verrez le message de test.

    Intégration de l’invite de mot de passe avec offlineimap

    J’avais besoin d’intégrer ma nouvelle invite avec le offlineimap commander. J’ai choisi Python pour ce script parce que je savais que offlineimap peut faire des appels à des applications Python. Si vous êtes un offlineimap utilisateur, vous apprécierez que la seule “intégration” requise est de changer deux lignes dans votre .offlineimaprc déposer.

    Tout d’abord, ajoutez une ligne référençant le fichier Python :

    pythonfile = ~/.mutt/password_prompt.py

    Et puis remplacez le remotepasseval faire la queue .offlineimaprc avec un appel au get_api_pass() fonction dans password_prompt.py:

    remotepasseval = get_api_pass()

    Fini les mots de passe dans votre fichier de configuration !

    Questions de sécurité

    Il est parfois presque paranoïaque de penser aux détails de sécurité sur votre ordinateur personnel. Votre configuration SSH doit-elle vraiment être limitée à 600 ? Est-ce vraiment important que votre mot de passe de messagerie soit dans un fichier de configuration sans importance enfoui dans un dossier caché appelé, de toutes choses, .mutt? Probablement pas.

    Et pourtant, sachant que je n’ai pas de données sensibles discrètement cachées dans mes fichiers de configuration, il me est beaucoup plus facile de valider des fichiers dans des référentiels Git publics, de copier et coller des extraits dans les forums de support et de partager mes connaissances sous la forme de fichiers de configuration réels et connus. Rien que pour cela, l’amélioration de la sécurité m’a facilité la vie. Et avec autant d’excellents modules Python disponibles pour vous aider, il est facile à mettre en œuvre.

    Source

    Houssen Moshinaly

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Copy code