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ąć.



@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.


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 foo@bar.com > ~/.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()

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 ''
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.