加密离线IMAP密码


19

我正在尝试将OfflineIMAP设置为通过gpg加密文件进行身份验证(这样,我可以将所有加密整合到我的gpg-agent进程中)。

从文档中看来,加密一个人的服务器密码的唯一方法是使用gnome-keyring(我宁愿不要在无头服务器上运行)。有没有办法像使用mutt一样从gpg文件输入密码?

我知道您可以使用扩展python文件向offlineimap添加额外的功能,但是恐怕我不知道从哪里开始。


1

@jasonwryan链接断开了吗?NVM:正确链接
2012年

该链接有点误导。加密文件是防止人们在窃取您的硬盘/计算机时获得任何有用信息的好方法,但这对于恶意root用户在您登录的同一机器上只是一个小小的提速。root用户可以做很多事情来绕过加密。请记住,即使X11从不受信任的机器转发(例如,通过ssh -X)也不安全。
jw013

我只是将所有包含密码的配置文件转储到登录时挂载的ecryptfs容器中,将其替换为符号链接,然后完成操作。
2012年

Answers:


6

在不了解密码的情况下让offlineimap运行的另一种方法是,不将密码存储在磁盘上,而是autorefresh在您的启用了设置的情况下,在tmux / screen中使offlineimap运行~/.offlineimaprc

您需要添加autorefresh = 10[Account X]offlineimaprc文件的部分中,以使其每10分钟检查一次。也可以使用password或删除任何配置行passwordeval

然后运行offlineimap-它会询问您的密码并将其缓存在内存中。第一次运行后它不会退出,但会休眠10分钟。然后它将唤醒并再次运行,但它仍会记住您的密码。

因此,您可以让tmux会话与offlineimap一起运行,输入一次密码,然后在该状态下使用offlineimap即可。


29

我使用以下方法,效果很好:

1)将密码存储在单独的gpg加密文件中。例如~/.passwd/<accountname>.gpg

2)使用您选择的名称(例如)创建一个python扩展文件,其~/.offlineimap.py内容如下:

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)修改您的.offlineimaprc文件,以告知其有关python文件的信息,并告诉其如何读取密码

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

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

如果您有多个同时被检查的帐户(单独的线程),并且您使用gpg-agent,则它将要求您为每个帐户输入密码。我通过创建文件(echo "prime" | gpg -e -r foo@bar.com > ~/.passwd/prime.gpg)来启动代理,并通过在offlineimap启动时解密该文件来启动gpg代理。为此,请将以下内容添加到~/.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()

1
这个答案真的很好。只需确保使用绝对路径,否则subprocess命令将找不到加密的文件。
克莱门特B.

4

喜欢@kbeta的答案。但是subprocess.check_output()仅是在python 2.7中引入的-因此以下是该版本的offlineimap.py版本可与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 ''
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.