오프라인 IMAP 비밀번호 암호화

오프라인 IMAP 비밀번호 암호화

GPG 암호화 파일을 통해 인증하기 위해 OfflineIMAP을 설정하려고 합니다(모든 암호화를 gpg-agent 프로세스에 통합할 수 있도록).

문서에 따르면 서버 비밀번호를 암호화하는 유일한 방법은 gnome-keyring을 사용하는 것입니다(헤드리스 서버에서는 이것을 실행하고 싶지 않습니다). mutt를 사용하는 것처럼 gpg 파일에서 비밀번호를 입력하는 방법이 있나요?

Python 파일 확장자를 사용하여 오프라인 지도를 사용하여 추가 기능을 추가할 수 있다는 것을 알고 있지만 어디서부터 시작해야 할지 모르겠습니다.

답변1

나는 아주 잘 작동하는 다음 방법을 사용합니다.

1) 비밀번호를 별도의 GPG 암호화 파일에 저장하세요. 예를 들어~/.passwd/<accountname>.gpg

~/.offlineimap.py2) 다음 내용을 포함하여 원하는 이름(예: )으로 Python 확장 파일을 만듭니다 .

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를 사용하는 경우 각 계정의 비밀번호를 묻는 메시지가 표시됩니다. 파일()을 생성하여 에이전트를 시작하고, 오프라인 지도가 시작되면 파일을 복호화하여 gpg 에이전트를 시작합니다. 이렇게 하려면 끝에 다음을 추가하세요.echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.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()

답변2

암호를 알고 있지만 디스크에 암호를 저장하지 않고 Offlineimap을 실행하는 또 다른 방법은 Offlineimap을 tmux/screen에서 실행하고 autorefresh파일에서 이 설정을 활성화하는 것입니다.~/.offlineimaprc

10분마다 확인하도록 오프라인imaprc 파일 autorefresh = 10에 섹션을 추가해야 합니다 . [Account X]또한 password또는 를 사용하여 구성 줄을 제거합니다 passwordeval.

그런 다음 오프라인imap을 실행하십시오. 비밀번호를 묻고 메모리에 캐시합니다. 첫 번째 실행 후에는 종료되지 않지만 10분 동안 절전 모드로 전환됩니다. 그런 다음 깨어나서 다시 실행되지만 여전히 비밀번호를 기억합니다.

따라서 오프라인 매핑으로 실행 중인 tmux 세션을 그대로 두고 비밀번호를 한 번 입력한 후 오프라인으로 매핑할 수 있습니다.

답변3

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

답변4

ArchLinux 위키에는 다음과 같은 내용이 있습니다.좋은 정보.

아래와 같이 KDE 지갑에 비밀번호를 저장할 수 있습니다이 가이드.

~/offlineimaprc

[general]
accounts = main
pythonfile = ~/offlineimap.py

[Account main]
# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
localrepository = main-local
# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
remoterepository = main-remote

[Repository main-local]
# OfflineIMAP supports Maildir, GmailMaildir, and IMAP for local repositories.
type = Maildir
# Where should the mail be placed?
localfolders = ~/imap-backup

[Repository main-remote]
type = IMAP
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remotehost = my.host
remoteuser = my.user
remotepasseval = get_password()

~/offlineimap.py

#! /usr/bin/env python2
from subprocess import check_output

def get_password():
    return check_output('qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword "$(qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.open kdewallet 0 "kde-service-menu-nowardev-scanner")" "imap" "akonadi_imap_resource_0rc" "kde-service-menu-nowardev-scanner"', shell=True).splitlines()[0]

관련 정보