เข้ารหัสรหัสผ่าน OfflineIMAP


19

ฉันกำลังพยายามตั้งค่า OfflineIMAP เพื่อรับรองความถูกต้องผ่านไฟล์ที่เข้ารหัส gpg (วิธีที่ฉันสามารถรวมการเข้ารหัสทั้งหมดของฉันกับกระบวนการตัวแทน gpg ของฉัน)

ดูเหมือนว่าวิธีเดียวในการเข้ารหัสรหัสผ่านเซิร์ฟเวอร์ของคน ๆ หนึ่งคือการใช้ gnome-keyring (ซึ่งฉันไม่ต้องการให้ทำงานบนเซิร์ฟเวอร์ที่ไม่มีหัว) มีวิธีไพพ์ในรหัสผ่านของฉันจากไฟล์ gpg ในแบบที่คุณสามารถทำได้ด้วย mutt หรือไม่?

ฉันรู้ว่าคุณสามารถเพิ่มฟีเจอร์พิเศษให้กับ offlineimap ด้วยไฟล์นามสกุลหลาม แต่ฉันเกรงว่าจะไม่รู้ว่าจะเริ่มจากตรงไหน



@jasonwryan Link ไม่ทำงาน NVM: การเชื่อมโยงที่ถูกต้อง
jw013

ลิงค์นั้นทำให้เข้าใจผิดเล็กน้อย การเข้ารหัสไฟล์เป็นวิธีที่ดีในการป้องกันไม่ให้ผู้อื่นได้รับสิ่งใดมีประโยชน์เมื่อพวกเขาขโมยฮาร์ดไดรฟ์ / คอมพิวเตอร์ของคุณ แต่มันเป็นเพียงการกระแทกความเร็วเล็กน้อยสำหรับผู้ใช้รูทที่เป็นอันตรายในช่องเดียวกับที่คุณลงชื่อเข้าใช้ มีหลายสิ่งที่rootผู้ใช้สามารถทำได้เพื่อหลีกเลี่ยงการเข้ารหัส โปรดจำไว้ว่าแม้การส่งต่อ X11 จากเครื่องที่ไม่น่าเชื่อถือ (เช่นผ่านssh -X) ไม่ปลอดภัย
jw013

ฉันเพิ่งถ่ายโอนไฟล์การกำหนดค่าที่มีรหัสผ่านทั้งหมดของฉันในคอนเทนเนอร์ecryptfsที่เมาท์เมื่อฉันเข้าสู่ระบบแทนที่ต้นฉบับด้วย symlink และทำได้ด้วย
jw013

คำตอบ:


6

อีกวิธีหนึ่งในการปล่อยให้ออฟไลน์แผนที่ทำงานโดยใช้ความรู้เกี่ยวกับรหัสผ่านของคุณ แต่ไม่ต้องใส่รหัสผ่านบนดิสก์คือการปล่อยให้ออฟไลน์แผนที่ทำงานใน tmux / หน้าจอด้วยการautorefreshตั้งค่าที่เปิดใช้งานใน~/.offlineimaprc

คุณต้องเพิ่มautorefresh = 10ไปยัง[Account X]ส่วนของไฟล์ offlineimaprc เพื่อให้มันตรวจสอบทุกๆ 10 นาที ลบเส้นการตั้งค่าใด ๆ กับหรือ passwordpasswordeval

จากนั้นจึงเรียกใช้ offlineimap - มันจะถามรหัสผ่านของคุณและแคชในหน่วยความจำ มันจะไม่ออกหลังจากวิ่งครั้งแรก แต่จะนอนประมาณ 10 นาที จากนั้นจะเริ่มทำงานอีกครั้ง แต่จะยังจำรหัสผ่านของคุณได้

ดังนั้นคุณสามารถออกจากเซสชัน tmux ที่รันด้วย offlineimap ป้อนรหัสผ่านของคุณหนึ่งครั้งและ offlineimap จะใช้ได้หลังจากนั้น


29

ฉันใช้วิธีการต่อไปนี้ซึ่งใช้งานได้ดี:

1) จัดเก็บรหัสผ่านของคุณในไฟล์ที่เข้ารหัสแบบแยกต่างหาก gpg ตัวอย่างเช่น~/.passwd/<accountname>.gpg

2) สร้างไฟล์นามสกุลหลามด้วยชื่อที่คุณเลือก (เช่น, ~/.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-agent มันจะขอข้อความรหัสผ่านสำหรับแต่ละบัญชี ฉันทำเอเจนต์ด้วยการสร้างไฟล์ ( echo "prime" | gpg -e -r foo@bar.com > ~/.passwd/prime.gpg) และเตรียมตัวแทนเอเจนต์ gpg ไว้ด้วยการถอดรหัสไฟล์นี้เมื่อเปิดใช้งานออฟไลน์แผนที่ เมื่อต้องการทำสิ่งนี้เพิ่มสิ่งต่อไปนี้ในตอนท้ายของ~/.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
คำตอบนี้ใช้ได้ดีจริงๆ เพียงตรวจสอบให้แน่ใจว่าคุณใช้พา ธ สัมบูรณ์หรือคำสั่ง subprocess ไม่พบไฟล์ที่เข้ารหัส
Clément B.

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 ''
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.