ユーザ用ツール

サイト用ツール


dovecot

dovecot

概要

dovecotは近年、標準的な IMAP サーバとしての地位を確立しつつあるIMAPサーバであり、先発のサーバに対し、パフォーマンスに優れ、また互換性をとりやすい構造になっている。

長らくcourier-imapを使ってきたが、昨今、パフォーマンスの劣化に悩まされており、互換性の取りやすい点を勘案し、dovecotへの乗り換えをおこなった。(2015/10/14)

導入

ビルド

VineSeed (Vine Linux 7.x候補)には、dovecot-2.2.13 のパッケージがあるのでこれをとってくる。 但し、そのままでは依存性の関係でビルドできないので、SPECSファイルを修正してから、ビルドする。

%if %{build_postgres}
BuildRequires: postgresql-devel
%endif

%if %{build_mysql}
BuildRequires: libmysqlclient16
%endif

このにカ所は、libpq-devel および libmysqlclient-devel が入っているが、Vine Linux 6.3のパッケージ構成では存在しないため、このように変更しておく。

最後に、ビルドして出来たものをインストールして終了。

# rpm -ba ~/rpm/SPECS/dovecot-vl.spec
...
# rpm -Uvh ~/rpm/RPMS/i686/dovecot-2.2.13.i686.rpm ...
...

追記 (10/15)

Vine Linuxのパッケージは、いくつかのパッチを当てているが、スタートのスクリプトやSSL用の情報などだけで、本体には手を入れていないので、いくつかの簡単な修正で、2.2系列の新しいバージョンのパッケージを作成可能である。

実際に、最新の、2.2.19への更新を行ってみた。

  • dovecot-2.2.19.tar.gz の取得

最新版をこちらから取得する。 取得したら、~/rpm/SOURCES にコピーしておく。

  • pigeonhole-0.4.9.tar.gz の取得

最新版をこちらから取得する。 dovecotのバージョンによって、対応するバージョンが違うので注意。 取得したら、~/rpm/SOURCES にコピーしておく。

  • dovecot-vl.specの修正
Version: 2.2.19
...
%define pigeonholever 0.4.9

上記二カ所のバージョンをダウンロードしたパッケージのそれにあわせる。

  • ビルド
# rpm -ba ~/rpm/SPECS/dovecot-vl.spec
  • 更新
# rpm -Uvh ~/rpm/RPMS/i686/dovecot-2.2.19-2vl6.i686.rpm ...

設定

プロトコル

v2以降では、v1.x系列のものと設定が変わっているので注意。 /etc/dovecot/dovecot.conf 内で、次のように設定する。

protocols = imap pop3

imapsやpop3sはここで設定するのではなく、SSL設定で行う。

ディレクトリ

/etc/dovecot/conf.d/10-mail.conf の中にある、mail_location でメールボックスの形式と置き場所とを記述する。 ここでは、Maildir形式を用いるので、次のようにする。

mail_location = maildir:~/Maildir

mbox形式も指定できるが、今時のメイル管理方法としてはあえて選択するものでもないだろう。

認証

/etc/dovecot/conf.d/10-auth.conf を修正する。

未だに、少なくないMUAが認証にPLAINを使っているので、disable_plaintext_authをnoにしている設定例も少なくないが、ここは yes にする。1)

同じセグメントのIPからのアクセスは、このパラメータの如何に関わらず PLAIN を許可されているものとして扱われるし、SSLでのアクセスもまた、同様にPLAINは許可されたものとして扱われる。 即ち、あえて、セキュアではないラインでPLAIN認証をする必要性が内限りは no にすることでセキュリティレベルを下げるべきではないのだ。

auth_mechanisms = plain login cram-md5

で、使用可能な認証方法を列挙する。

#!include auth-deny.conf.ext
#!include auth-master.conf.ext

!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

一応、PAMベースの認証に関する auth-system.conf.ext と、/etc/dovecot/users にあるユーザデータベースを用いた認証を行うために、auth-passwdfile.conf.ext を include するように指定する。

SSL

サーバ認証ファイルの作成は、スクリプトが用意されているので、それを利用する。 スクリプトファイルは /usr/share/doc/dovecot-<バージョン>/mkcert.sh にあり、利用する定義ファイル、認証ファイルのターゲットディレクトリは、/etc/pki/dovecot にある。

  • /etc/pki/dovecot/dovecot-openssl.cnf の編集

ファイル中の、CNやSTといった基本情報を自分のもので置き換えるだけ。

  • /etc/pki/dovecot/certs/dovecot.pem および /etc/pki/dovecot/private/dovecot.pem の待避

これらが存在する場合、mkcert.shはファイルを作成しないので、必ず削除するか名前を変更しておく。

  • sh /usr/share/doc/dovecot-<バージョン>/mkcert.sh の実行
  • セキュリティレベルの設定

10-ssl.confの中を見ると、

ssl_protocols = !SSLv2
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

がデフォルトのようなので、これを変更しておく。 2)

ssl_protocols = !SSLv2 !SSLv3
ssl_cipher_list = ALL:!LOW:!3DES:!SSLv2:!SSLv3:!EXP:!aNULL

※iOSが9.1になっても、プロトコルだけは TLSのどれかを使っているのに、暗号はSSLv3を使用しているために、ssl_cipher_list に SSLv3を戻さざるを得なくなりました。

ssl_cipher_list = ALL:!LOW:!3DES:!SSLv2:!EXP:!aNULL

Android KitKatにも同じ問題がありましたが、IMAPクライアントを、Gmailアプリにすることで、回避できていました。 ところが、iOS版のGmailアプリは、Gmailアカウントのみしか扱えないようにされているため、同じ手段では回避できませんでした。 本当に iOSはきらい。。。

Sieve (pigeonhole)

dovecot-sieveと呼ばれていた、Sieve機能は、pigeonholeによって提供されるようになっている。

有効にするには、dovecot-pigeonhole のパッケージを導入し、20-managesieve.conf のコメントアウトされた、service managesieve-loginのブロックのコメントをはずし、

 inet_listener sieve {
   port = 4190
 }

の部分のコメントもはずしておく。3) 必要に応じて、15-lda.confや20-lmtp.conf も修正し、dovecot.conf のprotocols に sieveを追加する。

15-lda.conf および 20-lmtp.conf はそれぞれの protocol ブロック中で、コメントアウトされている、mail_plugins の行のコメントをはずし、sieve を追加する。

  • 15-lda.conf
protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins
  mail_plugins = $mail_plugins sieve
}
  • 20-lmtp.conf
protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins
  mail_plugins = $mail_plugins sieve
}

ユーザアカウントの設定

アカウントは /etc/doveccot/userdb にて管理されている。 コマンドラインでパスワードを生成して、手動でエントリーを作成する。

$ doveadm pw -s CRAM-MD5
Enter new password:
Retype new password:
{CRAM-MD5}2d095b6c53238854494a58ff6725d406372a19e7a4f5f11f7abf0ddc36b379f8
$

エントリーは以下のようになっている4)。 最初のカラムはユーザ名で、近年は多くのメイラで、ドメイン名込みの名前で認証をしようとするかと思う。 勿論、メイラによっては設定で、これをドメイン名なしのユーザ名にすることもできるかと思うが、Outlook (new)のようにこれをなぜか変更できないクライアントもあるため、場合によっては新たにドメイン込みの名前での設定が必要になることもあるだろう。

foo@example.com:{CRAM-MD5}2d095b6c53238854494a58ff6725d406372a19e7a4f5f11f7abf0ddc36b379f8:1000:1000:Foo Bar Baz:/home/foo:/bin/bash:

特に再起動などしなくても dovecotは新しいエントリを読み込むので、そのままメイラから設定を続行できる。

courier-IMAP との互換設定

移行は、拍子抜けするくらいに簡単だった。

ユーザデータベースの移行

courier-IMAPが利用する認証情報は、/usr/authlib/userdb に格納されている。 こちらは複数のパスワードを持たせることが出来る構造になっているが、dovcotの方は、そうはいかないようなので、ここでは、cram-md5の認証情報または、DESによる暗号化のものを移行することを想定する。

foo     imappw=xXXxXxxXXX.XX|uid=1504|imapspw=Xx.XXXXXXXXXX|hmac-md5pw=xxxXxXxxxXXXxXXxxXxxXxXxxxXxxXXXXXXXxxXXXXxXXXXXxXxXXXxXxXXxXXXX|imap-hmac-md5pw=xxxXxXxxxXXXxXXxxXxxXxXxxxXxxXXXXXXXxxXXXXxXXXXXxXxXXXxXxXXxXXXX|mail=/home/foo/Maildir|home=/home/foo|gid=1500
bar     pop3pw=XxX/XxxxX.XxXxxxXXXxXXxXXxxXXXXXXX|mail=/home/bar/Maildir

一般的には、userdbはこのような感じになっているはずである。foo はimappwとして、CRYPTされたものと、またはcram-md5のものとを用いており、bar は CRYPTのものだけを利用している。これをそれぞれ、/etc/dovecot/users に移行する。

このとき、passwd-file 形式を用いるものとする。

foo:{CRAM-MD5}xxxXxXxxxXXXxXXxxXxxXxXxxxXxxXXXXXXXxxXXXXxXXXXXxXxXXXxXxXXxXXXX:1504:1500:Foo GCOS:/home/foo:/bin/bash:
bar:{CRYPT}XxX/XxxxX.XxXxxxXXXxXXxXXxxXXXXXXX:1506:1500:Bar GCOS:/home/bar:/bin/bash:

パスワードは、userdbから必要なものをそのまま貼り付ける。 このとき、cram-md5ならば{CRAM-MD5}を、DESなら{CRYPT}をそれぞれ、パスワードのプレフィックスとしてつけておく。 パスワードの後は、uid, gid, GCOS, homedir, shell, extra の順になっているが、dovecotは参照していないようである。 とはいえ、将来的には参照される可能性もあるので、適切な情報を与えておくべきである。

なお、新規のパスワードのハッシュ値は、doveadm コマンドで得ることが出来る。

$ dovecot pw
Enter new password:
Retype new password:
{CRAM-MD5}xXxxxxxxXXxXxXXXxXxXXxxxXXXxXXXXXxXxXxXxXXXxxxXXxxXxxxxXxXxxXXXx
$

Maildir構造の互換設定

互換設定は、/etc/dovecot/conf.d/10-mail.conf に対して行う。 namespace inbox というのが、あるので、この内部のパラメータを次のようにする。 5)

namespace inbox {
  type = private
  seperator = .
  prefix = INBOX.
  inbox = yes
}

これで、Maildirの構造は courier-IMAPと互換になり、MUA側で特に変更を行わなくても、透過的に利用可能である。 実際、dovecotの初期設定を終えたところで、courier-IMAPを停めて、dovecot を起動したが、各種メイラからのアクセスはほとんど変わりなく6)行う事が出来た。

メールサーバ

1)
指定しなければ yes
2)
これで万全かどうかは保証できません。
3)
念のため、明示的に4190を listenするようにする。
4)
はずである。
5)
実際には沢山コメントや改行があるが、簡単のためにここでは必要な項目だけ列挙しておく。
6)
一部、フォルダの購読情報が失われてしまったものがあった。
dovecot.txt · 最終更新: 2023/10/04 13:06 by araki