Dovecot: 安全な IMAP サーバ

Tatsuyoshi(toyota at tatsuyoshi.net)

Dovecot 高速で安全に設計され、 IPv6 にも対応した IMAP サーバです。 2006年2月現在のバージョンは 1.0beta2 で、最初にセキュリティホールを 見つけた人には1000ユーロが 提供されることになっています。Linux や FreeBSD 等、多くの OS に 対応しており、オープンソースとなっています。

日本語でのドキュメントが少ないので、この文を書くことにしました。 私が使用している主な環境は OpenBSD と Linux です。文書に間違い、抜け などがありましたら気軽にメールしてください。 このページを作成するにあたり、Sys Admin 2月号 Lawrence Teo さんの記事を参考にしました。


準備

Dovecot をインストールする前にどのように運用するかを決める必要が あります。その運用によって準備するものが異なってきます。 まず、imap だけなのか、それとも imaps も使用するのか、 メールボックスの場所をどこにするのか、メールボックスは mbox の 形式にするのか maildir 形式にするのかを決めます。以下は私が行った 設定です。

2006年2月現在の Dovecot のバージョンは 1.0beta2 です。バージョンが 上がって、この文書が古くなっている場合があるので、そこを理解した上で、 読み進んで下さい。


インストール

まずは dovecot をダウンロードしてきます。dovecot のウェブサイト
http://www.dovecot.org/
より、source をダウンロードします。ダウンロードのページには PGP の署名がありますので、セキュリティに気をつけるのでしたら GnuPG などを 使って確認することができます。

ファイルのダウンロード:

tatsuyoshi$ wget http://www.dovecot.org/releases/dovecot-1.0.beta2.tar.gz

ファイルの解凍:

tatsuyoshi$ tar xvfz dovecot-1.0.beta2.tar.gz
それぞれの設定に合わせて configure のオプションを変える必要があるため、 configure --help を実行して、configure オプションを決めます。不要な 認証の部分を指定したり、設定ファイルや ssl 関係のファイルの場所を 指定します。 Install ファイルに詳しい情報があるので、参考になると 思います。

configure オプション:

./configure --without-pam --without-vpopmail           \
            --without-ldap --with-ssl=openssl          \
            --disable-ipv6
認証に PAM を使用しないため、 --without-pam を指定しました。同様に vpopmail と ldap も使用しないので、それぞれ --without-vpopmail --without-ldap オプションを、 --with-ssl の default の設定が 不明であったので、 --with-ssl オプションで openssl を指定し、 ipv6 は使用しないので --disable-ipv6 のオプションを指定しました。 ディレクトリの指定を行わないと、 default の設定になります。 主なファイル/ディレクトリの default の場所は以下になっています。 気になる場合は変更してください。

上記例では、 configure 実行後に、以下の結果となります。


Install prefix ...................... : /usr/local
File offsets ........................ : 64bit
I/O loop method ..................... : poll
File change notification method ..... : dnotify
Building with SSL support ........... : yes (OpenSSL)
Building with IPv6 support .......... : no
Building with pop3 server ........... : yes
Building with GSSAPI support ........ : no
Building with user database modules . : static prefetch passwd passwd-file checkpassword (modules)
Building with password lookup modules : passwd passwd-file shadow checkpassword (modules)
次に、コンパイルと実際の dovecot のインストールになります。と言っても、 良くある make コマンドの指定です。

tatsuyoshi$ make
tatsuyoshi$ su
root# make install
make install ではファイルが strip されず、かなり大きなファイルと なっているので、デバッグなどをしないのでしたら make install-strip が お勧めです。これで実際のインストールは完了です。


設定

コンパイルが完了したら Dovecot の設定ファイルを編集します。 サンプルの設定ファイルが /usr/local/etc に dovecot-example.conf という 名前であるので、 dovecot.conf という名前のファイルにコピーします。


root# cd /usr/local/etc
root# cp dovecot-example.conf dovecot.conf
このコピーした dovecot.conf ファイルを編集します。まずは、 IMAP, IMAPS, POP3 を使用するので、 protocols の行を指定をします。 ファイルの中に #protocols = imap imaps と書かれている行が見つかると思いますが、 行頭の # はコメントです。この行を上書きするのでしたら、 # を消すのを忘れないで下さい。


protocols = imap imaps pop3
次に、メールボックスの場所と形式を指定します。Maildir 形式で、 ユーザディレクトリの下の Maildir というディレクトリの指定です。


default_mail_env = maildir:~/Maildir
その他の形式にする場合は、 dovecot-sample.conf や doc/configuration.txt を 参考に設定します。

認証の設定をします。私の設定ですと shadow での認証を行うので、 passdb の設定を shadow にしますが、その前に現在の指定が PAM に なっているので、その部分をコメント化します。


  #passdb pam {
〜snip〜
  #}
shadow 設定の部分がコメント化された状態でファイルの中にありますので、 その部分のコメントを外します。 OpenBSD の場合は shadow はないので、 passwd になります。


  passdb shadow {
  }
私の設定はこれで終わりですが、その他色々と設定項目があります。 dovecot-sample.conf や doc/configuration.txt を参考に環境に合わせて 変更してください。


SSL 証明書の作成

IMAPS や POP3S を動かす前に、 SSL の証明書を作成しなければなりません。 この SSL の証明書の作成には、付属のスクリプトを使う方法とそうでは ない方法があります。このスクリプトとスクリプト作成に必要な設定ファイルは doc ディレクトリにあります。

以前のバージョンではこの付属スクリプトを使うと、証明書の有効期限が 30日になってしまいました。現在のスクリプトでは、有効期限は1年です。 この有効期限を長くしたい等の変更が必要な場合は、 doc/mkcert.sh ファイルの 証明書を発行しているコマンドオプション "-days 365" の部分を変更します。 以下は、6ヶ月に変更する指定です。


$OPENSSL req -new -x509 -nodes -config $OPENSSLCONFIG -out $CERTFILE -keyout $KEYFILE -days 180 || exit 2

付属スクリプトを使用する際は、 doc/dovecot-openssl.cnf という 設定ファイルを編集する必要があります。それほど難しい項目はないのですが、 以下で解説します。


[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
この req の部分は、ほとんどの場合、編集する必要がありません。そのままで 使います。req_dn の部分は以下に私のコメントを交えて書きます。


[ req_dn ]
# country (2 letter code)
# 2文字の国コードです。日本の場合は JP になります。
#C=FI
C=JP

# State or Province Name (full name)
# 日本の場合は都道府県になります。
#ST=
ST=Kanagawa

# Locality Name (eg. city)
# 市町村の設定です。
#L=Helsinki
L=Yokohama

# Organization (eg. company)
# 会社名や団体名などの組織名を入れます。
# 個人の場合は指定しないで良いと思います。
#O=Dovecot
O=Tatsuyoshi Networks

# Organizational Unit Name (eg. section)
# 組織内の部署名です。
#OU=IMAP server
OU=Network Operation Team

# Common Name (*.example.com is also possible)
# 使用するドメイン・サーバ名です。
# メールソフトで接続先の名称と異なる場合に警告を出しますので、
# 使用する名称を正しく入力してください。
# CN=imap.example.com
CN=naboo.tatsuyoshi.net

# E-mail contact
# 連絡先の E-Mail アドレスです。
#emailAddress=postmaster@example.com
emailAddress=postmaster@example.jp
他の設定ファイルと同様、行頭の # はコメントになりますので、上書きを する場合は # を削除してから編集してください。


[ cert_type ]
nsCertType = server
この cert_type の部分も、ほとんどの場合、編集する必要がありません。

dovecot-openssl.cnf ファイルの編集が終わりましたら、証明書の作成 スクリプトを実行します。このスクリプトを実行すると、/etc/ssl/certs/dovecot.pem というファイルと /etc/ssl/private/dovecot.pem というファイルを作成します。 このファイルのディレクトリがない場合、実行したときにエラーが起きますので、 スクリプトを実行する前に確認して、もしディレクトリがない場合は ディレクトリの作成を行います。


root# ls /etc/ssl/certs
ls: /etc/ssl/certs: No such file or directory
root# mkdir /etc/ssl/certs
root# ls /etc/ssl/private
ls: /etc/ssl/private: No such file or directory
root# mkdir /etc/ssl/private
これで doc/mkcert.sh スクリプトを実行するのですが、 mkcert.sh ファイルは 実行権限がありませんので、 chmod で実行権限を付けるか、 sh から 呼び出して使います。


root# sh ./mkcert.sh
そうすると、証明書の作成が始まります。以下のような応答が得られると思います。 MD5 Fingerprint 部分はそれぞれで異なる結果となります。


Generating a 1024 bit RSA private key
...................................................++++++
......++++++
writing new private key to '/etc/ssl/private/dovecot.pem'
-----

subject= /OU=Network Operation Team
server/CN=naboo.tatsuyoshi.net/emailAddress=postmaster@example.jp
MD5 Fingerprint=8E:AD:CB:BA:53:75:B5:D7:16:B9:7E:E6:6C:2B:1B:47
既に /etc/ssl/certs/dovecot.pem ファイルと /etc/ssl/private/dovecot.pem ファイルがある状態で mkcert.sh を実行するとエラーが発生します。 もし、再度証明書を発行する場合は、 上記のファイルを消すなどして 対応してください。

この証明書は自分で自分を証明するもので、信頼のおける会社が発行した 証明書とは信頼度が異なることを忘れないようにしてください。もし、 大規模なサーバや信頼性が必要な場合は、信頼のおける会社から購入するなど 必要に応じて対応する必要があります。


Dovecot ユーザの作成

Dovecot は いくつかのプロセスで実行されます。そして、root ユーザではない dovecot ユーザでのログインプロセス実行をすることで、必要最低限の特権しか 使いません。そのために、 dovecot ユーザを作成する必要がありますので、 ユーザの作成を行います。ほとんどの方は、ユーザの作成は行っていると 思いますので、詳細は記述しませんし、それぞれの OS や環境によって、 作成方法は様々ですので、それに合わせてユーザを作成してください。

以下は Fedora Core 4 でユーザを作成したときのものです。私はほとんどの 場合、vipw などで直接 /etc/passwd を編集します。


root# useradd  -c Dovecot -s /sbin/nologin -d /var/empty/dovecot dovecot


メールボックスの引越し

もし、以前の環境で IMAP メールサーバを使っていて、そのメールを 新しい Dovecot サーバに移行する場合は、メールファイルをコピーする必要が あります。

私の場合、これまで別の PC で Courier-IMAP を使っていたため、 Mailbox 形式のファイルがホームディレクトリにあり、そのファイルを 移行する必要があります。そこで、コピーに scp を使用して、新しい サーバに移行する作業を行いました。


tatsuyoshi$ scp -p -r naboo.tatsuyoshi.net:Maildir .
これで、 naboo.tatsuyoshi.net にあった Maildir というディレクトリ以下が ホームディレクトリにコピーされます。Dovecot は Maildir 形式の場合、 IMAP フォルダーを管理するのに subscriptions というファイルを使っています。 そのため、作成する必要があります。このファイルは私がこれまで使っていた Courier-IMAP のファイル courierimapsubscribed と互換性があるので、 このファイルの名前を変えるか、コピーすれば使用できます。但し、先頭の "INBOX." を削除する必要があるので、編集も必要です。sed を使って変換を してみました。それと、dovecot-uidlist というファイルも必要なのですが、 これは courierimapuiddb ファイルと完全な互換性があるため、 名前の変更を行いました。


tatsuyoshi$ sed -e "s/^INBOX.//" courierimapsubscribed > subscriptions
tatsuyoshi$ mv courierimapuiddb dovecot-uidlist
このファイルは元々 .subscriptions というファイル名だったのですが、 多分 subscriptions というフォルダが作成できなくなるため、 subscriptions とドット無しのファイル名になったものと思われます。 同様に mailbox 形式を使っている場合は、管理に .subscriptions という ファイルを使っていますので、作成する必要があります。

もし、複数のユーザを管理していて、データを移行する必要がある場合は、 スクリプトなどで一括にコピーする必要があると思います。 データ移行については、Dovecot のページにある Migration という項目が あり、一括変換が行えるようなスクリプトのリンクがあります。 とても参考になります。


起動時に Dovecot を実行する

PC を起動したとき、自動的に Dovecot を起動したい場合は、 /etc/rc.d/init.d にdovecot という名前で以下の内容を作成します。但し、これは Fedora Core 4 の 設定で、さらに dovecot の rpm から引用しています。


#!/bin/bash
#
#       /etc/rc.d/init.d/dovecot
#
# Starts the dovecot daemon
#
# chkconfig: - 65 35
# description: Dovecot Imap Server
# processname: dovecot
# Source function library.
. /etc/init.d/functions

test -x /usr/sbin/dovecot || exit 0

RETVAL=0
prog="Dovecot Imap"

start() {
        echo -n $"Starting $prog: "
        daemon /usr/sbin/dovecot
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dovecot
        echo
        echo
}

stop() {
        echo -n $"Stopping $prog: "
        killproc /usr/sbin/dovecot
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/dovecot
        echo
}

#
#       See how we were called.
#
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload|restart)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/dovecot ]; then
            stop
            start
        fi
        ;;
  status)
        status /usr/sbin/dovecot
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {condrestart|start|stop|restart|reload|status}"
        exit 1
esac

exit $RETVAL
あとは、起動したい run level 例えば 5 でしたら /etc/rc.d/rc5.d の下で このファイルにシンボリックリンクを張れば起動します。


root# ln -s ../init.d/dovecot S93dovecot

OpenBSD では /etc/rc.local の最後に以下の行を追加します。


if [ -x /usr/local/sbin/dovecot ]; then
  /usr/local/sbin/dovecot
fi


Dovecot の起動

準備が整ったので、実際に動くか Dovecot を実行してみます。起動は 単純に dovecot コマンドを実行するだけです。


root# /usr/local/sbin/dovecot
初めて起動したときは
Warning: Corrected permissions for login directory /usr/local/var/run/dovecot/login
というメッセージが表示されることがあります。 それ以外のエラーメッセージが出ましたら、うまく起動できていない 可能性がありますので、その内容をみて設定ファイルなどを編集して修正します。 場合によっては、起動に失敗していても、エラーメッセージを 出力しないときがあります。このときは netstat や ps コマンドで Dovecot が実際に待ち受け状態にあるのか、起動されているのかを 確認します。OS によっては netstat の結果をポート番号でそのまま出力 する場合がありますが、その場合は、 IMAP のポート番号が 143, IMAPS のポート番号が 993 であることを覚えておいてください。


root# netstat -a | grep -w LISTEN
tcp        0      0 *:imaps                     *:*                         LISTEN
tcp        0      0 *:pop3                      *:*                         LISTEN
tcp        0      0 *:imap                      *:*                         LISTEN
tcp        0      0 *:sunrpc                    *:*                         LISTEN
tcp        0      0 localhost:smtp              *:*                         LISTEN
tcp        0      0 *:ssh                       *:*                         LISTEN
Dovecot のプロセスをチェックすると、 dovecot のメインプロセスから いくつかのプロセスが起動されていることがわかります。さらに、 pop3 や imap で誰かが接続中のときは、接続ユーザの名前で 別のプロセスが起動されていることが確認できます。


root# ps -ef | grep dovecot
root     17380     1  0 Feb08 ?        00:00:00 /usr/local/sbin/dovecot
root     17381 17380  0 Feb08 ?        00:00:00 dovecot-auth
dovecot  17382 17380  0 Feb08 ?        00:00:00 pop3-login
dovecot  17383 17380  0 Feb08 ?        00:00:00 pop3-login
dovecot  17384 17380  0 Feb08 ?        00:00:00 pop3-login
dovecot  17387 17380  0 Feb08 ?        00:00:00 imap-login
dovecot  17588 17380  0 Feb08 ?        00:00:00 imap-login
dovecot  17591 17380  0 Feb08 ?        00:00:00 imap-login
dovecot  17597 17380  0 Feb08 ?        00:00:00 imap-login
これらのプロセスの意味や詳細は、 doc/design.txt ファイルが参考になります。 この文章にはセキュリティの詳細なども含まれています。

もし dovecot が起動している様子がないようでしたら、ログのチェックを する必要があります。ログは OS によって異なるのですが、 /var/log/maillog などに出力されます。この出力をもとに、何が問題で起動しないのかを 確認してください。

もし、起動しているようでしたら、 Mozilla などの IMAP クライアントから 接続してみてください。IMAPS の接続の際は、証明書の確認が必要です。 自分で自分を認証したものなので、メールソフトによってはいくつかの 警告が出るかもしれません。

Dovecot を終了する際は Dovecot のプロセスに対して SIGTERM を 送信します。上記の例では、 17380 になります。


root# kill -TERM 17380


パフォーマンスの最適化

Dovecot はかなり速い動作をしますが、もし、大規模なサーバや 高トラフィックのサーバで、パフォーマンスが気になるようでしたら、 OS や Kernel のチューニングをする必要があります。状況を見ながら それぞれの OS や Kernel に合わせたチューニングを行ってください。 もし、それでも対応できない状況でしたら、ハードウェアの アップグレードを考える必要があると思います。詳細については 割愛します。


最後に

Dovecot の基本的なインストールを書きましたが、異なる OS では、 幾分手順が異なることがあると思います。さらに、実際の運用では、 上記の設定よりも多くの設定と根気がいると思います。 もし、どこかで躓いたならば、 doc 以下のディレクトリに収められている文章、 Dovecot の web ページ、そして Dovecot のメーリングリストが参考に なりますので、チェックすることを勧めます。


参照

Dovecot の web ページ -- http://www.dovecot.org/

Sys Admin 2月号 -- http://www.samag.com/articles/2004/0402/


© 2006 Tatsuyoshi Networks All Rights Reserved.