Compnet

仕事とか遊びとか、日々折々

2019-01-05(土)

ConoHa のメールサーバーを使おうとしたら SSL 証明書で難儀した話 (実装編)

Posted by Nakane, R. in technical   

前の記事で書いたように、この年末年始に某社のメールサーバーを ConoHa のメールサーバーに移行しました。 しかしながら通信路を暗号化するための証明書の問題で、メーラーに Outlook を使うと毎起動の度に 証明書の警告が出ることが分かりました。 これをなんとかしようとメーラーと ConoHa のメールサーバーの間にプロキシ サーバーを置いて、メーラーからの送受信はプロキシ サーバーに対して行い、プロキシ サーバーはそれを ConoHa のメールサーバーに転送し、ConoHa のメールサーバーからプロキシ サーバーへの返答をプロキシ サーバーがメーラーに転送する形にします。 この形態であればメーラーが通信するのはプロキシ サーバーになるので、プロキシ サーバーに正しい証明書が設定してあれば、メーラーで警告が表示されることは起こりません。 ConoHa のメールサーバーから送られてくるワイルド カードを含む証明書については、プロキシ サーバーで無視するように設定できればここでも警告が出るようなことになりません。

この記事では、このプロキシ サーバーを実現するために使った Dovecot の設定を紹介します。

最初にプロキシ サーバーにした Dovecot の設定を以下に紹介します。 OS が Ubuntu 18.04LTS なので、実際にはいくつかのファイルに分けて設定しています。

auth_mechanisms = plain login cram-md5 apop
passdb {
  args = proxy=y nopassword=y
  default_fields = destuser=%u nologin=y starttls=any-cert
  driver = static
}
userdb {
  args = uid=mail gid=mail /home=/dev/null
  driver = static
}
ssl_cert = </etc/letsencrypt/live/<FQDN>/fullchain.pem
ssl_key = </etc/letsencrypt/live/<FQDN>/privkey.pem
protocol imap {
  login_greeting = IMAP ready.
  passdb {
    args = proxy=y host=<IMAP Server's FQDN> nopassword=y
    driver = static
  }
}
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
protocol pop3 {
  login_greeting = POP ready.
  passdb {
    args = proxy=y host=<POP Server's FQDN> nopassword=y
    driver = static
  }
}
submission_client_workarounds = whitespace-before-path mailbox-for-path
protocol submission {
  passdb {
    args = proxy=y host=<SMTP Server's FQDN> nopassword=y
    driver = static
  }
}

今回の Dovecot によるプロキシ サーバーでは subumission ポートによる SMTP サーバーもプロキシの対象にしています。 Submission ポートによる SMTP サーバーのプロキシは Dovecot 2.3 からのサポートです。 Ubuntu 18.04 LTS の標準のリポジトリに入っているのは Dovecot 2.2 なので、このままではSubmission ポートによる SMTP サーバーのプロキシが実現できません。 そこで Dovecot のコミュニティ リポジトリを追加して、そこから Dovocet 2.3 をインストールします。

Dovecot のコミュニティ リポジトリの Web ページに書いてあるとおり、GPG の公開鍵を APT パッケージ管理システムに登録した上で、Dovecot の apt-line を追加します。 apt-line を追加したらパッケージ情報を更新するため apt update を行ってから、dovecot の imapd、pop3d、submission の各モジュールをインストールします。

curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import
gpg --export ED409DA1 | sudo tee /etc/apt/trusted.gpg.d/dovecot.gpg >/dev/null
cat <<__EOT__ | sudo tee /etc/apt/sources.list.d/dovecot.list >/dev/null
deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/bionic bionic main
__EOT__

sudo apt update
sudo apt -y install dovecot-imapd dovecot-pop3d dovecot-submissiond

dovecot の各モジュールをインストールしたら、上で紹介した設定になるようにそれぞれの設定ファイルを修正します。 具体的には、auth_mechanisms の設定を /etc/dovecot/conf.d/10-auth.conf に記述します。 さらに /etc/dovecot/conf.d/10-auth.conf では /etc/dovecot/conf.d/auth-static.conf.ext をインクルードするようにして、passdbuserdb の基本になる設定を /etc/dovecot/conf.d/auth-static.conf.ext に記述します。 なお、passdbargs = proxy=y nopassword=yproxy=y nopassword=ydefault_fields で指定すると、プロキシ動作をしなくなったので注意してください。

--- /etc/dovecot/conf.d/10-auth.conf    2018-11-23 11:49:46.000000000 +0000
+++ /etc/dovecot/conf.d/10-auth.conf    2018-12-31 00:30:52.776602799 +0000
@@ -97,7 +97,7 @@
 #   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
 #   gss-spnego
 # NOTE: See also disable_plaintext_auth setting.
-auth_mechanisms = plain
+auth_mechanisms = plain login cram-md5 apop

 ##
 ## Password and user databases
@@ -119,10 +119,10 @@
 #!include auth-deny.conf.ext
 #!include auth-master.conf.ext

-!include auth-system.conf.ext
+#!include auth-system.conf.ext
 #!include auth-sql.conf.ext
 #!include auth-ldap.conf.ext
 #!include auth-passwdfile.conf.ext
 #!include auth-checkpassword.conf.ext
 #!include auth-vpopmail.conf.ext
-#!include auth-static.conf.ext
+!include auth-static.conf.ext
======   ======   ======
--- /etc/dovecot/conf.d/auth-static.conf.ext    2018-11-23 11:49:46.000000000 +0000
+++ /etc/dovecot/conf.d/auth-static.conf.ext    2019-01-02 00:02:44.321311607 +0000
@@ -22,3 +22,14 @@
 #  driver = static
 #  args = uid=vmail gid=vmail home=/home/%u
 #}
+
+passdb {
+  driver = static
+  args = proxy=y nopassword=y
+  default_fields = destuser=%u nologin=y starttls=any-cert
+}
+
+userdb {
+  driver = static
+  args = uid=mail gid=mail /home=/dev/null
+}

POP3s、IMAPs や submission による SMTP などの STATTLS による SSL/TLS 暗号化で使う証明書は Let's Encript で取得して、/etc/dovecot/conf.d/10-ssl.conf にこれを記述します。

--- /etc/dovecot/conf.d/10-ssl.conf     2018-12-30 08:36:34.924479525 +0000
+++ /etc/dovecot/conf.d/10-ssl.conf     2019-01-01 08:29:55.939259355 +0000
@@ -3,14 +3,14 @@
 ##

 # SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
-ssl = no
+ssl = yes

 # PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
 # dropping root privileges, so keep the key file unreadable by anyone but
 # root. Included doc/mkcert.sh can be used to easily generate self-signed
 # certificate, just make sure to update the domains in dovecot-openssl.cnf
-#ssl_cert = </etc/dovecot/dovecot.pem
-#ssl_key = </etc/dovecot/private/dovecot.pem
+ssl_cert = </etc/letsencrypt/live/tss-mail.sv24x7.net/fullchain.pem
+ssl_key = </etc/letsencrypt/live/tss-mail.sv24x7.net/privkey.pem

 # If key file is password protected, give the password here. Alternatively
 # give it when starting dovecot with -p parameter. Since this file is often

IMAP、POP3、Submission の各サービスに関連する設定はそれぞれ /etc/dovecot/conf.d/20-imap.conf、/etc/dovecot/conf.d/20-pop3.conf、/etc/dovecot/conf.d/20-submission.conf に記述します。 それぞれの設定ファイルに passdb セクションを追加して、プロキシ先のホスト名をそこで指定します。 このときホスト名と一緒に proxy=y nopassword=yargs で指定しておかないと、プロキシ動作になりませんでした。

--- /etc/dovecot/conf.d/20-imap.conf    2018-11-23 11:49:46.000000000 +0000
+++ /etc/dovecot/conf.d/20-imap.conf    2019-01-02 00:00:45.998956261 +0000
@@ -89,10 +89,17 @@
 #imap_fetch_failure = disconnect-immediately

 protocol imap {
+  login_greeting = IMAP ready.
+
   # Space separated list of plugins to load (default is global mail_plugins).
   #mail_plugins = $mail_plugins

   # Maximum number of IMAP connections allowed for a user from each IP address.
   # NOTE: The username is compared case-sensitively.
   #mail_max_userip_connections = 10
+
+  passdb {
+    driver = static
+    args = proxy=y host=imap.tss-mail.conoha.io nopassword=y
+  }
 }
======   ======   ======
--- /etc/dovecot/conf.d/20-pop3.conf    2018-11-23 11:49:46.000000000 +0000
+++ /etc/dovecot/conf.d/20-pop3.conf    2019-01-02 00:03:26.232710363 +0000
@@ -87,13 +87,20 @@
 #     Outlook Express and Netscape Mail breaks if end of headers-line is
 #     missing. This option simply sends it if it's missing.
 # The list is space-separated.
-#pop3_client_workarounds =
+pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

 protocol pop3 {
+  login_greeting = POP ready.
+
   # Space separated list of plugins to load (default is global mail_plugins).
   #mail_plugins = $mail_plugins

   # Maximum number of POP3 connections allowed for a user from each IP address.
   # NOTE: The username is compared case-sensitively.
   #mail_max_userip_connections = 10
+
+  passdb {
+    driver = static
+    args = proxy=y host=pop.tss-mail.conoha.io nopassword=y
+  }
 }
======   ======   ======
--- /etc/dovecot/conf.d/20-submission.conf      2018-11-23 11:49:46.000000000 +0000
+++ /etc/dovecot/conf.d/20-submission.conf      2019-01-02 00:03:48.296390368 +0000
@@ -34,7 +34,7 @@
 #     syntax.
 #
 # The list is space-separated.
-#submission_client_workarounds =
+submission_client_workarounds = whitespace-before-path mailbox-for-path

 # Relay server configuration:
 #
@@ -85,5 +85,10 @@
   # each IP address.
   # NOTE: The username is compared case-sensitively.
   #mail_max_userip_connections = 10
+
+  passdb {
+    driver = static
+    args = proxy=y host=smtp.tss-mail.conoha.io nopassword=y
+  }
 }

以上の設定をしたら Dovecot を起動するように設定します。 systemctl は起動してないサービスの restart はエラーになるので、以下のコマンドでは起動状態を確認して start と restart を使い分けています。

sudo systemctl is-active dovecot >/dev/null && sudo systemctl restart dovecot || sudo systemctl start dovecot

最後に Dovecot を自動起動するように設定します。 Dovecot の設定は環境によって微調整が要るためだと思いますが、初期インストールの状態では Dovecot は自動起動になっていません。 このままにしておくと、OS の再起動で Dovecot が立ち上がっていないと慌てることになります。 自動起動にするのは systemctl を使います。

sudo systemctl enable dovecot

Comments