ubuntu 10.04 をメールサーバーに (Dovecot 編)

先に書いた「Postfix と PostfixAdmin の連携」で、PostfixAdmin で登録、管理するメールアカウントを Postfix からも利用できるようにした。
しかし実は「Postfix と PostfixAdmin の連携」の設定では、PostfixAdmin で管理しているメールアドレス宛てのメールを保存することはできるが、それ以外に宛てたメールを送信できるのは、Postfix がインストールされている PC 自身からだけだ。
Postfix がインストールされている PC 以外の PC から、PostfixAdmin で管理しているメールアドレス宛てのメール以外を送ると、エラーになってしまう。

これは Postfix の規定の動作が、main.cf ファイルの mynetworks エントリのアドレス以外から接続されたときは、以下に挙げたメール以外を受け付けないようになっているからだ。

  • mydestination エントリに記されたドメイン宛てのメール
  • inet_interfaces エントリに記されたアドレス宛てのメール
  • proxy_interfaces エントリに記されたアドレス宛てのメール
  • virtual_alias_domains エントリに記されたアドレス、ドメイン宛てのメール
  • virtual_mailbox_domains エントリに記されたアドレス、ドメイン宛てのメール
  • relay_domains エントリに記されたアドレスおよびそのサブドメイン宛てのメール
現在の Postfix の設定では、proxy_interfaces エントリ、relay_domains エントリは空、他のエントリについては先回の記事 (「Postfix と PostfixAdmin の連携」)を参照

信頼できる PC のアドレスを mynetwork エントリに書き加えるのも一つの方法だが、それでもモバイル端末のようにインターネットに繋ぐたびにアドレスが変わるような PC からはメールが送れない。
そこで Postfix を SMTP 認証に対応させることで、SMTP 認証で承認された PC からの接続であれば、どこ宛てのメールでも受け取れるようにする。

ところで、Postfix で SMTP 認証を使うには、何らかの SASL ライブラリが必要になるが、今回は PostfixAdmin で管理するメールアカウントをそのまま使える Dovecot の SASL ライブラリを使うことにする。
Dovecot の SASL ライブラリは、IMAP4 サーバーや POP3 サーバーといった、Postfix が保存したメールを別の PC のメーラーに受け渡す機能と一緒に提供されているのも、採用理由の一つだ。

まずは Dovecot を IMAP4 / POP3 サーバーとしてインストールし、その動作を確認してから、Postfix と連携させて SMTP 認証を実現しよう。

Dovecot は ubuntu の標準リポジトリで提供されているので、sudo aptitude update; sudo aptitude install dovecot-imapd dovecot-pop3d コマンドでインストールできる。
Dovecot をインストールしたら、これを設定する。

Deovecot の設定ファイルは /etc/dovecot/dovecot.conf ファイルだ。
しかし ubuntu (Debian) の流儀に従い、この /etc/dovecot/dovecot.conf ファイルを直接編集するのは避ける。
代わりに /etc/dovecot/conf.d ディレクトリに拡張子を .conf にしたファイルを、また /etc/dovecot/auth.d ディレクトリに拡張子を .auth にしたファイルを作成して、そこに設定を記述する。

9.10 以前の ubuntu で提供されている Dovecot では /etc/dovecot/dovecot.conf ファイルを直接編集するしかなかった。
どのバージョンからかは調べていないが、少なくとも 10.04 の Dovecot では include_try ディレクティブが導入され、/etc/dovecot/dovecot.conf ファイルの中で適宜この include_try ディレクティブを使って、/etc/dovecot/conf.d ディレクトリにある拡張子が .conf のファイルと、/etc/dovecot/auth.d ディレクトリにある拡張子が .auth のファイルを読み込むようになった。
ただし、10.04 になった今でも一部の設定については /etc/dovecot/dovecot.conf ファイルを直接編集する必要がある。

最初に Dovecot の基本的 (?) な部分を設定するために /etc/dovecot/conf.d/base.conf ファイルを作成する。
/etc/dovecot/conf.d/base.conf ファイルの内容は以下の通りだ。

/etc/dovecot/conf.d/base.conf
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
disable_plaintext_auth = no

# Location for users' mailboxes. This is the same as the old default_mail_env
# setting. The default is empty, which means that Dovecot tries to find the
# mailboxes automatically. This won't work if the user doesn't have any mail
# yet, so you should explicitly tell Dovecot the full location.
mail_location = maildir:%h

# Valid UID range for users, defaults to 500 and above. This is mostly
# to make sure that users can't log in as daemons or other system users.
# Note that denying root logins is hardcoded to dovecot binary and can't
# be done even if first_valid_uid is set to 0.
first_valid_uid = 8
last_valid_uid = 8

最初の disable_plaintext_auth エントリは、ユーザー認証の際にハッシュ化されてないパスワードや暗号化されていないパスワードの使用を許すかどうかの設定だ。
細かい説明は省略するが、disable_plaintext_auth エントリを ‘yes’ にすると、SMTP 認証や IMAP4 のログインで PLAIN や LOGIN が使えなくなる。
また、POP3 での通常のログインが使えなくなる (APOP でのログインは可)。
こでは、クライアント (メーラー) の自由度を高める意味で、disable_plaintext_auth エントリを ‘no’ にしておく。

mail_location エントリでは、メーラーに受け渡すメールが保存されているディレクトリを指定する。
ここで指定している ‘%h’ は、メールアカウントに対応するホームディレクトリを意味する。
メールが保存されているディレクトリは、Postfix の main.cf ファイルの virtual_mailbox_base エントリと virtual_mailbox_maps エントリで指定されるディレクトリと同じだ。

Postfix と PostfixAdmin の連携」では /etc/postfix/main.cf ファイルの virtual_mailbox_base エントリと virtual_mailbox_maps エントリで、PostfixAdmin が MySQL の mailbox テーブルに保存した maildir フィールドの値のディレクトリを /var/mail ディレクトリの下に作成して、そこにメールを保存するように設定した。
この mail_location エントリでも、maildir フィールドの値を ‘%h’ に読み込ませて mail_location = /var/mail/%h と指定したいところだが、このように ‘%h’ が相対ディレクトリになるような指定はできない。
MySQL に保存されている maildir フィールドのを ‘%h’ に読み込まむときに、’/var/mail’ を付け加えておくようにする必要があるので注意が必要だ。

本記事はメールサーバーを ubuntu 10.04 で再構築したときの記録を元に書いており、Dovecot と PostfixAdmin の組み合わせはこれ以前から運用している。
ubuntu 9.10 を含むこれ以前のの公式リポジトリで提供されている Dovecot では ‘%h’ を相対ディレクトリにして、mail_location = maildir:/var/mail/%h のように指定することができた。
ubuntu 10.04 の Dovecot では、このような設定をするとエラーになる。
この件については、Wiki ドキュメント「Upgrading Dovecot v1.1 to v1.2」に記載されている。
当該部分を以下に引用する。

Relative home directory paths are giving errors now. They were never supported, but earlier they just didn’t usually cause problems.

  • If you were using e.g. mail_location = maildir:/var/mail/%h, just change it to mail_location = maildir:%h and add /var/mail/ prefix to home dirs.
  • To get absolute home dir from relative path in LDAP, use something like: user_attrs = .., homeDirectory=home=/var/mail/%$
適当な和訳

相対ホームディレクトリパスは今はエラーになります。以前からサポートされていたわけでは無いが、今までは単に問題を起こさなかっただけです。

  • mail_location = maildir:/var/mail/%h のように使っていたのなら、mail_location = maildir:%h に変更して、ホームディレクトリの頭に /var/mail/ を付け加えます。
  • LDAP の相対パスから絶対ホームを得るには、user_attrs = .., homeDirectory=home=/var/mail/%$ のようにします。

残った first_valid_uid エントリと first_valid_gid エントリは、Postfix の virtual_minimum_uid エントリ (Postfix には virtual_minimum_gid エントリはない) とほぼ同じ意味で、メールを保存するディレクトリにアクセスするときユーザー ID の最小値を指定する。
Postfix と PostfixAdmin の連携」で、メールを保存するユーザー ID (virtual_uid_maps エントリ) とグループ ID (virtual_gid_maps エントリ) を、それぞれ 8 (mail ユーザー) と 8 (mail グループ) にしている。
このため、保存されているメールにアクセスできるユーザー ID、グループ ID は 8 (mail ユーザー) 、8 (mail グループ) でなくてはならない。
つまり、ユーザー ID の最小値 (first_valid_uid エントリ) には 8、グループ ID の最小値 (first_valid_gid エントリ) には 8 を指定すればいいということだ。
なお、Dovecot が保存されているメールにアクセスするときのユーザー ID とグループ ID は、後で説明する auth セクション中の userdb サブセクションでその取得方法を指定する。

次に Dovecot のIMAP4 に関する設定と POP3 に関する設定のために、/etc/dovecot/conf.d/imapd.conf ファイルと /etc/dovecot/conf.d/pop3.conf ファイルを作成する。
/etc/dovecot/conf.d/imapd.conf ファイルと /etc/dovecot/conf.d/pop3.conf ファイルの内容は以下の通りだ。

/etc/dovecot/conf.d/imapd.conf
protocol imap {
  # Workarounds for various client bugs:
  #   delay-newmail:
  #     Send EXISTS/RECENT new mail notifications only when replying to NOOP
  #     and CHECK commands. Some clients ignore them otherwise, for example OSX
  #     Mail (<v2.1). Outlook Express breaks more badly though, without this it
  #     may show user "Message no longer in server" errors. Note that OE6 still
  #     breaks even with this workaround if synchronization is set to
  #     "Headers Only".
  #   netscape-eoh:
  #     Netscape 4.x breaks if message headers don't end with the empty "end of
  #     headers" line. Normally all messages have this, but setting this
  #     workaround makes sure that Netscape never breaks by adding the line if
  #     it doesn't exist. This is done only for FETCH BODY[HEADER.FIELDS..]
  #     commands. Note that RFC says this shouldn't be done.
  #   tb-extra-mailbox-sep:
  #     With mbox storage a mailbox can contain either mails or submailboxes,
  #     but not both. Thunderbird separates these two by forcing server to
  #     accept '/' suffix in mailbox names in subscriptions list.
  # The list is space-separated.
  imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
}
/etc/dovecot/conf.d/pop3.conf
protocol pop3 {
  # Workarounds for various client bugs:
  #   outlook-no-nuls:
  #     Outlook and Outlook Express hang if mails contain NUL characters.
  #     This setting replaces them with 0x80 character.
  #   oe-ns-eoh:
  #     Outlook Express and Netscape Mail breaks if end of headers-line is
  #     missing. This option simply sends it if it's missing.
  # The list is space-separated.
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

続いて、PostfixAdmin が MySQL のデータベースに登録しているメールアカウントを、Dovecot で参照するための設定を行う。
これによって、IMAP4 や POP3 でメーラーが接続してきた際のユーザー認証ができるようになる。
さらに、先ほどの mail_location エントリで使った ‘%h’ への値の割り当てや、メールを保存しているディレクトリをアクセスする際のユーザー ID、グループ ID の設定もここで行う。
なお、Dovecot が MySQL に接続する際の MySQL のユーザーアカウントとパスワードは、「Postfix と PostfixAdmin の連携」で登録した Postfix が MySQL に接続するときのそれを使うことにする。

ユーザアカウント、パスワードは一例
ユーザアカウント postfixuser
パスワード postfixpass

この設定は認証に関するものとして扱われるため、先ほどと違い /etc/dovecot/auth.d ディレクトリにファイルを作成する。
ファイル名は /etc/dovecot/auth.d/passdb.auth および /etc/dovecot/auth.d/userdb.auth にした (ふたつのファイルに分けず、ひとつのファイルにしても良い)
それぞれのファイルの内容は以下の通りだ。

/etc/dovecot/auth.d/passdb.auth
# SQL database </USR AuthDatabase.SQL.txt wiki dovecot-common doc share>
passdb sql {
  # Path for SQL configuration file
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}
/etc/dovecot/auth.d/userdb.auth
# SQL database </USR AuthDatabase.SQL.txt wiki dovecot-common doc share>
userdb sql {
  # Path for SQL configuration file
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}

/etc/dovecot/auth.d ディレクトリにある拡張子が .auth のファイルの内容は全て、規定 (default) の auth セクションのサブセクションになる。
つまり、/etc/dovecot/auth.d/passdb.auth ファイルと /etc/dovecot/auth.d/userdb.auth ファイルの内容は、Dovecot にとっては以下のように解釈される。

auth default {
    passdb sql {
      args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
    }
    userdb sql {
      args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
    }

auth セクションは Dovecot のユーザー情報に関する設定であり、そこに含まれる passdb サブセクションはユーザーアカウントからパスワードを得るさいに使われ、userdb サブセクションはそのユーザーのホームディレクトリや、ユーザー ID、グループ ID などを得るために使われる。
上の内容では、どちらのサブセクションでも /etc/dovecot/dovecot-postfixadmin-mysql.conf ファイルの内容を基に、これらの情報を得ることを指示している。

/etc/dovecot/dovecot-postfixadmin-mysql.conf ファイルは、以下の内容で作成する。

/etc/dovecot/dovecot-postfixadmin-mysql.conf
driver = mysql
connect = host=/var/run/mysqld/mysqld.sock dbname=postfixadmin user=postfixuser password=postfixpass
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/var/mail/', maildir) AS home, 8 AS uid, 8 AS gid FROM mailbox WHERE username = '%u' AND active = '1'

このファイルの driver エントリは、メールアカウントが保存されている RDBMS の指定であり、’mysql’ を指定する。
connect エントリは MySQL に接続する際のパラメーターで、host、dbname、user、password のサブエントリを空白文字で区切って指定する。
connect エントリの host サブエントリは、MySQL の unix ソケットのパスだ。
これを IP アドレスや localhost のようなホスト名で指定すれば、IP ソケットを使って MySQL に接続するようになる。
dbname エントリに指定するのは、検索対象データが保存されているデータベース (PostfixAdmin がメールアカウントを保存しているデーターベース) の名前だ。
user サブエントリと password サブエントリには、Dovecot が MySQL に接続するための MySQL のユーザーアカウントとパスワードを指定する。

default_pass_scheme エントリには、次の password_query エントリで返す password フィールドがどのように暗号化されているかを指定する。
この default_pass_scheme エントリは、PostfixAdmin の $CONF['encrypt'] に合わた設定が必要だ。
PostfixAdmin 設定編」 で $CONF['encrypt'] を ‘creartext’ にしてあるので、このdefault_pass_scheme エントリは ‘PLAIN’ になる。

password_query エントリと user_query エントリは、それぞれ passwd サブセクション、userdb サブセクションから呼ばれたときに使われる SQL 文だ。
Dovecot の SQL 文は、Postfix のそれとは異なり、SELECT 節で返すフィールドの名称に意味があり、password_query エントリでは password フィールドを、user_query エントリでは home フィールド、uid フィールド、gid フィールドを必ず返さなくてはならない。

Dovecot がこの password_query エントリと user_query エントリの SQL 文を呼び出すとき、SQL 文の WHERE 節に現れる ‘%u’ は宛先のメールアドレスに置き換えられる。
ここでは必要としないが ‘%u’ の他にも、メールアドレスのユーザー部 (@ よりも左側) に置き換えられる ‘%n’ や、メールアドレスのドメイン部 (@ よりも右側) に置き換えられる ‘%d’ を使える。

password_query エントリで返される password フィールドは Dovecot によるユーザー認証で使われ、user_query エントリで返される home フィールドは mail_location エントリに現れる ‘%h’ を置き換える。
uid フィールド、gid フィールドは、メールが保存されているディレクトリにアクセスする際の、ユーザー ID とグループ ID を示す。

次に IMAP4 や POP3 のユーザー認証で使用する暗号化の方式を設定するために、/etc/dovecot/auth.d/mechanisms.auth ファイルを以下の内容で作成する。

/etc/dovecot/auth.d/mechanisms.auth
# Space separated list of wanted authentication mechanisms
# NOTE: See also disable_plaintext_auth setting.
mechanisms = digest-md5 cram-md5 login apop plain

この /etc/dovecot/auth.d/mechanisms.auth ファイルも、passdb.auth ファイルや userdb.auth ファイル同様に /etc/dovecot/auth.d ディレクトリにあるので、Dovecot は以下のように auth セクションに含まれるエントリとして解釈される。

auth default {
    mechanisms = digest-md5 cram-md5 login apop plain

mechanisms エントリに指定したユーザー認証の方式は、IMAP4 や POP3 のログインだけでなく、Postfix の SMTP 認証でも使用する (Postfix で SMTP 認証できるようにするための設定は次回の記事で書く予定。)
IMAP4 と Postfix の SMTP 認証ではここで指定している内の ‘digest-md5′, ‘cram-md5′, ‘login’, ‘plain’ の四つが使用され、POP3 ではこれらに加えて ‘apop’ による認証が使用できる。
この他の認証方式 (‘NTLM’ や ‘GSSAPI’ など) も指定できるが、実際の認証時にそれらが採用されるかはメーラーに依存する。
また ‘login’ や ‘plain’ を mechanisms エントリから除外して、これらを使わせないように強制することもできる。

なお、Dovecot の IMAP4 や POP3、別の記事で説明する Postfix の SMTP 認証では、この mechanisms エントリに指定した順番通りに、接続してきたメーラーに認証方式を提案するようなので、暗号強度が少しでも高い順に並べておくべきだろう。

Postfix で SMTP 認証ができるようにするためには、もう少し設定が必要だが、Postfix が受信して保存しているメールを、IMAP4 や POP3 を使ってクライアント PC のメーラーに受け渡すことは、これでできるようになった。
最後に sudo service dovecot reload コマンドを実行して、作成した設定を Dovecot に読み込ませる。

Dovecot の設定自体は以上で終わりだが、このサーバーは Hyper-V の仮想マシンで動いている。
Hyper-V に限らないが仮想マシンを使う際に注意しなくてはならないことの一つに、仮想マシンを動かすホスト OS や、同じホスト OS 上の別の仮想マシンの負荷状況によって、希に仮想マシンの時刻が遅れるという問題がある。
この時刻のずれを補正するために、このサーバーでは「ubuntu のインストール直後の調整 (その 1) 」のときに NTP をインストールしてあるのだが、インスト-したままの初期状態で使っているために 128ms 以上の時刻の遅れが生じると、徐々にではなく一気に補正するようになっている。
Dovecot は、このような時刻の突然の変化を検知すると、勝手に終了してしまう。

ユーザー認証を誤魔化すために、システムの時刻を弄るといった手法が存在する。
Dovecot のような、ユーザー認証の機能を持つアプリケーションが、時刻の突然な変化を検知して停止するのは、セキュリティの観点から見れば許容される動作といえるだろう。

このような時刻の突然の変化で Dovecot が停止してしまったときのために、まずは以下の内容の dovecot_check_restart.sh ファイルを作成して /etc/dovecot ディレクトリに保存する。

/etc/dovecot/dovecot_check_restart.sh
#!/bin/sh
LSOF=/usr/bin/lsof
SERVICE=/usr/sbin/service
LOGGER=/usr/bin/logger

HOST='localhost'
PORT=110
#PORT=143
#HP=4TCP@$HOST:$PORT
HP=4TCP:$PORT
echo 'Checking to see if Dovecot is up...'
if ( $LSOF -Pni $HP -s TCP:LISTEN 2>&1 >/dev/null ); then
  echo 'Dovecot is up';
else
  echo 'Dovecot is down, restarting...';
  $SERVICE dovecot restart
  $LOGGER -p mail.info -t dovecot_check_restart.sh -i restarting Dovecot
fi

作成した /etc/dovecot/dovecot_check_restart_sh ファイルがスクリプトとして実行できるように、sudo chown root.root /etc/dovecot/dovecot_check_restart.sh コマンドと sudo chmod u=rwx,go=rx /etc/dovecot/dovecot_check_restart.sh コマンドを実行する。
続いてこの /etc/dovecot/dovecot_check_restart_sh スクリプトを定期的に実行するように、以下の内容で /etc/cron.d/dovecot_check_restart ファイルを作成する。

/etc/cron.d/dovecot_check_restart
#
# Regular cron jobs for gracefully check Dovecot and restart if necessary
#
# Every two minutes.
*/2 * * * root /etc/dovecot/dovecot_check_restart.sh 2>&1 > /dev/null

これで 2 分毎に Dovecot が動いているかどうかを確認して、停止していたときは再起動するようにできた。

関連する記事 (Related posts):

  1. CentOS 5.6 をメールサーバーに (Dovecot のインストール)
  2. ubuntu 10.04 をメールサーバーに (序説)
  3. CentOS 5.6 をメールサーバーに (Postfix で SMTP-auth)
  4. ubuntu 10.04 をメールサーバーに (Postfix で SMTP 認証)
  5. ubuntu 10.04 をメールサーバーに (Postfix と PostfixAdmin の連携)

1 comment to ubuntu 10.04 をメールサーバーに (Dovecot 編)

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">