Шифруйте пароль OfflineIMAP


19

Я намагаюся налаштувати OfflineIMAP для автентифікації через зашифрований файл gpg (таким чином я можу консолідувати все своє шифрування до мого процесу gpg-агента).

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

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



@jasonwryan Посилання не працює? NVM: Правильне посилання .
jw013

Це посилання трохи вводить в оману. Шифрування файлів - це хороший спосіб запобігти людям нічого корисного, коли вони вкрадуть ваш жорсткий диск / комп’ютер, але це лише незначний набір швидкості для зловмисного користувача root у тому самому вікні, в якому ви входите. rootКористувач може зробити багато речей , щоб обійти шифрування. Пам'ятайте, що навіть пересилання X11 з ненадійних машин (наприклад, через ssh -X) не є безпечним.
jw013

Я просто скидаю всі свої конфігураційні файли, що містять пароль, у контейнер ecryptfs, який монтується під час входу, замінюю оригінал символьним посиланням і виконую з ним.
jw013

Відповіді:


6

Інший спосіб залишити offlineimap за допомогою знання вашого пароля, але не ставлячи пароль на диск, - це залишити offlineimap працює в tmux / екрані з autorefreshналаштуванням, включеним у вашому~/.offlineimaprc

Вам потрібно додати autorefresh = 10до [Account X]розділу офлайн-файлу файл, щоб перевірити його кожні 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-агент, то він вимагає пройти парольну фразу для кожного облікового запису. Я 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.