Criptografar a senha OfflineIMAP

16

Estou tentando configurar o OfflineIMAP para autenticar por meio de um arquivo criptografado por gpg (dessa forma, posso consolidar toda a minha criptografia no processo gpg-agent).

Na documentação, parece que a única maneira de criptografar as senhas de um servidor é usar o gnome-keyring (que eu prefiro não rodar no meu servidor headless). Existe uma maneira de canalizar minha senha de um arquivo gpg da maneira que você pode com o mutt?

Eu sei que você pode adicionar recursos extras ao offlineimap com o arquivo python de extensão, mas não sei por onde começar com isso.

    
por Tammer Ibrahim 29.07.2012 / 04:25

3 respostas

5

Outro método de deixar o offlineimap rodando com o conhecimento da sua senha, mas sem colocar a senha no disco, é deixar o offlineimap rodando no tmux / screen com a configuração autorefresh habilitada no seu ~/.offlineimaprc

Você precisa adicionar autorefresh = 10 à seção [Account X] do arquivo offlineimaprc para fazer a verificação a cada 10 minutos. Exclua também qualquer linha de configuração com password ou passwordeval .

Em seguida, execute o offlineimap - ele irá solicitar sua senha e armazená-la na memória. Não sairá após a primeira execução, mas durará 10 minutos. Em seguida, ele será ativado e executado novamente, mas ainda se lembrará da sua senha.

Então você pode deixar uma sessão do tmux rodando com o offlineimap, digitar sua senha uma vez, e o offlineimap ficará bem lá depois.

    
por 31.03.2013 / 19:02
26

Eu uso o seguinte método, que funciona bastante bem:

1) Armazene suas senhas em arquivos criptografados separados por gpg. Por exemplo ~/.passwd/<accountname>.gpg

2) Crie um arquivo de extensão do Python com um nome de sua escolha (por exemplo, ~/.offlineimap.py ), com o seguinte conteúdo:

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 seu arquivo .offlineimaprc para informá-lo sobre o arquivo python, e para dizer como ler suas senhas

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

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

Se você tiver várias contas verificadas simultaneamente (segmentos separados) e usar o gpg-agent, ele solicitará a senha de cada conta. Eu preparo o agente criando um arquivo ( echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg ) e inicializando o agente gpg descriptografando esse arquivo na inicialização do offlineimap. Para fazer isso, adicione o seguinte ao 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()
    
por 17.09.2012 / 01:22
3

Amando a resposta do @kbeta. No entanto, subprocess.check_output() foi introduzido apenas no python 2.7 - então aqui está uma versão do offlineimap.py que funcionará com versões mais antigas do 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 ''
    
por 31.03.2013 / 15:23