Dovecotの設定

移転しました

独自ドメインサイトへ移行しました。5秒後に

https://straypenguin.winfield-net.com/

へジャンプします。

LDAP連携に関係するファイル一覧

/etc/
   \_ dovecot.conf              [root:root 644] 主設定ファイル
      dovecot.d/                [root:root 755] 補助設定ファイル用ディレクトリ (新規作成)
             \_ ldapref.conf    [root:dovecotauth 640] LDAP参照定義ファイル

dovecot.conf - 主設定ファイル

Dovecot 1.0 以前のドキュメントは甚だ不足しているので、LDAP と関わりがなくても主なパラメータについては掲載する。当実装に特に深く関わるものは 地で示す。最新のディレクティブリストはオフィシャルサイト Dovecot.orgDovecot configuration file で見られるが、1.1 からは記述法やパラメータ名が大幅に変更になっている。

パラメータ名 説明
基本設定
base_dir /var/run/dovecot/ ランタイムデータの保持に使用するディレクトリ
protocols pop3 提供するサービスプロトコル。本稿では IMAP は扱わない
imap_listen   IMAP サービスは提供しないのでヌル
pop3_listen * POP3 サービスでリッスンする IPアドレス。 * ならマシンの持つインターフェイスアドレス全て。host:port の書式でポートを変えることも可能。ただし複数のアドレスを指定することはできない
imaps_listen   同、IMAPS サービスについて
pop3s_listen   同、POP3S サービスについて
SSL    
ssl_disable yes POP3 通信の SSL/TLS サポートの無効/有効
disable_plaintext_auth no クライアントとの通信が SSL/TLS で暗号化されていない限り平文パスワードによるログインを一切禁止する/しない
ログ    
log_path   Dovecot 自体で直接ログを書き出す場合の出力ファイルパス。ヌルなら syslog() に渡す
info_log_path   Dovecot 自体で直接インフォメーションログを書き出す場合。ヌルなら syslog() に渡す
log_timestamp "%b %d %H:%M:%S " syslog 経由でない場合のタイムスタンプフォーマット
ログインプロセス
login_dir /var/run/dovecot-login 認証プロセス用 UNIXソケットファイルの作成ディレクトリ
login_chroot yes 認証プロセスを上記 login_dirchroot() させる
POP3 ログインプロセス    
login_executable /usr/libexec/dovecot/pop3-login ログインプロセス実行プログラム
login_user dovecot ログインプロセスの実行ユーザ。セキュリティ対策
login_process_size 32 ログインプロセス 1個あたりの最大制限サイズ (MB)
login_process_per_connection yes 1ログイン毎にひとつのログインプロセスで扱う
login_processes_count 10 待機するログインプロセスの数。login_process_per_connection=yes の時は予備として待機する数となる
login_max_processes_count 128 一時に多数のログインが要求された時に、同時に存在できるログインプロセスの数。上記 login_process_count で足りない時には login_process_count x2, x2, ... と、要求が満たされるかこの上限値に達するまでプロセスが生成される。login_process_per_connection=yes でない時は無視される
login_max_logging_users 256 同時に存在できるログイン処理コネクションの数。この上限に達すると、最も古いコネクションから切断される
メール読取りプロセス
max_mail_processes 1024 同時に存在できるメール読取プロセス数の上限
verbose_proctitle no ps の出力にログインユーザ名やクライアントIPなども表示
verbose_ssl no SSL接続に関してプロトコルレベルのエラーも表示
first_valid_uid 500 ログインを許可するユーザのUID下限
last_valid_uid 0 ログインを許可するユーザのUID上限 (0 で無制限)
first_valid_gid 500 ログインを許可するユーザのGID下限
last_valid_gid 0 ログインを許可するユーザのGID上限 (0 で無制限)
mail_extra_groups   上記以外に許可する特別なUID
valid_chroot_dirs /var/vmail メール読み取りプロセスの chroot() を許可するディレクトリ基底
mail_chroot   全てのユーザをひとつのディレクトリに chroot() する場合のパス
default_mail_env maildir:/var/vmail%h/Maildir/ メールボックスの位置を示す環境変数。%h は後述の auth_userdb から得られたホームディレクトリに置き換えられる。当実装では、アカウントのLDAPエントリから取得された homeDirectory 属性値が %h に入ることになる
メールインデックスキャッシュ
mail_cache_fields MessagePart メールインデックスファイルにキャッシュするメール属性
mail_never_cache_fields   同、キャッシュしない属性
client_workarounds outlook-idle outlook-pop3-no-nuls メールクライアントの癖への対策
mailbox_check_interval 0 新着メールをクライアントに通知する間隔 (ローカルのみ)
mailbox_idle_check_interval 30 同、IDLE コマンド時
mail_full_filesystem_access no ファイルシステムとしての操作をクライアントに許可するか
mail_max_flag_length 50 (説明割愛。デフォルト)
mail_save_crlf no メール全てを CRLF改行にして保存するか
mail_read_mmaped no メールファイルの読み取りに使用するコールの種類。yesmmap(), no なら read()
maildir_stat_dirs no LIST コマンドで Maildir下のドットで始まるファイルを返す。yes では毎回ディレクトリを stat() してディレクトリリストを返す
maildir_copy_with_hardlinks yes 新着メール (new/) を既読メールフォルダ (cur/) へ移動する際などにハードリンクコールを使用して速度アップ
maildir_check_content_changes no 個々のメールファイルが Dovecot以外のプログラムによって変更/改変されていないか確認し、変更されていたら新着メールとして扱うか
mbox_locks fcntl (mbox専用)
mbox_read_dotlock no (mbox専用)
mbox_lock_timeout 300 (mbox専用)
mbox_dotlock_change_timeout 30 (mbox専用)
umask 0077 メールファイル/ディレクトリ操作時の umask
プロセス
mail_drop_priv_before_exec no メールプロセス実行時に root権限を剥奪するか
IMAP プロセス    
imap_executable /usr/libexec/dovecot/imap IMAPプロセス実行ファイル
POP3 プロセス    
pop3_executable /usr/libexec/dovecot/pop3 POP3プロセス実行ファイル
pop3_process_size 256 POP3プロセスの最大サイズ (MB)
pop3_use_modules no ローダブル拡張モジュールを使用するか
認証プロセス
auth = default   認証プロセス名。次に auth=xxx が現れるまでがひとつのプロセス定義となる
auth_mechanisms plain クライアントと遣り取りする認証の方式。複数の候補を有効にする時にはスペース区切りで連ねる
auth_realms   SASL認証のレルムのリスト (スペース区切り)
auth_default_realm   平文ログインの場合: @ 以降のないユーザ名でログインしようとした場合にデフォルトで補完する @domain.tld
SASL認証時: デフォルトのレルム
auth_passdb ldap /etc/dovecot.d/ldapref.conf パスワード取得先としての LDAP参照定義
auth_userdb ldap /etc/dovecot.d/ldapref.conf アカウント情報取得先としての LDAP参照定義
auth_executable /usr/libexec/dovecot/dovecot-auth 認証プロセス実行プログラム
auth_process_size 256 認証プロセスの最大サイズ (MB)
auth_user dovecotauth 認証プロセスの実行ユーザ。セキュリティ対策
auth_chroot   認証プロセスを chroot() するディレクトリ。chroot() すると LDAP参照が成り立たないのでヌル(無効)
auth_count 1 生成する認証プロセスの数
auth_username_chars abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
01234567890.-_@
ログイン名に使用できる文字。LDAPインジェクション避け
auth_anonymous_username anonymous (説明割愛。SASL認証用)
auth_verbose no ログに認証プロセスの詳しいログを出力するか
auth_debug no 上記にさらに詳しい出力を加えるか

ldapref.conf - LDAP参照定義ファイル

まず、今後補助設定ファイルが増えることを見込んで、補助設定ファイル用のサブディレクトリ /etc/dovecot.d/ を作成する (root:root 755)。その配下に LDAP 参照定義ファイル ldapref.conf (ファイル名は任意) を以下の要領で作成する。

設定サンプル: ldapref.conf

hosts = localhost
dn = cn=mailadmin,ou=mail,o=hoge,dc=cxm
dnpass = password
ldap_version = 3
base = ou=mail,o=hoge,dc=cxm
deref = never
scope = onelevel
 
# auth_passdb configuration.
pass_attrs = mail,userPassword
pass_filter = (&(objectClass=inetOrgPerson)(mail=%u)(!(accountStatus=disabled)))
default_pass_scheme = PLAIN-MD5
 
# auth_userdb configuration.
user_attrs = mail,homeDirectory
user_filter = (&(objectClass=inetOrgPerson)(mail=%u)(!(accountStatus=disabled)))
user_global_uid = 1025
user_global_gid = 1025
hosts
LDAPサーバを別のマシンで動かしている場合はそれなりに。スペース区切りで複数指定することも可能とあるが、フォールバック動作なのかラウンドロビン動作なのか不明。host:port による指定も可能。
dn
問い合わせ時に bind する DN
dnpass
bind パスワード。当実装ではつまり LDAPアカウント mailadmin のパスワード。ハッシュして書いておく方法はないようだ。
ldap_version
問い合わせに使う LDAPプロトコルバージョン。
base
アカウントエントリを検索する Directory ツリー。後述の pass_filter にあるような %x 変数は使えないようだ。
deref
属性のデリファレンス (dereference = LDAP属性のシンボリックリンクのようなもの) をどういう局面で辿るか。never, searching, finding, always のいずれか。
scope
ldapsearch で言うところの -s オプションにあたるもの。base, onelevel, subtree のいずれか (one, sub といった略記法ではダメ)。特に理由のない限り onelevel にして検索負荷を軽減。
auth_passdb 用のブロック

ログイン認証用の参照定義。

pass_attrs
パスワードチェックに使用する LDAP属性。ふたつの属性が必要で、ひとつ目に user@domain.tld の得られる属性、2番目にパスワードを格納している属性を指定する。
pass_filter
このファイル最大のポイント。値は LDAPクエリフィルタ規格 に基づくフォーマットで書く。例は、「オブジェクトクラスがinetOrgPerson」且つ「mail属性がユーザ名全体と等しく」且つ「accountStatus属性がdisabledでない」エントリを検索せよ、というフィルタだ。組み込み変数 %u で表される「ユーザ名」は、POP3 ログイン時にクライアントの申告してくるアカウント名だが、dovecot.confauth_default_realm に補完ドメインが指定してある場合には補完後の文字列となる。例では、クライアントが `user@hoge.cxm' のカタチで名乗ることを前提にしている。この他の組み込み変数には %n, %d があり、%n はアカウントID から @domain.tld 以降を取り除いたもの (@以降がなかった時はそのまま)、%d@ より後ろ全部。余計な Directory ツリーを探し回らせず検索を効率化するために、フィルタはできるだけ限定的にするべき。(objectClass=inetOrgPerson)AND 条件の筆頭に書いてあるのはそのためだ。
default_pass_scheme
パスワードデータベースに格納されているパスワードの格納形式。Dovecot 0.99 でサポートされているこの他の形式は PLAIN, DIGEST-MD5, CRYPT。本稿では「事前MD5方式」を前提としているので、ここに指定すべきは PLAIN-MD50.99 での LDAP連携における現実的な値は LDAP-MD5CRYPT (「LDAP-CTYPT方式」を採用する場合) に絞られる。
auth_userdb 用のブロック

ユーザのメールボックスを特定するための参照定義。

user_attrs
データベースから取得する属性。ふたつの属性が必要で、ひとつ目に user@domain.tld の得られる属性、2番目にホームディレクトリを格納している属性を指定する。得られたホームディレクトリの値は最終的に dovecot.confdefault_mail_env パラメータに従って整形されて実用に供される。
user_filter
auth_passdb ブロックでの説明を参照のこと。
user_global_uid, user_global_gid
メールの読み取り/削除を行う際に mail プロセスが setuid/setgid する UNIX UID/GID。一般のメールユーザをバーチャルユーザとして扱う当実装では常に mailadmin の権限で行わせたいので、UNIXユーザ mailadminUID, GID を設定しておく。

このファイルには LDAP データ読み取り専用ユーザのパスワードが書かれているので、一般の UNIXユーザに読めないよう、パーミッションは必ず root:dovecotauth の 640 にしておかなければいけない。

サービスの起動

root# chkconfig dovecot on
root# service dovecot start

テスト

ローカル上や別のマシン上から、バーチャルメールアカウントの例えば penguin@hoge.cxm で POP3 ログインしてメールを読んでみる。テストコマンドは Qmail のページの「動作テストのためのコマンド」でいろいろと紹介している。