オフライン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を実行するもう1つの方法は、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 Wikiには次の内容があります。良い情報

以下のように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]

関連情報