Mã hóa mật khẩu OfflineIMAP


19

Tôi đang cố gắng thiết lập OfflineIMAP để xác thực thông qua tệp được mã hóa gpg (theo cách đó tôi có thể hợp nhất tất cả mã hóa của mình vào quy trình đại lý gpg của mình).

Từ tài liệu này, có vẻ như cách duy nhất để mã hóa mật khẩu máy chủ của một người là sử dụng khóa gnome (mà tôi không muốn chạy trên máy chủ không đầu của mình). Có cách nào để lấy mật khẩu của tôi từ tệp gpg theo cách bạn có thể với mutt không?

Tôi biết bạn có thể thêm các tính năng bổ sung vào offlineimap với tệp python mở rộng, nhưng tôi sợ tôi sẽ không biết bắt đầu từ đâu với điều đó.


1
Nó có hoạt động không?
jasonwryan

@jasonwryan Liên kết bị sập? NVM: Liên kết đúng .
jw013

Liên kết đó là một chút sai lệch. Mã hóa tập tin là một cách tốt để ngăn mọi người lấy bất cứ thứ gì hữu ích khi họ đánh cắp ổ cứng / máy tính của bạn, nhưng đó chỉ là một cú hích tốc độ nhỏ cho người dùng root độc hại trên cùng một hộp bạn đang đăng nhập. Có nhiều điều rootngười dùng có thể làm để có được xung quanh mã hóa. Hãy nhớ rằng ngay cả chuyển tiếp X11 từ các máy không tin cậy (ví dụ qua ssh -X) không an toàn.
jw013

Tôi chỉ đổ tất cả các tệp cấu hình chứa mật khẩu của mình vào một thùng chứa ecryptfs gắn kết khi tôi đăng nhập, thay thế bản gốc bằng một liên kết tượng trưng và được thực hiện với nó.
jw013

Câu trả lời:


6

Một phương pháp khác để offlineimap chạy với kiến ​​thức về mật khẩu của bạn, nhưng không đặt mật khẩu vào đĩa, là để offlineimap chạy trong tmux / màn hình với autorefreshcài đặt được bật trong~/.offlineimaprc

Bạn cần thêm autorefresh = 10vào [Account X]phần của tệp offlineimaprc, để có được nó để kiểm tra cứ sau 10 phút. Cũng xóa bất kỳ dòng cấu hình với passwordhoặc passwordeval.

Sau đó chạy offlineimap - nó sẽ hỏi mật khẩu của bạn và lưu nó vào bộ nhớ. Nó sẽ không thoát sau lần chạy đầu tiên, nhưng sẽ ngủ trong 10 phút. Sau đó, nó sẽ thức dậy và chạy lại, nhưng nó vẫn sẽ nhớ mật khẩu của bạn.

Vì vậy, bạn có thể để một phiên tmux chạy với offlineimap, nhập mật khẩu của bạn một lần và offlineimap sẽ ổn ở đó sau đó.


29

Tôi sử dụng phương pháp sau, hoạt động khá tốt:

1) Lưu trữ mật khẩu của bạn trong các tệp được mã hóa gpg riêng. Ví dụ~/.passwd/<accountname>.gpg

2) Tạo tệp tiện ích mở rộng python với tên bạn chọn (ví dụ ~/.offlineimap.py:), với các nội dung sau:

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) Sửa đổi tệp .offlineimaprc của bạn để cho nó biết về tệp python và cho nó biết cách đọc mật khẩu của bạn

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

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

Nếu bạn có một số tài khoản được kiểm tra đồng thời (các luồng riêng biệt) và bạn sử dụng gpg-agent, thì nó sẽ yêu cầu bạn mật khẩu cho mỗi tài khoản. Tôi ưu tiên tác nhân bằng cách tạo một tệp ( echo "prime" | gpg -e -r foo@bar.com > ~/.passwd/prime.gpg) và mồi tác nhân gpg bằng cách giải mã tệp này khi khởi chạy offlineimap. Để làm điều này, thêm phần sau vào cuối ~/.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
Câu trả lời này hoạt động thực sự tốt. Chỉ cần đảm bảo rằng bạn sử dụng các đường dẫn tuyệt đối hoặc lệnh quy trình con sẽ không tìm thấy các tệp được mã hóa.
Clément B.

4

Yêu câu trả lời từ @kbeta. Tuy nhiên subprocess.check_output()chỉ được giới thiệu trong python 2.7 - vì vậy đây là phiên bản offlineimap.pysẽ hoạt động với các phiên bản cũ hơn của 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 ''
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.