2013年8月25日日曜日

dovecot dbox形式 ”Alternate Storage”について

前回の続きです。
Dovecotのdbox形式のメールBOXフォーマットには、Alternate Storage機能があります。


具体的には、通常のメールBOXを配置しているディスク(またはパーティションやディレクトリ)とは別に、もう一つ代替となるディスク(またはパーティションやディレクトリ)を用意しておけば、その領域もメールBOXとして利用できるようになる機能です。
この機能を使えば、メールBOXのディスクが圧迫してきたので、古いメールを後から追加したディスクに退避させようといった事も可能になります。

この機能は、mail_locationに以下のように(青字の部分を追加で)指定するだけで利用できます。
※評価は、CentOS6.4(x86_64) + dovecot2.2.5 + システムアカウントで、/dev/sdb1を/archiveとしてマウントした状態で行っています

mail_location = sdbox:~/dbox:ALT=/archive/%n


以下、実際の操作例です。
 → 既読メールの移動を実施してみます

サンプルとしてuser01ユーザのメールBOXにメールが10通あり、全て既読の状態です。
# find /home/user01/dbox/
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.10
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.7
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.2
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.6
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.8
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.4
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.5
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.1
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.3
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.9
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
#

この状態から既読メールをAlternate Storageに移動させるには以下のように実行します。
# doveadm altmove -u user01 seen

結果、user01ユーザのメールBOXは以下のような状態になります。
 →既読メールの10通は/archive/user01ディレクトリ以下に移動しています
# find /home/user01/dbox/ /archive/user01
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
/archive/user01
/archive/user01/mailboxes
/archive/user01/mailboxes/INBOX
/archive/user01/mailboxes/INBOX/dbox-Mails
/archive/user01/mailboxes/INBOX/dbox-Mails/u.8
/archive/user01/mailboxes/INBOX/dbox-Mails/u.1
/archive/user01/mailboxes/INBOX/dbox-Mails/u.9
/archive/user01/mailboxes/INBOX/dbox-Mails/u.6
/archive/user01/mailboxes/INBOX/dbox-Mails/u.4
/archive/user01/mailboxes/INBOX/dbox-Mails/u.10
/archive/user01/mailboxes/INBOX/dbox-Mails/u.3
/archive/user01/mailboxes/INBOX/dbox-Mails/u.2
/archive/user01/mailboxes/INBOX/dbox-Mails/u.7
/archive/user01/mailboxes/INBOX/dbox-Mails/u.5

#

※この機能は、dbox-alt-rootファイルが、シンボリックリンクになることで実現しています。
# ls -l /home/user01/dbox/dbox-alt-root
lrwxrwxrwx 1 user01 user01 15 Aug 25 23:02 /home/user01/dbox/dbox-alt-root -> /archive/user01/
#

なお、移動したAtteanate Storageのメールを元に戻すには以下のように実行します。
# doveadm altmove -r -u user01 all


以上、今回は手動で既読メールを移動させる操作例をあげましたが、バッチ処理でより複雑な条件での操作も可能なので、詳しくは下記を参照してください。

http://wiki2.dovecot.org/Tools/Doveadm/Altmove
http://wiki2.dovecot.org/Tools/Doveadm/SearchQuery

2013年8月20日火曜日

dovecot dbox形式

Dovecotには、独自のメールBOXフォーマットが存在します。
※Maildir形式のように1通のメッセージを1つのファイルとして保存するsdbox形式、mbox形式のように複数のメッセージを1つのファイルとして保存するmdbox形式(ただし、ある程度のサイズで複数のファイルに分割されます)の2種類です。


設定は特に難しいところはなく、sdbox形式の場合を例にするとmail_locationに以下のよう指定するだけで利用できます。
※評価はCentOS6.4(x86_64) + dovecot2.2.4 + システムアカウントで行っています

mail_location = sdbox:~/dbox


実際にメールを格納するとMaildir形式とは異なりメールそのものは、u.1やu.2のような名前で保存され、メールが未読でも既読でもSeenフラグなどが付くことがありません。

# find ~user01/dbox/
/home/user01/dbox/
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.3
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.1
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.2
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/dovecot-uidvalidity.51ac2f97
#

1通のメールは以下のようになります。
Maildir形式と比較するとメッセージの前後に追加の情報が付くようです。

# cat /home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.5
2 M1e C51ac33f6
N          0000000000000277

Return-Path: <user101@mail.example.com>
X-Original-To: user01@mail3.example.com
Delivered-To: user01@mail3.example.com
Received: from mail.example.com (R-538.mshome.net [192.168.137.1])
        by mail3.example.com (Postfix) with SMTP id 8AD6E3FF6B
        for <user01@mail3.example.com>; Mon,  3 Jun 2013 15:13:08 +0900 (JST)
From: user101 <user101@mail.example.com>
To: user01@mail3.example.com
Subject: test
Date: Mon, 03 Jun 2013 15:13:08 +0900
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <E1CE60216AB962user101@mail.example.com>
test

R51ac33f6
V288
G87ca8705f633ac51190a000048c9b678

#


今回の最終的なdovecotの設定は以下になります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = sdbox:~/dbox
passdb {
  driver = pam
}
protocols = pop3
ssl = no
userdb {
  driver = passwd
}
#


またMTAにpostfixを利用する場合は、そのままだとメールBOXに配送ができないので、DovecotのLDAかLMTPなどを利用して配送を実施する必要があります。
※LDAとLMTPについては、今後書きたいと思います

一例を挙げておきます。
システムアカウントを利用してDovecotのLDAで配送をするなら、以下のように設定します。

mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"


2013年8月5日月曜日

dovecot passwd-fileについて

今回は、Dovecotの認証データベースの1つであるpasswd-fileについてです。


特徴は、以下のようになります。

  • /etc/passwdと(ほぼ)同じ書式で記述ができる(⇒ extra_fieldが追加できる
  • 認証で必要な箇所だけ記述すれば利用できる(下記の設定例を参照ください)
  • システムアカウントにもバーチャルアカウントにも利用できる


以下、設定例です。
※評価はCentOS6.4(x86_64) + dovecot 2.2.4で行っています。


システムアカウントで利用する場合

※SSHのパスワードなどと、メールのパスワードを別にしたい場合に有用です

1./etc/dovecot/usersを以下のように作成します。
user01:{PLAIN}password
user02:{PLAIN}password

2.passwd-fileを利用する為の設定

/etc/dovecot/conf.d/10-auth.conf:
※以下の行を有効にします
!include auth-system.conf.ext
!include auth-passwdfile.conf.ext

/etc/dovecot/conf.d/auth-system.conf.ext:
※以下の行だけ有効にします
userdb {
  driver = passwd
}

/etc/dovecot/conf.d/auth-passwdfile.conf.ext:
※以下の行だけ有効にします
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

最終的な全体設定は以下のようになります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = maildir:~/Maildir
passdb {
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  driver = passwd-file
}
protocols = pop3
ssl = no
userdb {
  driver = passwd
}


バーチャルアカウントでの利用する場合

下記ではメールBOXなどの情報をstaticに持たせています


1./etc/dovecot/usersを以下のように作成します。
user01@example.com:{PLAIN}password
user02@example.jp:{PLAIN}password

2. passwd-fileを利用する為の設定

/etc/dovecot/conf.d/10-auth.conf:
※以下の行を有効にします
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

/etc/dovecot/conf.d/auth-passwdfile.conf.ext:
※以下の行だけ有効にします
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

/etc/dovecot/conf.d/auth-static.conf.ext:
※以下の行だけ有効にします
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%d/%u
}
※vmailユーザはあらかじめ以下のように作成しておく必要があります
# groupadd -g 5000 vmail
# useradd -g 5000 -u 5000 -s /sbin/nologin vmail

最終的な全体設定は以下のようになります。
# doveconf -n
# 2.2.4: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.14.1.el6.x86_64 x86_64 CentOS release 6.4 (Final)
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = maildir:~/Maildir
passdb {
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  driver = passwd-file
}
protocols = pop3
ssl = no
userdb {
  args = uid=vmail gid=vmail home=/home/vmail/%d/%u
  driver = static
}


以上で、/etc/dovecot/usersに記述した2ユーザーでアクセスするとメールBOXは
以下のようになります。

# pwd
/home/vmail
# ls -l
total 8
drwx------ 3 vmail vmail 4096 Aug  5 00:06 example.com/
drwx------ 3 vmail vmail 4096 Aug  5 00:05 example.jp/
# find .
.
./example.jp
./example.jp/user02@example.jp
./example.jp/user02@example.jp/Maildir
./example.jp/user02@example.jp/Maildir/dovecot-uidvalidity.51fe6dce
./example.jp/user02@example.jp/Maildir/maildirfolder
./example.jp/user02@example.jp/Maildir/dovecot.index.log
./example.jp/user02@example.jp/Maildir/dovecot-uidlist
./example.jp/user02@example.jp/Maildir/dovecot-uidvalidity
./example.jp/user02@example.jp/Maildir/tmp
./example.jp/user02@example.jp/Maildir/cur
./example.jp/user02@example.jp/Maildir/new
./.bash_logout
./example.com
./example.com/user01@example.com
./example.com/user01@example.com/Maildir
./example.com/user01@example.com/Maildir/maildirfolder
./example.com/user01@example.com/Maildir/dovecot.index.log
./example.com/user01@example.com/Maildir/dovecot-uidlist
./example.com/user01@example.com/Maildir/dovecot-uidvalidity
./example.com/user01@example.com/Maildir/tmp
./example.com/user01@example.com/Maildir/cur
./example.com/user01@example.com/Maildir/new
./example.com/user01@example.com/Maildir/dovecot-uidvalidity.51fe6de3
./.bash_profile
./.bashrc
#