Crypter le mot de passe IMAP hors ligne

19

J'essaie de configurer OfflineIMAP pour s'authentifier via un fichier crypté gpg (de cette façon, je peux consolider tout mon cryptage dans mon processus d'agent gpg).

D'après la documentation, il semble que la seule façon de crypter les mots de passe de son serveur soit d'utiliser gnome-keyring (que je préférerais ne pas exécuter sur mon serveur sans tête). Existe-t-il un moyen de transférer mon mot de passe à partir d'un fichier gpg comme vous le pouvez avec mutt?

Je sais que vous pouvez ajouter des fonctionnalités supplémentaires à offlineimap avec le fichier d'extension python, mais je crains de ne pas savoir par où commencer.

Tammer Ibrahim
la source
1
Est- ce que cela fonctionne ?
jasonwryan
@jasonwryan Link est en panne? NVM: lien correct .
jw013
Ce lien est un peu trompeur. Le chiffrement de fichiers est un bon moyen d'empêcher les gens d'obtenir quelque chose d'utile lorsqu'ils volent votre disque dur / ordinateur, mais ce n'est qu'un ralentissement mineur pour un utilisateur root malveillant sur la même boîte que celle sur laquelle vous vous connectez. Un rootutilisateur peut faire plusieurs choses pour contourner le chiffrement. N'oubliez pas que même le transfert X11 à partir de machines non fiables (par exemple via ssh -X) n'est pas sûr.
jw013
Je viens de vider tous mes fichiers de configuration contenant un mot de passe dans un conteneur ecryptfs qui se monte lorsque je me connecte, remplace l'original par un lien symbolique et j'en ai fini.
jw013
1
Consultez également quotenil.com/OfflineIMAP-with-Encrypted-Authinfo.html
Nikos Alexandris

Réponses:

6

Une autre méthode pour laisser offlineimap en cours d'exécution en connaissant votre mot de passe, mais sans mettre le mot de passe sur le disque, consiste à laisser offlineimap en cours d'exécution dans tmux / screen avec le autorefreshparamètre activé dans votre~/.offlineimaprc

Vous devez ajouter autorefresh = 10à la [Account X]section du fichier offlineimaprc, pour le faire vérifier toutes les 10 minutes. Supprimez également toute ligne de configuration avec passwordou passwordeval.

Exécutez ensuite offlineimap - il vous demandera votre mot de passe et le mettra en mémoire cache. Il ne sortira pas après la première manche, mais dormira pendant 10 minutes. Ensuite, il se réveillera et fonctionnera à nouveau, mais il se souviendra toujours de votre mot de passe.

Vous pouvez donc laisser une session tmux en cours avec offlineimap, entrez votre mot de passe une fois, et offlineimap ira bien après.

Hamish Downer
la source
29

J'utilise la méthode suivante, qui fonctionne assez bien:

1) Stockez vos mots de passe dans des fichiers chiffrés gpg séparés. Par exemple~/.passwd/<accountname>.gpg

2) Créez un fichier d'extension python avec le nom de votre choix (par exemple, ~/.offlineimap.py), avec le contenu suivant:

def mailpasswd(acct):
  acct = os.path.basename(acct)
  path = "/home/<username>/.passwd/%s.gpg" % acct
  args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
  try:
    return subprocess.check_output(args).strip()
  except subprocess.CalledProcessError:
    return ""

3) Modifiez votre fichier .offlineimaprc pour lui parler du fichier python et lui dire comment lire vos mots de passe

[general]
pythonfile = ~/.offlineimap.py
# ...

[Repository <reponame>]
# add this line for each remote repository
remotepasseval = mailpasswd("<accountname>")

Si vous avez plusieurs comptes qui sont vérifiés simultanément (threads séparés) et que vous utilisez gpg-agent, il vous demandera un mot de passe pour chaque compte. J'amorce l'agent en créant un fichier ( echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg), et en amorçant l'agent gpg en déchiffrant ce fichier au lancement de offlineimap. Pour ce faire, ajoutez ce qui suit à la fin de ~/.offlineimap.py:

def prime_gpg_agent():
  ret = False
  i = 1
  while not ret:
    ret = (mailpasswd("prime") == "prime")
    if i > 2:
      from offlineimap.ui import getglobalui
      sys.stderr.write("Error reading in passwords. Terminating.\n")
      getglobalui().terminate()
    i += 1
  return ret

prime_gpg_agent()
kbeta
la source
1
Cette réponse fonctionne très bien. Assurez-vous simplement d'utiliser des chemins absolus, sinon la commande de sous-processus ne trouvera pas les fichiers chiffrés.
Clément B.
4

Aimer la réponse de @kbeta. Cependant, subprocess.check_output()il n'a été introduit qu'en python 2.7 - voici donc une version offlineimap.pyqui fonctionnera avec les anciennes versions de python:

import os
import subprocess

def mailpasswd(acct):
    acct = os.path.basename(acct)
    path = "/home/hamish/.passwd/%s.gpg" % acct
    args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
    proc = subprocess.Popen(args, stdout=subprocess.PIPE)
    output = proc.communicate()[0].strip()
    retcode = proc.wait()
    if retcode == 0:
        return output
    else:
        return ''
Hamish Downer
la source