user icon

(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ユーザも引き続き利用する場合競合するので今回はこうしています。 Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)