dovecot + mysql †
説明 †
virtual domain 対応 postfix + dovecot + mysql システムの一環として、
dovecot + mysql を構築する。
入手 †
公式サイト: Dovecot
Download ページを選択。
必要環境 †
インストール †
- アーカイブの入手と準備
$ wget http://dovecot.org/releases/1.1/dovecot-1.1.1.tar.gz
$ tar xvzf dovecot-1.1.1.tar.gz -C /usr/local/src/build/
$ cd /usr/local/src/build/dovecot-1.1.1
$ vi ./Config.sh
CPPFLAGS=-I/usr/local/ssl/include LDFLAGS=-L/usr/local/ssl/lib
./configure \
--prefix=/usr/local/SOFTWARE/dovecot-1.1.1 \
--with-linux-quota=2 \
--with-mysql \
--with-ssl=openssl \
--with-ssldir=/usr/local/ssl/etc \
2>&1 | tee configure.log
- ビルド
$ sh Config.sh
$ make 2>&1 | tee make.log
$ sudo make install 2>&1 | tee install.log
- stow (1) を使いシンボリックリンク作成
$ su -
# stow -t /usr/local/ /usr/local/SOFTWARE/dovecot-1.1.1/
- 設定ファイル雛型のコピー
# cd /uet/local/etc
# cp dovecot-example.conf dovecot.conf
# cp dovecot-sql-example.conf dovecot-sql-.conf
- 起動スクリプト作成
dovecot wiki 内 Sample Dovecot init.d script のサンプルを環境にあわせて変更したものを使用。
設定ファイル †
dovecot.conf で dovecot 全体の設定、
dovecot-sql.conf では mysql に問い合わせる際に必要な設定を行う。
認証パスワード等を記載するので、管理者以外読み込めなくしておく。
# chmod 600 dovecot.conf dovecot-sql.conf
- devcot.conf
# 指定しない場合は /usr/local/dovecot/var/run が適用される
base_dir = /var/run/dovecot/
# 扱う protocol を指定
protocols = imaps pop3s
# 受付 port 番号を指定
protocol imap {
listen = *:143
ssl_listen = *:993
}
protocol pop3 {
listen = *:110
ssl_listen = *:995
}
# plaintext での認証をデフォルト拒否する
# SSL 接続やローカルホストからの接続は受け付ける
disable_plaintext_auth = yes
# syslog とは別にログを取得する場合に指定
log_path = /var/log/dovecot/err.log
info_log_path = /var/log/dovecot/info.log
# ssl 通信に必要なサーバー鍵を指定
ssl_cert_file = /usr/local/etc/postman.pem
ssl_key_file = /usr/local/etc/newkey.pem
# ログイン認証時に chroot する
login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
# バーチャルドメイン共通メールボックスを指定
# postfix 及び postfix-admin での指定に合わせる
# /path/to 部:postfix
# /%d/%n 部:postfix-admin
mail_location = maildir:/path/to/%d/%n
first_valid_uid = 10000
# 各プロトコルで使用する plugin を指定
protocol imap {
mail_plugins = quota imap_quota
}
protocol pop3 {
mail_plugins = quota
}
protocol lda {
# 拒否メールを送るときに使うアドレス。
postmaster_address = postmaster@example.com
# Message-Id などのメールの送信で色々な部分で使うホスト名。
# デフォルトはシステムでの実際のホスト名。
hostname = postman.tukizakura.org
}
# 認証設定
auth default {
# 認証メカニズムを列挙する。クライアントととのパスワード交換時に使う。
# 通常は plain のまま (apop 使用時は apop も指定)
mechanisms = plain
# mysql 使用時にパスワード、ユーザデータを問い合わせする
# SQL クエリを設定しているファイルを指定する。
passdb sql {
args = /usr/local/etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /usr/local/etc/dovecot/dovecot-sql.conf
}
#ユーザデータベースとパスワードデータベースにアクセスする時のユーザ
user = root
#他のプログラムに提供する認証のインタフェース
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
# postfix で smtp-auth を行う設定
client {
path = /var/spool/postfix/private/auth
user = postfix
group = postfix
mode = 0660
}
}
}
プラグイン全般の設定
plugin {
# quota 方式の指定
quota = maildir
# 全てのメールボックスを指定サイズに制限
quota_rule = *:storage=256MB
# ユーザ個別 quota を mysql に問い合わせる設定
# 固定 uid/gid で管理している場合は uid/gid を固定で指定
user_query = select home, 10000 as uid, 10000 as gid \
concat('*:bytes=', quota) as quota_rule \
from mailbox where username = '%u' and active = '1'
# 指定% になった時に実行するプログラムの指定
quota_warning = storage=90%% /usr/local/bin/quota-warning.sh 90
}
- dovecot-sql.conf
driver = mysql
# mysql に収納さているパスワードの方式を指定(postfixadminの設定にあわせる)
default_pass_scheme = MD5-CRYPT
# ローカルホスト上の DB の場合は、unix ソケットを指定する
connect = host=/var/run/mysqld/mysqld.sock \
dbname=postfixDB名 user=postfixユーザ password=postfixパス
# 固定 uid/gid で管理している場合は uid/gid を固定で指定
user_query = SELECT concat('/usr/local/virtual/', maildir) as home, \
10000 as uid, 10000 as gid FROM mailbox WHERE username='%u' AND active='1'
password_query = \
SELECT username, domain, password \
FROM mailbox WHERE username='%u' AND active='1'
- quota warnning script
# vi /usr/local/SOFTWARE/dovecot-1.1.1/sbin/quota-warning.sh
# ln -s /usr/local/SOFTWARE/dovecot-1.1.1/sbin/quota-warning.sh \
/usr/local/sbin/quota-warning.sh
#!/bin/bash
PERCENT=$1
echo "Your mailbox is now $PERCENT% full." \
| /usr/bin/mail -s "<Tukizakura Mail System> Important report "$USER"
認証に関して †
⇒ See Also: ユーザ認証の理解
セキュリティ確保の為に、認証及び、パスワード自体の暗号化が求められる。
この二つの暗号化はやもすると混同しがちになるが、基本的に下記のようになる。
- 認証のメカニズム
認証時のクライアント/サーバ間のやり取りに使用する暗号化。
通信を傍受された場合等への対処として、生のテキスト(plaintext)で送受信せずにデータを暗号化する。
sylpheed 等の MUA ~ Dovecot 間、postfix での SMTP-AUTH 使用時の MTA ~Dovecot 間で使い、
それぞれが使用する認証メカニズムに対応している必要がある。
これには PLAIN を含め、CRAM-MD5, DIGEST-MD5, APOP 等を指定する。
auth default {
mechanisms = plain
}
- パスワード暗号化
サーバがクラックされた時等に、パスワード本体がそのままでは読まれないようにする為の暗号化。
多数の異なるフォーマットを扱える。
CRYPT, MD5, PLAIN-MD5, HMAC-MD5, DIGEST-MD5, SHA, SSHA, PLAIN
default_pass_scheme = MD5-CRYPT
- 注意点
認証メカニズム間の互換性が無い為に下記2点の制限がある。
1. 複数のメカニズムを使用する場合、パスワード本体は PLAIN である事が必要。
2. パスワード側が暗号化(PLAIN でない)されている場合は、認証メカニズムをパスワードの暗号方式に合わせるか、
もしくは PLAIN 方式でなくてはならない。
通常はパスワードが何かしらの形ですでに暗号化されている事から、2.の方式を取る事が多い。
通信の傍受に対する危険については、POP3S, IMAPS などの SSL を使った通信にすれば問題が無くなる。
システム全体の設計によるが、今回のシステムではそもそも postfix-admin で MD5-CRYPT を使用するので、自動的に 2. の形式をとる事となった。
ProFTPd (FTP-SSL) <--------|
Postfix (SMTP-TLS) <--------|
| |
| locale接続
remote接続(SSL) |
| +--------> Dovecot-SASL <----------> MySQL (Postfix-Admin)
| [認証メカニズム PLAIN] [パスワード方式 MD5-CRYPT]
メール送信&FTP |
===クライアント=== remote接続(SSL)
メール受信 |
| |
MUA(POP3S, IMAPS) <--------|
扱うテーブルの内容 †
devcot がユーザ認証時に問い合わせる postfix-admin で作った DB & table
$ mysql -u root postfix
mysql> desc mailbox;
+----------+--------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------------------+-------+
| username | varchar(255) | NO | PRI | | |
| password | varchar(255) | NO | | | |
| name | varchar(255) | NO | | | |
| maildir | varchar(255) | NO | | | |
| quota | bigint(20) | NO | | 0 | |
| domain | varchar(255) | NO | | | |
| created | datetime | NO | | 0000-00-00 00:00:00 | |
| modified | datetime | NO | | 0000-00-00 00:00:00 | |
| active | tinyint(1) | NO | | 1 | |
+----------+--------------+------+-----+---------------------+-------+
courier-imap Maildir から dovecot Maildir へコンバート †
公式サイトで配布されているコンバートスクリプトを使用する。
$ ./courier-dovecot-migrate.pl
Finding maildirs under .
Maildir/courierimapuiddb: OK
Maildir/.Draft/courierimapuiddb: OK
Maildir/.Drafts/courierimapuiddb: OK
Maildir/.Sent/courierimapuiddb: OK
Maildir/.Trash/courierimapuiddb: OK
Total: 0 POP3 changes for 0 mailboxes / 0 users
0 IMAP changes for 0 mailboxes / 0 users
0 errors
No actual conversion done, use --convert parameter
$ ./courier-dovecot-migrate.pl --convert
Finding maildirs under .
Maildir/courierimapuiddb: OK
Maildir/.&g0l6Pw-/courierimapuiddb: OK
Maildir/.&kAFP4V+FMGE-/courierimapuiddb: OK
Maildir/.&kAFP4WOn-/courierimapuiddb: OK
Maildir/.&U9dP4Xux-/courierimapuiddb: OK
Maildir/.Draft/courierimapuiddb: OK
Maildir/.Drafts/courierimapuiddb: OK
Maildir/.Sent/courierimapuiddb: OK
Maildir/.Trash/courierimapuiddb: OK
Total: 0 POP3 changes for 0 mailboxes / 0 users
0 IMAP changes for 0 mailboxes / 0 users
0 errors
9 dovecot-uidlist files written
Maildir 内に dovecot 用ファイルが作成される。
- Maildir/dovecot-uidlist
- Maildir/subscriptions
/usr/local/virtula/-DOMAIN- 配下の-USER-という名前のディレクトリに mv し、
適切な所有者に変更しておく。
# mv /homu/-USER-/Maildir /usr/local/virtual/-DOMAIN-/-USER-
# chown -R vmail:vmail /usr/local/virtual/-DOMAIN-/-USER-
# rm -fr courierimap*
参考資料 †