TenForward

技術ブログ。はてなダイアリーから移転しました

dovecot-2.0.x ハマリ道

個人で運用しているサーバに IMAP4 サーバとして dovecot を動かすために,現時点での最新版の 2.0.12 ってのをインストールして設定してみました.そこでハマった話.だらだら読んでも役に立ちませんので,設定方法がしりたい場合はまとめの部分だけ見れば良いです.:-p

個人でしか使いませんので,

  1. imaps (Port:993) のみサポート.それ以外は Listen しない.
  2. postfix から dovecot SASL を使う.
  3. 認証はシステムユーザで PAM.

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 って書いたらうまく動いてたんだけど,なんか気色悪いよねーって言ってたんですよね.で,「正しい」「美しい」設定を探すため,色々試してたら,上記のメッセージでこの「気色悪い設定」が正しい事が判明したという...

まとめると

ここだけ読めば良いんですが :-p

こんな設定で 993 番ポートだけ Listen して,暗号化されます.

protocols = imap
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

pop3 に関してはそもそも起動したくない場合は

service pop3-login {}

という設定がなければpop3 のサービスは起動しないようです.

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

なんて書いても... 読んでくれません.:-(

公式WikiのSSLの項には

'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 = secret
and 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-( 正しい書き方で動くんだったら教えてください > 偉い人

その他

ドキュメント見てると,dovecotTLS は SNI の設定が出来るみたいですね.クライアント側で対応しているのってどれくらいあるんだろう?