個人で運用しているサーバに IMAP4 サーバとして dovecot を動かすために,現時点での最新版の 2.0.12 ってのをインストールして設定してみました.そこでハマった話.だらだら読んでも役に立ちませんので,設定方法がしりたい場合はまとめの部分だけ見れば良いです.:-p
個人でしか使いませんので,
2 と 3 は特に難しい所はなく,設定も簡単なんですが,1 がなかなかハードルが高い(こともないんですが,ドキュメントも見つけられなかったので...) 2 と 3 はドキュメントや付属のサンプル見ればすぐにわかるのでここでは書いてません.
imaps(993) のみ Listen したい
dovecot 1.x の時は
protocols = imap imaps pop3 pop3s
とか書けたので,imaps だけサポートしたい場合は
protocols = imaps
これだけでハイ簡単.
ところが 2.x になると protocols に書けるのは "imap pop3 lmtp" 等の純粋にプロトコルのみ.ポートとか暗号化の有無に関しては
service imap-login { inet_listener imap { port = 143 ssl = no } inet_listener imaps { port = 993 ssl = yes } }
のような service という定義で行います.さて,じゃあここで 143 は Listen したくないから〜...
service imap-login { inet_listener imaps { port = 993 ssl = yes } }
という記述にすると... imap の記述がないからデフォルトの設定で起動します.ハイ,ちゃんと 143 番ポートで Listen してくれます.SSL なしで.(SSL 前提で "disable_plaintext_auth = no" としているので,そういう意味でもマズい.)
ドキュメントを見ても解説が見つけられない...
ここで試しに
listen = *:993
とか指定すると,"service imap-login" 内でも記述があるという二重定義のエラーが出ます.
以下のように設定すると,少なくともリモートからはアクセス出来なくなるので,まあ目的は大体達成出来るけど,使いもしないポートが Listen されているのはエコじゃない (違 ^^;).
service imap-login { inet_listener imap { address = 127.0.0.1 port = 143 } inet_listener imaps { port = 993 ssl = yes } }
ヤケクソで :-p
protocols = imaps
という 1.x 時代の記述を書いてみると
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: protocols=imaps is no longer supported. to disable non-ssl imap, use service imap-login { inet_listener imap { port=0 } }
などというエラーメッセージが ><
いや,実際はその前にダメモトで port=0 って書いたらうまく動いてたんだけど,なんか気色悪いよねーって言ってたんですよね.で,「正しい」「美しい」設定を探すため,色々試してたら,上記のメッセージでこの「気色悪い設定」が正しい事が判明したという...
SSL/TLS 証明書の秘密鍵のパスフレーズ
imaps や pop3s で起動したりする場合に証明書関係の設定が必要です.秘密鍵にパスフレーズが設定してある場合,
openssl rsa -in secret.key -out secret_nopass.key
などとしてパスフレーズ不要にしたりしますが,個人的にはちょっと気色悪い.
dovecot では
ssl_key_password = secret
みたいにパスフレーズの設定が出来ます.が,dovecot.conf なり,そこから読み出されるファイルはユーザから読めてしまう事も多いです.そこで付属の設定ファイルサンプルには
# If key file is password protected, give the password here. Alternatively # give it when starting dovecot with -p parameter. Since this file is often # world-readable, you may want to place this setting instead to a different # root owned 0600 file by using ssl_key_password = <path. #ssl_key_password =
なんて書いてあります.おお! 早速別途パスフレーズが書かれただけのファイルを用意して,
ssl_key_password = </path/to/password_file
なんて書いても... 読んでくれません.:-(
'ssl_key_password' setting. Note that 'dovecot.conf' is by default
world-readable, so you probably shouldn't place it there directly. Instead
you could store it in a different file, such as '/etc/dovecot-private.conf'
containing:ssl_key_password = secretand then use '!include_try /etc/dovecot-private.conf' in the main
'dovecot.conf'.
のように書かれています.この通りやると確かに出来ますので,これで OK なんですが,じゃあなんでサンプルのコメントはわざわざ別の方法に書き直されているのか不明です.X-( (元々は Wiki と同じ記述が書かれていたようですが,ChangeLog 見ると
* doc/example-config/conf.d/ssl.conf: example-config: Updated ssl_key_password comments. [3badaa16d524] <HEAD>
わざわざ書き直されています,なんでやねん!! X-( 正しい書き方で動くんだったら教えてください > 偉い人