Dovecot を 2.2 系から 2.3 系にアップグレードしてみる

スポンサーリンク

はじめに

 MDA 及び Postfix の SASL として使用している dovecot。CentOS では Base リポジトリより提供されているパッケージで今現在の最新となると dovecot-2.2.10-8.el7.i686 になる。
 これは最終更新が 2017-03-21 と書かれているのでもう長いことそのままと言う事に。それだけ安定性が確保されているからだと思うんだけどスマホから IMAPS で接続したあとの切断時にファシリティーこそ Info だけどエラーが出ているのが気になった。

 以下 2 パターンを抜粋。192.168.1.10 がアクセス元のスマホ。

Oct 24 20:02:51 imap-login: Info: Disconnected (no auth attempts in 0 secs): user=<>, rip=192.168.1.10, lip=192.168.1.8, TLS: SSL_read() syscall failed: Connection reset by peer, session=<cjJqbfd4AADAqAEK>
Oct 26 04:49:33 imap-login: Info: Disconnected (no auth attempts in 0 secs): user=<>, rip=192.168.1.10, lip=192.168.1.8, TLS handshaking: SSL_accept() syscall failed: Connection reset by peer, session=<u6jd5hJ5fQDAqAEK>

 外見上は問題なく動作しておりメールの受信も可能だけど、裏でこうしてエラーを吐いているのは気持ち悪い。
 dovecot 2.3 では SSL/TLS 周りの設定が変更されており SSLv3 などは廃止されているとかなんとか。それならいっちょ試してみるかなと言う事で 2.3 へアップデートする事に。

事前の情報収集

 dovecot 2.2 から 2.3 へアップデートを行うことで変更される設定などは無いか確認しておく。
 これは親切にオフィシャルな Wiki があるので参照する。

Upgrading/2.3 - Dovecot Wiki

 この Wiki から筆者にとって重要になる変更箇所を抜粋すると次の通りになった。

  • ssl_protocols setting was replaced by ssl_min_protocol. Now you only specify the minimum ssl protocol version Dovecot accepts, defaulting to TLSv1.
  • ssl_parameters was replaced with ssl_dh.
  • SSLv2 is no longer supported in ssl_protocols.

 今まで使用していた ssl_protocols の設定は ssl_min_protocol に置き換えられてデフォルトでは TLSv1 がプロトコルの最小バージョンに指定。ssl_parameters も新たに置き換えられ ssl_dh となる。SSLv2 はサポートしませんよと言う事に。

 あと少し気になるところはログフォーマットの変更。
 "%s(%u): " だったものが "%s(%u)<%{pid}><%{session}>: " となり、今までのログの後に PID とセッション ID が連なるという感じに。この辺はログ監視している場合には注意が要るかも知れない。

 Postfix Admin を用いた Virtual Mail Box を運用している場合、DB 構造はそのままに問題なく使えるとのこと。

下準備

 dovecot 2.3 のリポジトリを追加。その後は念のため /etc/yum.repos.d/CentOS-Base.repo から dovecot が入らない様に exclude もしておくと良い。

cat << EOF > /etc/yum.repos.d/dovecot.repo
[dovecot]
name=Dovecot 2.3 CentOS \$releasever - \$basearch
baseurl=http://repo.dovecot.org/ce-2.3-latest/centos/\$releasever/RPMS/\$basearch
gpgkey=https://repo.dovecot.org/DOVECOT-REPO-GPG
gpgcheck=1
enabled=1
EOF

 DH パラメータファイルも作成しておく。これは Wiki に書いてある手法をそのまま利用した。

dd if=/var/lib/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /etc/dovecot/dh.pem

 下準備の最後に念のため適当に設定ファイルをバックアップでもしておく。

cp -rp /etc/dovecot /var/tmp

アップデート実行

 変にトラブルのもイヤなので dovecot と SASL を使用しているのであれば Postfix も止めておく。

systemctl stop postfix.service dovecot.service

 リポジトリを追加済みで enabled=1 としてあればそのまま yum update を実行すれば OK。

インストール中:
 dovecot-mysql                x86_64                2:2.3.3-2                   dovecot-2.3-latest                 91 k
     dovecot-mysql.x86_64 1:2.2.10-8.el7 を入れ替えます
更新します:
 dovecot                      x86_64                2:2.3.3-2                   dovecot-2.3-latest                4.3 M

 といった感じにアップデート。dovecot-mysql も入れ替えられる。

dovecot の設定変更

 筆者の場合 yum によるアップデート時に 1 つの設定ファイルだけ別で新しい物が作成された。

warning: /etc/dovecot/conf.d/10-ssl.conf created as /etc/dovecot/conf.d/10-ssl.conf.rpmnew

 この設定ファイルの diff を取ってそれを元に設定を書き換えていった。
 今回重要となったのは次のあたり。
 diff は dovecot 2.2 の時の物と 2.3 の筆者設定完了時のもの。つまり diff -u /var/tmp/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf の結果を抜粋。赤文字の箇所が緑文字になったと見て頂ければと。

-ssl = required
+#ssl = yes

-# DH parameters length to use.
-#ssl_dh_parameters_length = 1024
+# SSL DH parameters
+# Generate new params with `openssl dhparam -out /etc/dovecot/dh.pem 4096`
+# Or migrate from old ssl-parameters.dat file with the command dovecot
+# gives on startup when ssl_dh is unset.
+ssl_dh = </etc/dovecot/dh.pem
 
-# SSL protocols to use
-#ssl_protocols = !SSLv2
-ssl_min_protocols = TLSv1.2
-
-# SSL ciphers to use
-#ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
+# Minimum SSL protocol version to use. Potentially recognized values are SSLv3,
+# TLSv1, TLSv1.1, and TLSv1.2, depending on the OpenSSL version used.
+ssl_min_protocol = TLSv1.1
+
+# SSL ciphers to use, the default is:
+#ssl_cipher_list = ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
+# To disable non-EC DH, use:
+#ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
+
+# Colon separated list of elliptic curves to use. Empty value (the default)
+# means use the defaults from the SSL library. P-521:P-384:P-256 would be an
+# example of a valid value.
+#ssl_curve_list =

 要は ssl_dh = </etc/dovecot/dh.pem が必須となり ssl_protocols が廃止されて ssl_min_protocol の指定となったと言う事。

dovecot の起動

 systemctl で Unit 指定して起動するだけ。

systemctl start dovecot.service postfix.service

 エラーが出るようなら各種ログ内容を確認して対応すれば良い。

アップデートの結果

 事前に情報を集めつつ検証環境で予行練習しておいたのでさっくり動作。
 Postfix から dovecot の SASL を利用するにも問題はないし MDA としても IMAPS/POP3S 等も今まで通り動作した。
 そして冒頭に記載したスマホからのアクセスで切断時に出ていたエラーログもアップデートから 12 時間ほど経過したが全く出ていないので一安心。

おわりに

 MTA や MDA 周りはなんかしくじってやらかすと復旧作業が面倒なもんで慎重に作業してみた物のノントラブルで終わってホッと一息。
 dovecot 2.2 系って最初のリリースは 2013/04/29 なんでだいぶ長いことメンテされてはいるけど流石にそろそろ 2.3 系にはしておきたいなと思った。SSL/TLS 周りの実装というか機能というか SSLv2~3 とか既にレガシーな物を使えてしまう (当然無効にすべきだが) とかで古さを感じてしまったもので。

スポンサーリンク