web-dev-qa-db-ja.com

OfflineIMAPパスワードを暗号化する

私はOfflineIMAPを設定して、gpg暗号化ファイルを介して認証するようにしています(これにより、すべての暗号化をgpg-agentプロセスに統合できます)。

ドキュメントから、サーバーのパスワードを暗号化する唯一の方法は、gnome-keyringを使用することです(これは、ヘッドレスサーバーでは実行しない方がよいでしょう)。 muttでできるように、gpgファイルから私のパスワードをパイプする方法はありますか?

拡張子pythonファイルを使用して、offlineimapに追加の機能を追加できることはわかっていますが、どこから始めればよいかわかりません。

19
Tammer Ibrahim

パスワードを知っている状態でofflineimapを実行したままにする別の方法ですが、パスワードをディスクに保存せずに、~/.offlineimaprcautorefresh設定を有効にして、tmux/screenでofflineimapを実行したままにします。

10分ごとにチェックするためには、offlineimaprcファイルのautorefresh = 10セクションに[Account X]を追加する必要があります。 passwordまたはpasswordevalを含む構成行も削除します。

次に、offlineimapを実行します-パスワードを要求し、メモリにキャッシュします。最初の実行後は終了しませんが、10分間スリープします。その後、起動して再度実行されますが、パスワードは記憶されています。

したがって、offlineimapを使用してtmuxセッションを実行したままにし、パスワードを1回入力すれば、offlineimapはその後正常に動作します。

6
Hamish Downer

私は次の方法を使用していますが、これはかなりうまくいきます。

1)パスワードを個別のgpg暗号化ファイルに保存します。たとえば~/.passwd/<accountname>.gpg

2)python拡張ファイルを作成し、次の内容で、選択した名前(例:~/.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 [email protected] > ~/.passwd/prime.gpg)を作成してエージェントを準備し、offlineimapの起動時にこのファイルを復号化して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()
29
kbeta

@kbetaからの回答を愛する。ただし、subprocess.check_output()はpython 2.7でのみ導入されたため、古いバージョンのpythonで動作するofflineimap.pyのバージョンは次のとおりです。

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
Hamish Downer