Cifrar la contraseña de IMAP sin conexión

19

Estoy tratando de configurar OfflineIMAP para autenticarse a través de un archivo cifrado gpg (de esa manera puedo consolidar todo mi cifrado en mi proceso de agente gpg).

Según la documentación, parece que la única forma de cifrar las contraseñas del servidor es usar gnome-keyring (que preferiría no ejecutar en mi servidor sin cabeza). ¿Hay alguna forma de canalizar mi contraseña desde un archivo gpg de la misma manera que puede hacerlo con mutt?

Sé que puede agregar características adicionales a offlineimap con el archivo de extensión python, pero me temo que no sabría por dónde empezar con eso.

Tammer Ibrahim
fuente
1
¿ Esto funciona ?
jasonwryan
@jasonwryan Link está caído? NVM: enlace correcto .
jw013
Ese enlace es un poco engañoso. Cifrar archivos es una buena manera de evitar que las personas obtengan algo útil cuando roban su disco duro / computadora, pero es solo un pequeño aumento de velocidad para un usuario root malicioso en el mismo cuadro en el que está iniciando sesión. Hay muchas cosas que un rootusuario podría hacer para evitar el cifrado. Recuerde que incluso el reenvío X11 desde máquinas no confiables (por ejemplo, a través de ssh -X) no es seguro.
jw013
Simplemente descargo todos mis archivos de configuración que contienen contraseñas en un contenedor ecryptfs que se monta cuando inicio sesión, reemplazo el original con un enlace simbólico y listo.
jw013
1
Consulte también quotenil.com/OfflineIMAP-with-Encrypted-Authinfo.html
Nikos Alexandris

Respuestas:

6

Otro método para dejar offlineimap ejecutándose con conocimiento de su contraseña, pero sin poner la contraseña en el disco, es dejar offlineimap ejecutándose en tmux / screen con la autorefreshconfiguración habilitada en su~/.offlineimaprc

Debe agregar autorefresh = 10a la [Account X]sección del archivo offlineimaprc para que se verifique cada 10 minutos. También elimine cualquier línea de configuración con passwordo passwordeval.

Luego ejecute offlineimap: le pedirá su contraseña y la almacenará en la memoria caché. No saldrá después de la primera ejecución, pero dormirá durante 10 minutos. Luego se activará y volverá a ejecutarse, pero aún recordará su contraseña.

Por lo tanto, puede dejar una sesión tmux ejecutándose con offlineimap, ingrese su contraseña una vez y offlineimap estará bien allí después.

Hamish Downer
fuente
29

Utilizo el siguiente método, que funciona bastante bien:

1) Almacene sus contraseñas en archivos cifrados gpg separados. Por ejemplo~/.passwd/<accountname>.gpg

2) Cree un archivo de extensión de Python con el nombre que elija (por ejemplo, ~/.offlineimap.py), con el siguiente contenido:

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) Modifique su archivo .offlineimaprc para informarle sobre el archivo python y para indicarle cómo leer sus contraseñas.

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

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

Si tiene varias cuentas que se verifican simultáneamente (hilos separados) y usa gpg-agent, le pedirá una frase de contraseña para cada cuenta. Preparo el agente creando un archivo ( echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg) y preparando el agente gpg descifrando este archivo al iniciar offlineimap. Para hacer esto, agregue lo siguiente al final 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
fuente
1
Esta respuesta funciona muy bien. Solo asegúrese de usar rutas absolutas, o el comando de subproceso no encontrará los archivos cifrados.
Clément B.
4

Me encanta la respuesta de @kbeta. Sin embargo subprocess.check_output(), solo se introdujo en Python 2.7, así que aquí hay una versión offlineimap.pyque funcionará con versiones anteriores 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
fuente