aikawa

(Postgre)SQLサーバを使ったDovecotとPostfixのユーザ認証

DovecotやPostfixはデフォルトでLinuxのユーザをそのまま利用できますが、今回はSQLサーバに登録したユーザを利用できるようにします。



以前のように、CentOSでローカルでのテスト環境で動くようにしますので、Maildir形式の設定やSMTP認証は済んでいる所へ追加となります。











今回はPostgreSQLが動いていたので、とりあえずそちらを利用します。

dnf install postfix-pgsql dovecot-pgsql

uid gidを指定したユーザを作成して、適当なフォルダを作り権限を当てます。

groupadd -g 5000 vmb
useradd -g vmb -u 5000 -s /sbin/nologin vmb
mkdir /var/mail/vhosts
chown vmb.vmb /var/mail/vhosts
  • /etc/hosts

の自ローカルアドレス(127.0.0.1と::1)の末尾にvirtual.localdomainを追加します。

127.0.0.1   ... virtual.localdomain
::1         ... virtual.localdomain

PostgreSQL設定

SQLで利用するパスワードをハッシュ化するため、doveadmを利用します。

doveadm pw -p [password]

出力をコピーしておきます。



ユーザを登録するためのテーブルを作成します。適当にcreateuserとcreatedb。

createuser -U postgres -SdR mail
createdb -U mail mail
psql -U mail mail

SQLコマンドラインでパスワードを設定し、テーブルとVIEW作成。

ALTER ROLE mail WITH PASSWORD 'testpass';
-- user table
CREATE TABLE mail_users(id serial NOT NULL, name text, domain text, password text, constraint mail_users_pkey PRIMARY KEY(id));
INSERT INTO mail_users(name, domain, password) VALUES('aikawa', 'virtual.localdomain', '[doveadm pwの出力内容]');
-- user view
CREATE VIEW user_view AS SELECT *,
    name||'@'||domain AS mail,
    '/var/mail/vhosts/'||domain||'/'||name AS dovecot_home,
    domain||'/'||name||'/Maildir/' AS maildir
    FROM mail_users;

メールアドレスのユーザ@ドメイン形式で、ユーザとドメインをそれぞれ取得出来るようにしておきます。



mail, dovecot_home, maildirはVIEWでなくカラムを作って登録してもOKですが、今回は面倒なのでVIEWで自動的に割り当てます。maildirとdovecot_homeそれぞれ違うのは、postfixとdovecotで形式が僅かに違うためです。

Postfix設定

  • /etc/postfix/main.cf

へvirtual_domainに関する設定を追加します。

# virtual
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 100
virtual_mailbox_domains = virtual.localdomain
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_mailbox.cf
  • /etc/postfix/pgsql_mailbox.cf

を追加し、SQLサーバの設定とSQLを記載。

hosts = localhost
dbname = mail
user = mail
password = testpass
query = SELECT maildir FROM user_view WHERE name = '%u' AND domain = '%d';

リロードし、postmapでSQLユーザを引けるか確認出来ます。

systemctl reload postfix
postmap -q aikawa@virtual.localdomain pgsql:/etc/postfix/pgsql_mailbox.cf
# 出力: virtual.localdomain/aikawa/Maildir/

Dovecot設定

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

SQL認証を追加します。



ただ、デフォルトの並びではシステム認証の失敗コストが高いらしく、RoundCube環境では目に見えて遅くなってしまうため、無効化するか、出来なければSQL認証が先に来るように入れ替えます。

!include auth-sql.conf.ext
!include auth-system.conf.ext
  • /etc/dovecot/dovecot-sql.conf.ext

を作成。



uid, gidはどのユーザも5000固定なので、直接書きます。もしユーザごとに異なる場合はテーブルに追加する必要が有ります。

driver = pgsql
connect = host=127.0.0.1 user=mail password=testpass dbname=mail
default_pass_scheme = CRAM-MD5
user_query = SELECT dovecot_home AS home, 5000 AS uid, 5000 AS gid FROM user_view WHERE mail = '%u'
password_query = SELECT name AS username, domain, password FROM user_view WHERE mail = '%u'

リロードして、反映。

systemctl reload dovecot

DovecotがSQLユーザを引けるかdoveadmで確認出来ます。



※ここでSQLサーバへ接続出来ない場合、ものすごく長い時間待たされ失敗しますのでログ等確認を。

doveadm user 'aikawa@virtual.localdomain'

成功するとこんな風に出力されます。

field   value
uid     5000
gid     5000
home    /var/mail/vhosts/virtual.localdomain/aikawa
mail    maildir:~/Maildir

認証出来るかの確認も出来ます。この後パスワードを入力して、auth succeeded が出ればOK。

doveadm auth test -x service=imaps 'aikawa@virtual.localdomain'

なおRoundCubeのログイン時も、ユーザ名は aikawa@virtual.localdomain とメールアドレス形式で入力します。



そうでないユーザ名のみの方式にも出来ますが、Linuxユーザも引き続き利用する場合競合するので今回はこうしています。