Зашифровать OfflineIMAP пароль


19

Я пытаюсь настроить OfflineIMAP для аутентификации через зашифрованный файл gpg (таким образом я могу объединить все свое шифрование с процессом gpg-agent).

Из документации кажется, что единственный способ зашифровать пароли сервера - это использовать gnome-keyring (который я предпочел бы не запускать на моем безголовом сервере). Есть ли способ передать мой пароль из файла gpg так, как вы можете с помощью mutt?

Я знаю, что вы можете добавить дополнительные функции в offlineimap с помощью файла Python с расширением, но боюсь, я не знаю, с чего начать.


1
Имеет ли эта работа ?
jasonwryan

@jasonwryan Ссылка не работает? NVM: правильная ссылка .
jw013

Эта ссылка немного вводит в заблуждение. Шифрование файлов - это хороший способ не дать людям получить что-либо полезное, когда они крадут ваш жесткий диск / компьютер, но это всего лишь незначительный скачок скорости для злонамеренного пользователя root в том же окне, в котором вы вошли в систему. rootПользователь может многое сделать, чтобы обойти шифрование. Помните, что даже пересылка X11 с ненадежных машин (например, через ssh -X) небезопасна.
jw013

Я просто сбрасываю все мои файлы конфигурации, содержащие пароли, в контейнер ecryptfs, который монтируется при входе в систему, заменяю оригинал символической ссылкой и с этим покончено.
jw013

Ответы:


6

Другой способ оставить оффлайн-карту работающей, зная ваш пароль, но не помещая пароль на диск, - оставить оффлайн-карту запущенной в tmux / screen с autorefreshвключенной настройкой~/.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, он запросит у вас парольную фразу для каждой учетной записи. Я заполняю агент, создавая file ( echo "prime" | gpg -e -r foo@bar.com > ~/.passwd/prime.gpg), и запуская агент gpg, расшифровывая этот файл при запуске offlineimap. Для этого добавьте следующее в конец ~/.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
Этот ответ работает очень хорошо. Просто убедитесь, что вы используете абсолютные пути, иначе команда подпроцесса не найдет зашифрованные файлы.
Клемент Б.

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 ''
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.