Szyfruj hasło OfflineIMAP

19

Próbuję skonfigurować OfflineIMAP do uwierzytelniania za pomocą pliku zaszyfrowanego gpg (w ten sposób mogę skonsolidować całe moje szyfrowanie do mojego procesu agenta gpg).

Z dokumentacji wynika, że ​​jedynym sposobem szyfrowania haseł do serwera jest użycie klucza gnome (którego wolałbym nie uruchamiać na moim bezgłowym serwerze). Czy istnieje sposób na potokowanie mojego hasła z pliku gpg w sposób, w jaki możesz to zrobić za pomocą mutta?

Wiem, że możesz dodać dodatkowe funkcje do offlineimap za pomocą rozszerzenia pliku python, ale obawiam się, że nie wiedziałbym od czego zacząć.

Tammer Ibrahim
źródło
1
Czy to działa ?
jasonwryan
@jasonwryan Link nie działa? NVM: Prawidłowy link .
jw013,
Ten link jest nieco mylący. Szyfrowanie plików to dobry sposób, aby zapobiec uzyskiwaniu przez użytkowników czegoś przydatnego podczas kradzieży dysku twardego / komputera, ale jest to tylko niewielki wzrost prędkości dla złośliwego użytkownika root w tym samym polu, na którym się logujesz. Jest wiele rzeczy, które rootużytkownik może zrobić, aby obejść szyfrowanie. Pamiętaj, że nawet przekazywanie X11 z niezaufanych maszyn (np. Przez ssh -X) nie jest bezpieczne.
jw013
Po prostu zrzucam wszystkie moje pliki konfiguracyjne zawierające hasło do kontenera ecryptfs, który montuje się podczas logowania, zastępuję oryginał dowiązaniem symbolicznym i gotowe.
jw013

Odpowiedzi:

6

Inną metodą pozostawienia działającej mapy offline ze znajomością hasła, ale bez umieszczania hasła na dysku, jest pozostawienie działającej mapy offline w tmux / screen z autorefreshwłączonym ustawieniem~/.offlineimaprc

Musisz dodać autorefresh = 10do [Account X]sekcji pliku offlineimaprc, aby sprawdzać co 10 minut. Usuń także dowolną linię konfiguracji za pomocą passwordlub passwordeval.

Następnie uruchom offlineimap - poprosi o hasło i zapisze je w pamięci podręcznej. Nie wyjdzie po pierwszym uruchomieniu, ale będzie spał przez 10 minut. Potem się obudzi i uruchomi ponownie, ale nadal będzie pamiętał twoje hasło.

Możesz więc zostawić sesję tmux uruchomioną z offlineimap, wpisz hasło raz, a offlineimap będzie w porządku.

Hamish Downer
źródło
29

Używam następującej metody, która działa dość dobrze:

1) Przechowuj hasła w osobnych plikach zaszyfrowanych gpg. Na przykład~/.passwd/<accountname>.gpg

2) Utwórz plik rozszerzenia Python o wybranej nazwie (np. ~/.offlineimap.py), O następującej treści:

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) Zmodyfikuj plik .offlineimaprc, aby poinformować go o pliku python i dowiedzieć się, jak czytać hasła

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

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

Jeśli masz kilka kont sprawdzanych jednocześnie (osobne wątki) i korzystasz z gpg-agent, to poprosi o podanie hasła dla każdego konta. echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpgPrzygotowuję agenta, tworząc plik ( ) i uruchamiając agenta gpg, odszyfrowując ten plik podczas uruchamiania offlineimap. Aby to zrobić, dodaj na końcu ~/.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
źródło
1
Ta odpowiedź działa naprawdę dobrze. Upewnij się tylko, że używasz ścieżek bezwzględnych, w przeciwnym razie polecenie podprocesu nie znajdzie zaszyfrowanych plików.
Clément B.
4

Podoba mi się odpowiedź @kbeta. Jednak subprocess.check_output()został wprowadzony tylko w Pythonie 2.7 - więc jego wersja offlineimap.pybędzie działać ze starszymi wersjami Pythona:

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
źródło