Postfix + Dovecot をマルチドメイン化させて、証明書もそれぞれのものを利用し、SNIで運用させる

Postfixも3.4以降がSNIに対応しているみたい。

DovecotもSNI運用ができるので、晴れてLet’s encryptでのメールサーバのバーチャルドメイン運用を実装です。

基本的な設定についてはこちらを参考に。

追加設定をまとめておきます。

配送ユーザーの設定

sudo groupadd -g 10000 vmail
sudo useradd -u 10000 -g vmail -s /sbin/nologin vmail

vmailグループとユーザーをそれぞれID、10000番で作成します。

メール格納用ディレクトリの作成

sudo mkdir /var/spool/virtual
sudo chown -R vmail:vmail /var/spool/virtual

Postfixの設定

main.cf

sudo vi /etc/postfix/main.cf

mydestination内に自身のドメインがあるのを削除。ここにドメインの記載があると、バーチャル配送されない。

例) mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

以下をまるっと追加。

tls_server_sni_maps=hash:/etc/postfix/tls_server_sni_maps
virtual_transport = virtual
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailboxes
virtual_mailbox_base = /var/spool/virtual
virtual_alias_maps = hash:/etc/postfix/virtual_aliases
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000

必要な外部ファイルを作成します。uidとgidは先程作ったユーザーやグループのIDになります。

tls_server_sni_maps

sudo vi /etc/postfix/tls_server_sni_maps
monmon.jp /etc/letsencrypt/live/monmon.jp/privkey.pem /etc/letsencrypt/live/monmon.jp/fullchain.pem
hogehoge.jp /etc/letsencrypt/live/hogehoge.jp /privkey.pem /etc/letsencrypt/live/hogehoge.jp/fullchain.pem

こんな感じで証明書ファイルの場所とドメインをマッピングし、

sudo postmap -F /etc/postfix/tls_server_sni_maps

db化する際に-FでBase64にする必要があるみたい。このあたりのオプション情報があまり見当たらず。

virtual_mailbox_domains

sudo vi /etc/postfix/virtual_mailbox_domains
monmon.jp
hogehoge.jp

バーチャルドメインで運用するドメインを記載。これはDB化不要。このファイルを使わない場合は、virtual_mailbox_domainsに直接以下のようにドメインを記載する。

virtual_mailbox_domains = monmon.jp, hogehoge.jp

virtual_mailbox_maps

sudo vi /etc/postfix/virtual_mailbox_maps
monmon@monmon.jp	monmon.jp/monmon/Maildir/
fugafuga@hogehoge.jp   hogehoge.jp/fugafuga/Maildir/
hagehage@hogehoge.jp   hogehoge.jp/hagehage/Maildir/

こんな感じで必要なメールアカウントと、それに対応するメールボックスのマッピングを記載。

sudo postmap /etc/postfix/virtual_mailbox_maps

最後にdb化。

virtual_aliases

sudo vi /etc/postfix/virtual_aliases
sample@monmon.jp	monmon@monmon.jp
info@hogehoge.jp		info@hogehoge.jp

エイリアスのマッピングを記載。外部のメールアドレスへの転送も可能。

sudo postmap /etc/postfix/virtual_aliases

これも最後にdb化を忘れないように。

再起動

sudo systemctl restart postfix

Postfixを再起動させます。

Dovecotの設定

10-auth.conf

sudo vi /etc/dovecot/conf.d/10-auth.conf
!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-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

こんな感じに変更。

auth-passwdfile.conf.ext

sudo vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}

CRYPTから

passdb {
  driver = passwd-file
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}

CRAM-MD5にパスワードの暗号化形式を変更。

各ユーザーのパスワードは

$doveadm pw
Enter new password: 
Retype new password: 
{CRYPT}$2y$05$1vArYJRsNdoqe7hYDS0UouFhLpFy2yafbTLn8jvMR.j67QJO4rSom

doveadm コマンドで希望するパスワードを暗号化し、

sudo vi /etc/dovecot/users

ファイルの中に

test@monmon.jp:{CRYPT}$2y$05$1vArYJRsNdoqe7hYDS0UouFhLpFy2yafbTLn8jvMR.j67QJO4rSom
hogehoge@monmon.jp:{CRYPT}$2y$05$zmQcCrvA6ZM/MZexyxXBzeTrkJFZnmuYgzUWtwTdy2KKRTqbTSuji

こんな感じでメールアドレスとパスワードを対応させて追記していく感じです。

auth-static.conf.ext

sudo vi /etc/dovecot/conf.d/auth-static.conf.ext
#userdb {
#  driver = static
#  args = uid=vmail gid=vmail home=/home/%u
#}

このコメントをカットし、

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/spool/virtual/%d/%n
}

メールの配送ユーザーやグループ、ディレクトリを指定します。

10-ssl.conf

SNI運用する際の設定です。

sudo vi /etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/letsencrypt/live/monmon.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/monmon.jp/privkey.pem

これをデフォルトの証明書として残しつつ、

local_name monmon.jp {
    ssl_cert = </etc/letsencrypt/live/monmon.jp/fullchain.pem
    ssl_key = </etc/letsencrypt/live/monmon.jp/privkey.pem
}

local_name hogehoge.jp {
    ssl_cert = </etc/letsencrypt/live/hogehoge.jp/fullchain.pem
    ssl_key = </etc/letsencrypt/live/hogehoge.jp/privkey.pem
}

こんな感じで、バーチャルホストと証明書のマッピングを記載。

たぶん、デフォルトで指定している方のマッピング記載は不要かと思いますが、念の為(笑)

再起動

sudo systemctl restart dovecot

Dovecotを再起動させます。

以上。