postfix とdovecot (SMTP Auth) でvirtual その3(dovecotの認証、設定全般)

davecotで認証ファイルを作成

今回のインストールで一番時間がかかった作業がこれ。解決したかったのはこの仕様。通常のdovecotインストールでユーザーのパスワードを格納するのは下記のような設定。初期設定だとこんな感じ。これだと/etc/dovecot/usersというファイルにユーザーとパスワードを記載する形になっている。以前からこの設定で構築したことはあったが、ユーザーの削除やパスワード更新などを行うためには複雑で慎重なテストを必須とするスクリプトを用意する必要があった。それは、sedを駆使したりと神経を使うものだった。

一般的(インストール直後の)auth-passwdfile.conf.ext

# Authentication for passwd-file users. Included from 10-auth.conf.
#
# passwd-like file with specified location.
# <doc/wiki/AuthDatabase.PasswdFile.txt>

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

userdb {
driver = passwd-file
args = username_format=%u /etc/dovecot/users

# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
}

で、パスワードファイルはユーザーごとに分けることはできないの?と思い一緒に仕事をしている友人に問いかけてみたところこのような設定を探してきてくれた。Passwd-file — Dovecot documentation (公式)

Multiple passwd files
You can use all the Variable in the passwd-file filenames, for example:

https://doc.dovecot.org/configuration_manual/authentication/passwd_file/#authentication-passwd-file

passdb {
driver = passwd-file
# Each domain has a separate passwd-file:
args = /etc/auth/%d/passwd
}

%dはドメイン名が入って展開されるというものらしい。つまり、ドメイン名ごとにファイルを分けられるよっていうもの。ユーザーごとに分けるという例は見つからなかった。じゃあ、試してみようっていうのが今回の肝となる話。
(前振りが長かった)

試してみてダメだった例

/etc/dovecot/conf.d/auth-passwdfile.conf.ext

passdb {
driver = passwd-file
# Each domain has a separate passwd-file:
args = scheme=CRYPT username_format=%n /var/spool/mail/vhosts/%d/%u/passwd
}

%d でドメイン名。%uでユーザーごとのディレクトリを作って、passwd ファイルを作るというもの。%nはドメイン名を抜いたユーザー名。
何がダメだったか?というとユーザーごとにディレクトリ作る必要はないんじゃない?という点とか、%nと%uの仕様についてが理解していなかった点。

うまくいった例

/etc/dovecot/conf.d/auth-static.conf.ext

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

/etc/dovecot/conf.d/auth-passwdfile.conf.ext

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

なんでauth-staticにuserdbの記載を移しているの?と思うかもしれないけれど、意味としては別。これはdovecotがメールを保存する場所を設定するという意味。ファイルを指定すると、そこからユーザーの設定を読み取って動作する。でも、バーチャルメールボックスなので、ファイルを置いたりする動作のuserを固定のユーザーにする必要があると。uid=vmailとしているのはそのため。

auth-passwdfileからuserdbを抜いたのは、無くても動いているサイトの記述を見たから。試しに抜いてみたけれどまったく問題ない。(パスワードファイルにディレクトリ情報を記載しなくても良い)

ファイル名の指定に%nだったり%uだったりしている理由は、%nだとドメイン名を抜いたユーザー名が入ると書いたけれど、username_format=%nという記述を入れるとドメイン名が抜かれた形になり%dがNULLになってしまうことが分かったから。

%nの仕様上、最初に予定していたドメインごとにユーザーのパスワードファイルを分けるという案はできないことが分かり、users というディレクトリにxxxx@redalarm.jpの形で記載することになった。

認証ファイルのまとめ設定

/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

「disable_plaintext_auth = no」これは認証をplainにするために。ssl=requiredで上書きされる。(SSLなしのplainは拒否される) 参考 → disable_plaintext_auth = no を設定したにも関わらず Dovecot で PlainTextの認証ができない – (tried to use disallowed plaintext auth)のログが記録される

「auth_mechanisms = plain」認証方式。loginとかMD5が追加できる。でも、 loginはOutlookのためらしいので不要。MD5は古いので不要。SSLでやり取りするので暗号化はそれに任せる形にした。

include で前述の2つのauth関連ファイルを指定。

メールボックスの設定

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/var/spool/mail/vhosts/%d/%n
namespace inbox {
inbox = yes
}
first_valid_uid = 1000
protocol !indexer-worker {
}
mbox_write_locks = fcnt

上記のmail_locationが不足していたのかな?と思いつつ今のところ関係性が分かってはいない。

SMTP Authとの連携設定

/etc/dovecot/conf.d/10-master.conf

service imap-login {
inet_listener imap {
}
inet_listener imaps {
}
}
service pop3-login {
inet_listener pop3 {
}
inet_listener pop3s {
}
}
service submission-login {
inet_listener submission {
}
}
service lmtp {
unix_listener lmtp {
}
}
service imap {
}
service pop3 {
}
service submission {
}
service auth {
unix_listener auth-userdb {
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix

}
}
service auth-worker {
}
service dict {
unix_listener dict {
}
}

postfixからSMTP Authでの認証時に利用する連携をソケットファイルで行うのでこの部分のコメントアウトを外す。

SSL設定

/etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </etc/letsencrypt/live/******.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/******.jp/privkey.pem
ssl_cipher_list = PROFILE=SYSTEM

「ssl = required」は995ポートのみで接続可能。後はLets encryptをインストールしてから。ssl_cipher_listはOS提供のものに指定するのでSYSTEMという設定。※fullchain.pemに変更(2022/01/07)中間証明書がないと新しい機器での証明書エラーが出るというトラブルに遭遇。(letsencryptの証明書も新しいルート証明書に関連したものにしないとならなかったし)

余談 inboxのエラー

この構築を行ったのは2020/11~2021/2 にかけてのこと。その間にdovecotのバージョンが変わったため、その間の不具合が出てしまった。y2blog » CentOS のアップデートでDovecotに不具合発生こちらを参考に調査をしたのだが、inboxの設定などを削除したりしなくても…最初からインストールしなおしたら不整合も解消したようす。

Jan 9 22:01:02 localhost dovecot[6540]: pop3-login: Login: user=xxxxx@redalarm.jp, method=PLAIN, rip=xxx.xxx.xxx.xxx, lip=xxx.xxx.xxx.xxx, mpid=6545, session=
Jan 9 22:01:02 localhost dovecot[6540]: pop3(xxxxxx@redalarm.jp)<6545>: Error: Namespace '': Mail storage autodetection failed with home=/var/spool/mail/vhosts/redalarm.jp/xxxxxx
Jan 9 22:01:02 localhost dovecot[6540]: pop3(xxxxx@redalarm.jp)<6545>: Namespace '': Mail storage autodetection failed with home=/var/spool/mail/vhosts/redalarm.jp/xxxxx top=0/0, retr=0/0, del=0/0, size=0