Enkripsi Kata Sandi OfflineIMAP

19

Saya mencoba menyiapkan OfflineIMAP untuk mengautentikasi melalui file terenkripsi gpg (dengan cara itu saya dapat menggabungkan semua enkripsi saya ke proses gpg-agent saya).

Dari dokumentasi, sepertinya satu-satunya cara untuk mengenkripsi kata sandi server seseorang adalah dengan menggunakan gnome-keyring (yang saya lebih suka tidak berjalan di server tanpa kepala saya). Apakah ada cara untuk memasukkan kata sandi saya dari file gpg seperti yang Anda bisa dengan mutt?

Saya tahu Anda dapat menambahkan fitur tambahan ke offlineimap dengan file ekstensi python, tapi saya khawatir saya tidak tahu harus mulai dari mana dengan itu.

Tammer Ibrahim
sumber
1
Apakah ini berhasil ?
jasonwryan
@jasonwryan Link sedang down? NVM: Tautan yang benar .
jw013
Tautan itu agak menyesatkan. Mengenkripsi file adalah cara yang baik untuk mencegah orang mendapatkan sesuatu yang bermanfaat ketika mereka mencuri hard drive / komputer Anda, tetapi itu hanya sedikit peningkatan kecepatan bagi pengguna root jahat di kotak yang sama dengan yang Anda masuki. Ada banyak hal yang rootbisa dilakukan pengguna untuk menyiasati enkripsi. Ingatlah bahwa bahkan penerusan X11 dari mesin yang tidak terpercaya (mis. Via ssh -X) tidak aman.
jw013
Saya hanya membuang semua file konfigurasi yang berisi kata sandi saya dalam wadah ecryptfs yang dipasang ketika saya masuk, ganti yang asli dengan symlink, dan selesai dengan itu.
jw013

Jawaban:

6

Metode lain untuk membiarkan offlineimap berjalan dengan pengetahuan kata sandi Anda, tetapi tanpa meletakkan kata sandi pada disk, adalah membiarkan offlineimap berjalan di tmux / layar dengan autorefreshpengaturan yang diaktifkan di Anda~/.offlineimaprc

Anda perlu menambahkan autorefresh = 10ke [Account X]bagian file offlineimaprc, untuk memeriksanya setiap 10 menit. Hapus juga baris konfigurasi dengan passwordatau passwordeval.

Kemudian jalankan offlineimap - ia akan meminta kata sandi Anda dan menyimpannya di memori. Ini tidak akan keluar setelah menjalankan pertama, tetapi akan tidur selama 10 menit. Kemudian ia akan bangun dan berjalan lagi, tetapi ia masih mengingat kata sandi Anda.

Jadi Anda dapat membiarkan sesi tmux berjalan dengan offlineimap, masukkan kata sandi Anda sekali, dan offlineimap akan baik-baik saja setelahnya.

Hamish Downer
sumber
29

Saya menggunakan metode berikut, yang bekerja cukup baik:

1) Simpan kata sandi Anda dalam file terenkripsi gpg terpisah. Sebagai contoh~/.passwd/<accountname>.gpg

2) Buat file ekstensi python dengan nama yang Anda pilih (misalnya, ~/.offlineimap.py), dengan konten berikut:

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) Ubah file .offlineimaprc Anda untuk memberi tahu tentang file python, dan untuk memberi tahu cara membaca kata sandi Anda

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

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

Jika Anda memiliki beberapa akun yang diperiksa secara bersamaan (utas terpisah), dan Anda menggunakan agen gpg, maka ia akan meminta frasa sandi Anda untuk setiap akun. Saya prima agen dengan membuat file ( echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg), dan priming agen gpg dengan mendekripsi file ini pada peluncuran offlineimap. Untuk melakukan ini, tambahkan berikut ini di akhir ~/.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
sumber
1
Jawaban ini bekerja dengan sangat baik. Pastikan Anda menggunakan jalur absolut, atau perintah subproses tidak akan menemukan file yang dienkripsi.
Clément B.
4

Mencintai jawaban dari @kbeta. Namun subprocess.check_output()hanya diperkenalkan di python 2.7 - jadi di sini adalah versi offlineimap.pyyang akan bekerja dengan versi python yang lebih lama:

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
sumber