Шифрование автономного пароля IMAP

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

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

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

16 голосов | спросил Tammer Ibrahim 29 J000000Sunday12 2012, 06:25:48

3 ответа


5

Еще один способ оставить автономную работу со знанием вашего пароля, но не помещая пароль на диск, заключается в том, чтобы оставить offlineimap запущенным в tmux /screen с помощью autorefresh включен в вашем ~/.offlineimaprc

Вам нужно добавить autorefresh = 10 в [Account X] файла offlineimaprc, чтобы проверить его каждые 10 минут. Также удалите любую конфигурационную строку с помощью password или passwordeval.

Затем запустите offlineimap - он попросит пароль и сохранит его в памяти. Он не выйдет после первого запуска, но будет спать в течение 10 минут. Затем он снова проснется и снова запустится, но он все равно сохранит ваш пароль.

Итак, вы можете оставить сеанс tmux, запущенный с помощью функции offlineimap, ввести пароль один раз, а offlineimap будет там хорошо.

ответил Hamish Downer 31 MarpmSun, 31 Mar 2013 21:02:22 +04002013-03-31T21:02:22+04:0009 2013, 21:02:22
26

Я использую следующий метод, который работает достаточно хорошо:

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 [email protected] > ~/.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()
ответил kbeta 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 17 Sep 2012 03:22:18 +0400 2012, 03:22:18
3

Любить ответ от @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 ''
ответил Hamish Downer 31 MarpmSun, 31 Mar 2013 17:23:34 +04002013-03-31T17:23:34+04:0005 2013, 17:23:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132