(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2016年5月9日月曜日

【Dovecot 2.0.9】【Postfix 2.6.6】Postfixのvirtualプロセスの代わりにdovecot-ldaを用いてメールボックスに保存する設定【Linux CentOS 6.7】

□使用環境について

# uname -a
Linux test.localdomain 2.6.32-573.12.1.el6.x86_64 #1 SMP Tue Dec 15 21:19:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

また、各ソフトウェアのバージョンは次の通り。

Name        : postfix
Arch        : x86_64
Epoch       : 2
Version     : 2.6.6
Release     : 6.el6_7.1


Name        : dovecot
Arch        : x86_64
Epoch       : 1
Version     : 2.0.9
Release     : 19.el6_7.2


□Postfixのvirtualプロセスとの対比し、dovecot-ldaを概観する

通常、Postfixにおいてバーチャルユーザー宛てのメールは、
virtualプロセスによってメールボックスに保存される。

virtualプロセスを利用するためには、例えば次のようにして、
Postfixの設定ファイルで、メールボックスと受信メールの関連などについて指定する必要があった。

< /etc/postfix/main.cf >
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/VMAIL
virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_transport = virtual

< /etc/postfix/vmailbox >
virtualuser1@example.com example.com/test1/
virtualuser2@example.com example.com/test2/
virtualuser0@example.com example.com/test0/

virtualプロセスを使用した際には、maillogには、次の様に記載される。
確かに、virtualプロセスに処理が任されていることがわかる。
May  1 03:48:01 test postfix/virtual[1789]: 895AB9F881: to=<test@example.com>, relay=virtual, delay=0.12, delays=0.08/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)


このvirtualプロセスを使用しない方法もある。
代わりにdovecot-ldaコマンドによってメールボックスに保存することができる

dovecotを使ってIMAPサーバなどを構築していて、
ここに「メールアドレスとメールボックスの関連づけ」設定が既にあれば、Postfixもこれを利用できる。
受信メールの対応するメールボックスへの保存をdovecotに任せるわけだ。

例えば、次のページのようにして、dovecotでIMAPサーバを構築できる。
http://akira-arets.blogspot.jp/2016/01/dovecot-basic-imap-setting.html
このような環境がある場合、Postfixはdovecot-ldaコマンドを使うことで、
受信メールのメールボックスへの保存もdovecotに任せられる。
dovecotは「メールアドレスとメールボックスの関連付け」を利用して受信メールを保存する。

こうすると、Postfix側では「メールアドレスとメールボックスの関連付け」を管理する必要がなく、
dovecot側に一元化できるメリットがある。
また、Postfix側でvirtualプロセスのための多数の設定(main.cf)を行わなくて済むことにもなる。

さらに、この方法でメールボックスに保存することは、
dovecotのキャッシュファイルが更新されるなどのメリットもある。
IMAPクライアントはdovecotに接続するとき、メール一覧を取得する。
このときキャッシュがなければメールヘッダが読み取られるので時間を要する。
しかしdovecot側にキャッシュがあれば、これが早くなる。



□dovecot-ldaを用いて受信メールをメールボックスに保存するための設定について

既に、次のページのようにしてDovecotでIMAPサーバの構築ができているものとする
http://akira-arets.blogspot.jp/2016/01/dovecot-basic-imap-setting.html

また、次のページのようにしてPostfixでvirtualユーザーの受信メールを取り扱えるようにしているものとする。
http://akira-arets.blogspot.jp/2016/01/fetchmail-postfix-virtualmailbox.html

そして以下では、Postfixがvirtualドメイン宛てメールのメールボックスへの保存を、
Dovecotに任せるために必要な追加的設定について、Dovecot側とPostfix側とに分けて記述している。



◆ Dovecot側の設定 ◆


■Dovecotが受信メールを保存できなかった場合に送信元に通知するための設定を行った。

[root@test conf.d]# vim /etc/dovecot/conf.d/15-lda.conf
##
## LDA specific settings (also used by LMTP)
##

# Address to use when sending rejection mails.
# Default is postmaster@<your domain>.
postmaster_address = postmaster

# Hostname to use in various parts of sent mails, eg. in Message-Id.
# Default is the system's real hostname.
hostname = test.machine

# If user is over quota, return with temporary failure instead of
# bouncing the mail.
#quota_full_tempfail = no

# Binary to use for sending mails.
#sendmail_path = /usr/sbin/sendmail

postmaster_address は、受信拒否の通知メールで使う送信元アドレスを設定する。
hostname は、この送信メールのMessage-Idなどで使用されるホスト情報を設定する。
quota_full_tempfail は、容量オーバーの際に受信拒否せずに一時的に失敗している旨を通知するか設定する。
sendmail_path は、sendmailコマンドのパスを設定する。


■auth-userdbソケットのパーミッションを調整した。

後半のPostfixの設定で扱うように、dovecot-ldaコマンドはユーザーvmailで実行される。
ユーザーvmailがアクセスできるように、auth-userdbソケットのパーミッションを調整した。

このauth-userdbソケットから、dovecot-ldaはメールボックス情報の検索を行うようだ。


○auth-userdbソケットが生成される場所を確認した。

[root@test conf.d]# less  /etc/dovecot/conf.d/10-mail.conf

(略)
# UNIX socket path to master authentication server to find users.
# This is used by imap (for shared users) and lda.
#auth_socket_path = /var/run/dovecot/auth-userdb
(略)

auth-userdbソケットをvmailユーザーが読み書きできるようにした。

[root@test conf.d]# vim /etc/dovecot/conf.d/10-master.conf
(略)
service auth {

  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone's userdb lookups.
  unix_listener auth-userdb {
    mode = 0600
    user = vmail

    #group =
  }

  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}

  # Auth process is run as this user.
  #user = $default_internal_user
}
(略)
もし、この設定をしていなければ、運用時に受信メールのメールボックスへの保存に失敗する。
次のような、内部エラーが発生し、deferrd にされる。
May  6 01:56:17 test dovecot: lda: Error: userdb lookup: connect(/var/run/dovecot/auth-userdb) failed: Permission denied (euid=5000(vmail) egid=5000(vmail) missing +r perm: /var/run/dovecot/auth-userdb, euid is not dir owner)
May  6 01:56:17 test dovecot: lda: Fatal: Internal error occurred. Refer to server log for more information.
May  6 01:56:17 test postfix/pipe[18592]: 28FCA9FC2F: to=<test@domain>, relay=dovecot, delay=0.15, delays=0.08/0.02/0/0.05, dsn=4.3.0, status=deferred (temporary failure)


■Dovecotの再起動を行い、auth-userdbソケットのパーミッションを確認した。


再起動前には、次の様に、auth-userdbは、rootがオーナーになっている。
[root@test conf.d]# ls /var/run/dovecot/ -Al
total 12
srw-------  1 root    root        0 Mar 16 17:17 anvil
srw-------  1 root    root        0 Mar 16 17:17 anvil-auth-penalty
srw-------  1 root    root        0 Mar 16 17:17 auth-client
srw-------  1 dovecot root        0 Mar 16 17:17 auth-login
srw-------  1 root    root        0 Mar 16 17:17 auth-master
srw-------  1 root    root        0 Mar 16 17:17 auth-userdb
srw-------  1 dovecot root        0 Mar 16 17:17 auth-worker
srw-------  1 root    root        0 Mar 16 17:17 config
srw-------  1 root    root        0 Mar 16 17:17 dict
srw-------  1 root    root        0 Mar 16 17:17 director-admin
srw-------  1 root    root        0 Mar 16 17:17 director-userdb
srw-rw-rw-  1 root    root        0 Mar 16 17:17 dns-client
srw-------  1 root    root        0 Mar 16 17:17 doveadm-server
lrwxrwxrwx  1 root    root       25 Mar 16 17:17 dovecot.conf -> /etc/dovecot/dovecot.conf
drwxr-xr-x. 2 root    root     4096 Sep 22  2015 empty
srw-rw-rw-  1 root    root        0 Mar 16 17:17 lmtp
drwxr-x---. 2 root    dovenull 4096 Mar 16 17:17 login
-rw-------  1 root    root        6 Mar 16 17:17 master.pid


○Dovecotの再起動を行った。

[root@test conf.d]# service dovecot restart
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]

○パーミッションが、設定した通りになっていることを確認した。

[root@test conf.d]# ls /var/run/dovecot/ -Al
total 12
srw-------  1 root    root        0 May  5 23:01 anvil
srw-------  1 root    root        0 May  5 23:01 anvil-auth-penalty
srw-------  1 root    root        0 May  5 23:01 auth-client
srw-------  1 dovecot root        0 May  5 23:01 auth-login
srw-------  1 root    root        0 May  5 23:01 auth-master
srw-------  1 vmail   root        0 May  5 23:01 auth-userdb
srw-------  1 dovecot root        0 May  5 23:01 auth-worker
srw-------  1 root    root        0 May  5 23:01 config
srw-------  1 root    root        0 May  5 23:01 dict
srw-------  1 root    root        0 May  5 23:01 director-admin
srw-------  1 root    root        0 May  5 23:01 director-userdb
srw-rw-rw-  1 root    root        0 May  5 23:01 dns-client
srw-------  1 root    root        0 May  5 23:01 doveadm-server
lrwxrwxrwx  1 root    root       25 May  5 23:01 dovecot.conf -> /etc/dovecot/dovecot.conf
drwxr-xr-x. 2 root    root     4096 Sep 22  2015 empty
srw-rw-rw-  1 root    root        0 May  5 23:01 lmtp
drwxr-x---. 2 root    dovenull 4096 May  5 23:01 login
-rw-------  1 root    root        6 May  5 23:01 master.pid



◆ Postfix側の設定 ◆


■Postfixで、dovecot-ldaコマンドが使えるように、定義を行った。

○dovecot-ldaコマンドの場所を確認した。

[root@test conf.d]# find / -name dovecot-lda
/usr/libexec/dovecot/dovecot-lda
ところで、下に示すようにdovecot-ldaコマンドへの、リンクがdeliverという名前で張られているが、
以下では、dovecot-ldaというファイルを直接用いる。

[root@test conf.d]# ls /usr/libexec/dovecot/deliver -Al
lrwxrwxrwx. 1 root root 11 Jan  8 16:36 /usr/libexec/dovecot/deliver -> dovecot-lda

dovecotという名前で、dovecot-ldaコマンドの実行方法について定義した。

[root@test postfix]# vim master.cf
dovecot  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}

/* オプションについての説明 */

<dovecot-ldaコマンドの引数>

引数 -f には、送信元アドレスを指定する。
Postfixのマクロ ${sender} を用いる。これは、受信メールのエンベロープの送信元アドレスを意味する。

引数 -d には、宛先アドレスを指定する。
Dovecotは、このアドレスを用いて保存先メールボックスを検索、決定する。
マクロ ${recipient} は、受信者アドレスを意味する。

他にも、様々な引数があり、たとえば、直接メールボックスを指定することも可能である。


<user>

このコマンドを実行するユーザー:グループを指定する。
ここでは、共に vmail が指定されているため、dovecot-ldaは、vmailユーザーで実行される。


<flags>

D
Delivered-To: recipient をヘッダーに付加し、エンベロープ受信者が指定される
これを用いるには、main.cfで transport名_destination_recipient_limit=1 でなければならない。 (後述)
ところで、既にヘッダーに、Delivered-To: が同じ受信者で含まれていれば、
メール配送がループしているとして検知 され、配送不能としてリターンされる。

R
Return-Path: をヘッダーに付加し、エンベロープ送信者が指定される。

h
コマンドラインにおいて受信者アドレスの @よりも右側の文字列 を、小文字に揃える。

u
コマンドラインにおいて受信者アドレスの @よりも左側の文字列 を、小文字に揃える。



■virtualユーザ宛てメールが定義済みdovecotに渡るように設定した。

[root@test postfix]# vim main.cf
直接関連する項目を挙げている。(その他の設定は省略している。)
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

上で定義済みの dovecot を指定している。
また、この定義 dovecot へは、受信者(RCPT TO)が複数あれば、1つにつき、1メールずつ送るように指定している。
これは、定義した dovecot の flags に、「 D 」が指定されているために要件となる。



■ Postfixの再起動の後に、動作テストを行った。

○Postfixの再起動

# service postfix restart


○動作テスト

fetchmailからPostfixにメールを転送した。
下記のように、Postfixは、定義済みの dovecot にリレーされた。
May  6 02:37:27 test postfix/qmgr[18000]: 5FD459FB53: from=<test@fromdomain>, size=7736, nrcpt=1 (queue active)
May  6 02:37:27 test dovecot: lda(test@todomain): msgid=<c o n f i d e n t i a l>: saved mail to INBOX
May  6 02:37:27 test postfix/pipe[18896]: 5FD459FB53: to=<test@todomain>, relay=dovecot, delay=86, delays=86/0.02/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
May  6 02:37:27 test postfix/qmgr[18000]: 5FD459FB53: removed
受信メールは、dovecotのIMAPサーバにメールクライアントを接続することで、受信できた。




<参考>

◇Dovecotに関して

・Dovecot LDA
< http://wiki2.dovecot.org/LDA > 2016年5月6日

・Dovecot LDA with Postfix
< http://wiki2.dovecot.org/LDA/Postfix > 2016年5月8日

・LDA Indexing
< http://wiki2.dovecot.org/LDA/Indexing > 2016年5月8日


◇Postfixに関して

・PIPE(8)
< http://www.postfix.org/pipe.8.html > 2016年5月8日

・PIPE(8)
< http://www.postfix-jp.info/trans-2.2/jhtml/pipe.8.html > 2016年5月7日

・[postfix-jp: 4024] Re: 複数RCPTコマンド時の挙動について
< http://www.postfix-jp.info/ML/arc-2.5/msg00023.html > 2016年5月7日

・[Dovecot] Why : dovecot_destination_recipient_limit = 1 ?
< http://www.dovecot.org/list/dovecot/2009-November/044173.html > 2016年5月7日