【IT備忘録】 Dovecot の設定(コンフィギュレーション) | 仕事の覚書き

仕事の覚書き

メモメモ

1. Dovecot の 構成設定ファイルの構造について

ウェブに転がっている記述例を見ると、その大半が、全ての構成定義が纏まった dovecot.conf ひとつで説明している(涙)
Dovecot 2.0 以降なのか定かではないが、現在使用している Dovecot 2.0.9 では、/etc/dovecot/dovecot.conf は比較的小さく、構成設定ファイル設置用ディレクトリ /etc/dovecot/conf.d の下に、技術要素的な項目毎に細分化された 構成定義ファイル(*.conf)拡張定義ファイル (*.conf.ext) が格納されている。また、dovecot.conf が置かれている上位のディレクトリにも、オプション機能の追加など、必要に応じて、拡張定義ファイル(*.conf.ext) を置いたりするのに用いられる。
Docecot 2.0.X の構成定義について、参考になる 「大変良く書けている記事」 がコレ: 「dovecot-2.0.x ハマリ道」 詳しい説明がない部分については、自ら、システムの挙動を確認しているところなどは ”大変素晴らしい” の一言♪
ちなみに、前回の記事にも書いたが、SQL にユーザ・パスワード情報を格納し、認証用DB として利用する場合 には、dovecot-sql.conf.ext という拡張定義ファイルが必要になる (LDAPを使用する場合や、dovecot のローカルDBを使用する場合も同じ)。このファイルを含む 構成定義ファイルの記述例 が、/usr/share/doc/dovecot2.0.9/example-config 下に収められているので、使用するものを選び、これを /etc/dovecot に複製編集して使用する。
conf.d 下にある構成定義ファイルは、頭に2桁の数値が割り振られているが、これは、conf.d 下の構成定義情報をローディングする際に、この番号を使用して、順次昇順にローディングしていく… とのことである。
ファイルの設定パラメータを書き換える方法は、ひとつではないが、/etc/dovecot/dovecot.conf の末端にある local.conf の読み込みをアクティブにし (具体的には、#!include_try /etc/dovecot/local.conf の先頭の '#' を外し)、差分は全て local.conf に書く…という方法もなかなか良い方法である。参考: 「メールサーバ構築その2(Dovecot編)」

2. 全体部分の構成定義 (/etc/dovecot/dovecot.conf) の設定

構成定義ファイル上では、文頭など記述されている位置に寄らず、# 文字以降は全てコメントとして扱われる。
また、初期時にコメントアウトされているパラメータ(のほとんど)は、デフォルト値であり、パラメータ定義が省略されている場合は、その値が使用されるようである。このため、設定しようとする値が、デフォルト記述と変わらない場合は、敢えて書く必要はない。
[補足] 構成定義項目名の最後に "**" とマーキングしてある要素が、今回自分が設定した部分。一応、解かりやすいように、全体を太字でハイライトしておくことにする。

## Dovecot 構成定義ファイル
(1) protocols = imap pop3 lmtp [記述例: protocols = imap lmtp] **
imap
 pop3 lmtp の中から Dovecot で実装するプロトコルを列挙。ちなみに 1.X では、imaps や pop3s とした "セキュア" の 's' を付けた略称も可能だったらしいが、2.0.X では、imap や pop3 もしくは lmtp 等、「純粋なプロトコル名のみ」 で、SSL 適用の有無やポート番号などは、別途、サービス(service)文として、10-master.conf に記述するようになっている。
(2) listen = *, :: [記述例: listen = *]
IPv4 のみの場合は "listen *" の形式に変更しないといけないという噂がある。デフォルトの書式は IPv4・IPv6 の双方を受け入れる例。複数を併記する場合は カンマ ',' で区切る。
(3) base_dir = [記述例: base_dir = /var/run/dovecot/]
(4) login_greeting =  [記述例: login_greeting = Dovecot ready.]
(5) login_trusted_networks =  [記述例: login_trusted_networks = 192.168.1.0/24 127.0.0.0/18]
プロトコルベースでのログイン時に、信頼できるネットワーク(trusted network)のアドレス範囲を設定する。記法は、一般的な十進数を '.' で連結し、必要に応じて '/' 以下でネットマスク(マスクのビット長)を指定する。複数ある場合はスペースで間を空けて、列挙する。
(6) login_access_sockets = [記述例: login_access_sockets = ]
(7) verbose_proctitle = [記述例: verbose_proctitle = no]
(8) shutdown_clients = [記述例: shutdown_clients = yes]
(9) doveadm_worker_count = [記述例: doveadm_worker_client = 0]
(10) doveadm_socket_path = [記述例: doveadm_socket_path = doveadm_server]

## ディクショナリサーバ設定
dict {
   #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
   #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
}
!include conf.d/*.conf
#!include_try /etc/dovecot/local.conf

3. 個別部分の構成定義の設定

こちらの方は、「やりたいこと」 に合わせて説明していきます。

3.0 デバッグモード関連の設定

今回は、まず平文のパスワードでメールサーバがきちんと動作するところまで確認することにあるので、ログ採取で有用な情報を得るために、デバッグモードを使用することにします。

(1) /etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot.log
: デフォルトは syslog に設定されています。関連情報 info_log_path やデバッグ情報 debug_log_path も、デフォルトはこの log_path に設定されているので、log_path を設定するだけで、この情報をひとつのログファイルに集約することができます。ちなみにログファイルをモニタリングする際は、ターミナルから tail コマンドを打って使用します(例:tail -f /var/log/dovecot.log)。
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
mail_debug = yes
上記項目をセットすることで、認証が失敗したときの参考情報を吐いてくれます。認証周辺は難所なので、ここを yes に設定しておきます。SSL が絡むフェーズになったら、次の項目もオンに設定します。
verbose_ssl = yes
当たり前ですが、一連の検証作業が終わったら、全てを元に戻しておく必要があります(笑)

3.1 ユーザ認証関連の設定 《パスワードのダイジェストは使用しない (平文ベース) ように設定する》

(1) /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no 
: 認証時のパスフレーズ送信において平文の使用を抑制するかどうかを指定。デフォルトは yes。今回は初めに平文で動作確認をするために、一時的に no に変更。
auth_mechanisms = plain login : 認証時のパスフレーズの送信方法を指定。デフォルトは plain。今回は初めに平文で動作確認をするので 一時的に plain login に変更。ここに設定する認証メカニズムとしては、上記のほかに、digest-md5cram-md5ntlmrpaapopanonymousgssapiotpskeygss-spnego の設定が可能。
!include auth-sql.conf.ext : 今回は SQL 認証を使用するため、文頭の '#' を削除。

(2) /etc/dovecot/conf.d/auth-sql.conf.ext
認証において、SQL 認証の場合に設定する構成定義です。ここでは、パスワードDB と ユーザDB に対するドライバや、引き渡す情報などを指定します。記述内容については、デフォルトの内容でそのまま動作しますので、変更する必要はありませんが、参考までに必要とされる情報を記述しておきます。
passdb {
     driver = sql
     args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
     driver = sql
     args = /etc/dovecot/dovecot-sql.conf.ext
}
このファイルは、(1) でコメントアウトから外した include 文によって取り込まれます。ここの記述に基づいて、次に (3) で説明する MySQL 設定と関連付けられることになります。

(3) /etc/dovecot/dovecot-mysql.conf.ext
default_pass_scheme = PLAIN : デフォルトのパスワードスキーム (パスワードDB保護に使われる符号化手法) を設定する。デフォルトの設定は MD5 となっている。この指定で利用可能なパスワードスキームは、PLAIN (平文) を除くと、いろいろなシステムで用いられている一般的なスキームとしては、暗号強度が強い順に、BLF-CRYPT (Blowfish)、SHA512-CRYPTSHA256-CRYPTMD5-CRYPT を薦めている。
上記以外には、DES ベースの暗号を用いたスキームとしては CRYPTPLAIN-MD5LDAP-MD5SMD5 が、SHA ベースのものとしては、SHASSHASHA256SSHA256SHA512SSHA512 などがある。
後からのパスワードスキームの変更は、極めて大掛かりな作業を伴うため、最初にきちんと検討しておくことが望ましいとのこと。
上記以外にも、LANMANNTLMRPACRAM-MD5DIGEST-MD5SCRAM-SHA-1 などの認証スキームがある。これらは使えることは使えるが、運用面においていろいろと課題が残っているということ?
今回の作業は、まずパスワードは平文ベースで検証するので、default_pass_scheme = PLAIN に設定。

(4) /etc/dovecot/dovecot-mysql.conf.ext
上記 (3) と同じ設定ファイルですが、作業が異なるので、あえて項番を分けて記述します。ここでは、実際に MySQL のデータベース接続に絡む情報を記述します。中でも一番重要な部分は、接続パラメータを列挙した connect 文と、実際の情報のクエリに使用される user_query 文と password_query 文です。特に、データベースのスキーマに依存する user_query password_query は上手くいかないと嵌る可能性が大の部分なので注意が必要です。筆者の実際の記述は:
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mailadmin password=xxxxxxxxxxxxx
password_query = SELECT clear AS password FROM mailbox WHERE username='%u' AND domain='%d'
user_query = SELECT username, homedir AS home, uid, gid, maildir AS mail FROM mailbox WHERE username='%u'
SQL のスキーマが荒れているので参考にならないかも知れませんが、利用者のユーザ id やパスワードその他は、mail というデータベースの mailbox というテーブル上で管理されています。homedir にはメールディレクトリのルートが、maildir には、その当該ユーザの個人のメールディレクトリがホームからの相対ディレクトリで与えられています。uid・gid は共にデフォルトで 5000 が与えられています。ユーザ名 username は、ドメイン名を伴うメアド形式で、パスワードは暗号用に password というレコードを用意してありますが、clear という平文格納用のレコードも別途用意してあります(前回の Cyrus IMAP との格闘の名残です苦笑)。
usernamepassworduserdomainhomeuidgidmail などは、DB アクセス時に共通変数的な利用をされているようなので、自分の DB のスキーマと仕様や名称が一致しない場合には、AS 句で変数をバインドしてあげる必要があるみたいです(本当は、事前にエイリアスなどの登録が出来ると、レコード間のマッピングが事前に取れるので便利だとは思うのですが…涙)。
ちなみに、利用可能な代表的な変数は、%u (user)、%n (username)、%d (domain) などですが、まだまだこれ以外にも沢山ありますので、必要なときは、「Dovecot マニュアルの変数」 を参照してください。
このため、上記例の clear、homedir、maildir は一応全て AS で対応付けを取っているつもりです。
ちなみに、極めて当たり前の話ではありますが、ここのセレクションが失敗すると、認証は失敗します(苦笑)
「DB に対するアクセス権限がない」 みたいな場合もあるかも知れませんが、認証が失敗するようなときは、大半がここのクエリ文に問題があります。このため、認証で失敗した場合は、再度、ターミナルから、SQL文を投入し、入力したクエリ文で対象となるレコードなり、フィールドが見つかるかどうかを確認することをお勧めします。

(5) /etc/dovecot/conf.d/10-master.conf
Postfix と Dovecot の SASL 認証連携に関連し、Postfix から(Dovecot に対する)認証要求を受け付ける記述を、認証サービスのサービス文に追加します。追加した部分は赤くハイライト表示されている部分。アクセスモードは、テンプレートの方では、0666 に設定されていますが、グループに属しない他のプログラムに対して読み取り権限と書き込み権限を与える理由が良く解かりません。とりあえず 0660 でも問題なく正常に動作していますが、不安な場合は、0666 に設定してみて下さい。あと一応、指定された Postfix の作業環境に、指定された名前付きパイプ?が存在するかどうかは、事前にきちんと確認しておいて下さい。
service auth {
     unix_listener auth-userdb {
          #mode = 0600
          #user =
          #group =
     }
     # Postfix smtp-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}
ちなみに、ユーザDB認証の記述は、初期の時点から、その内容はコメントアウトしてありましたが、MySQL で SQL 認証する予定であり、ユーザDB は使用する予定がないのでそのままにしてあります。

3.2 メールディレクトリ設定 《Maildir形式(mboxではない)で、バーチャルメールボックスドメインを作成する

(1) /etc/dovecot/conf.d/10-mail.conf
mail_location : maildir の設置位置を指定。位置は、相対・絶対のいずれでも指定できる。ホームディレクトリからの相対で指定する場合は、先頭にマイナス '-' を置く(例: "maildir:-/subdir …")。またディレクトリ指定記述内では以下の変数が利用できる: %u (ユーザ名)、%n (ユーザ名が user@domain 形式のときの user 部分)、%d (ユーザ名が user@domain 形式のときの domain 部分)、%h (ホームディレクトリ)
著者の実際の記述は、mail_location = maildir:/home/vmail/%d/%n/Maildir 。この指定による実際のディレクトリ展開は、/home/vmail/domainname.com/james/Maildir のようになる (前回良く使用した james@domainname.com の場合)。
mail_uid, mail_gid : システムがメールをアクセスする際のユーザ id ・グループ id を指定する。実際に設定した記述はそれぞれ mail_uid = 5000mail_gid = 5000 。 

3.3 IMAP・POP3 通信関連の設定

(1) /etc/dovecot/10-master.conf
プロトコル毎のサービスポートを含むサービス関連設定は、このファイル中で構成設定を定義します。今回は、POP3 を対象としていないので、IMAP のサービスポート設定部分のコメントアウトを外しただけに留まっています。lmtp の記述については、設定によって、どのような挙動をするのかが今一理解出来ないため、今回は設定していません。
service imap-login {
     inet_listener imap {
          port = 143
     }
     inet_listener imaps {
          #port = 993
          #ssl = yes
     }
}
service imap {
     #vsz_limit = 256M
     #process_limit = 1024
}
mmap() 処理に使用するメモリの最大容量。dovecot.index.cache のファイルサイズを見て、vsz_limit には、このサイズのおおよそ3倍以上を設定するのが望ましいとのことですが、これは、システム運用上のノウハウなので、今回は見送ることに。ちなみに単位はバイト。
システムのチューニングや運転段階に入ったら、大きな要素になってくる可能性はあるものの、それは多分、大規模ユーザに限定されます(苦笑)

***

Dovcot 側の構成設定は、ざっとこんなところです(見落とし等があったら、随時、本投稿を修正していく予定です)。

3. Postfix 側の構成定義変更

Postfix と Dovecot の認証連携と関連して、Postfix 側の構成定義で必要となった修正ポイントをおさらいして、ここに記しておきます(smtp関連に限定)。

(1) /etc/postfix/main.cf
不足している場合は、以下の smtpd 関連の定義を記述。設定が異なっている場合は以下の値に変更。
設定は、Postfix が SASL 認証として Dovecot がサポートするSASL 認証機能(Dovecot SASL)を使用するための宣言が主。
smtpd_sasl_type = dovecot Dovecot SASL の利用宣言
smtpd_sasl_path = private/auth : Dovecot と Postfix がハンドシェイクする際の名前付きパイプ?の指定
smtpd_sasl_auth_enable = yes : SASL認証の利用宣言
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
これ以外に以下の項目については必須ではないものの、SSL の使用あるいは実運用段階に入った時点では再検討の要有かも(著者の現況では、これらは一応コメントアウトしている)。
smtpd_sasl_security_options = noannonymous
smtpd_tls_auth_only = no
smtpd_sasl_local_domain = $mydomain
broken_sasl_auth_clients = yes
ちなみに、ここでは、Postfix の main.cf で定義される smtpd 設定以外については一切言及していないため、Postfix を一からインストールするような場合は、他の記事を参照のこと。ちなみに参考までに、著者の Postfix の現状設定を書こうとしたが、一般的な設定記述だけでなく、バーチャルメールボックス設定に関連する記述などもあり、そこから、MySQL ベースでのマッピング設定ファイルなどに構成定義は派生してしまうため断念。

(2) /etc/postfix/master.cf
これは、あくまでも参考情報。main.cf に記述する方法以外に、master.cf に定義情報を追加することで、Dovecot を Postfix の SASL認証のバックエンドとした専用 (dedicated) サービスを提供することも可能らしい。著者の環境では、この機能は利用していないのでコメントアウトしているが参考までに記述しておく。ちなみに、この記述例は 「Dovecot マニュアルの Postfix と Dovecot SASL連携の章」 に記述されているもの。内容的には、TLS がオンになっているほか、認証はハッシュを用いたローカルな認証が用いられている点が異なる(上記内容と同等の意味がある記述として引用しているわけではないことに注意)。
submission inet n - n - - smtpd
     -o smtpd_tls_security_level=encrypt
     -o smtpd_sasl_auth_enable=yes
     -o smtpd_sasl_type=dovecot
     -o smtpd_sasl_path=private/auth
     -o smtpd_sasl_security_options=noanonymous
     -o smtpd_sasl_local_domain=$myhostname
     -o smtpd_client_restrictions=permit_sasl_authenticated,reject
     -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
     -o smtpd_sender_restrictions=reject_sender_login_mismatch
     -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

4. Cyrus SASL Library の設定

一応、漏れを確認する意味で章段を作成したが、この作業はない…との現状認識。Dovecot は、その SASL 認証(Dovecot SASL)内で、Cyrus SASL Library を使用しているが、認証に際しては、Cyrus SASL の認証デーモン(saslauthd)を起動しているわけではなく、内部で使用しているのみである。
一方、Postfix 側の smtp での認証は、Postfix 側から Dovecot に対して認証要求を出しているが、これは、Postfix と Dovecot 間に確立された通信路で直接的に行われているためである。
以上より、Cyrus SASL Library の在り処である /usr/lib64/sasl2 (32ビット版の場合は /usr/lib/sasl2) 下にある smtpd.conf は消してしまっても問題ない筈であるが?本当に大丈夫か?苦笑 wwww ;;

5. Dovecot2 について書いている、その他の参考記事

「IMAP4サーバの構築」
「Postfix を使ったメールサーバ構築 .5/Dovecot2 の設定、システムの起動」