Dovecot を MariaDB と使用する
永らく DBMail を使用してきましたが、DBMail は速度も遅く、問題が発生した時の復旧が大変などの苦労も多く、Fedora23 を最後にパッケージリストから外れてしまいました。
従って、今回は Dovecot へ移行する事に気付いた点などを記事にしたいと思います。
※ ここで利用するのはバーチャルユーザーでの運用方法です。
※ メールでのバーチャルユーザーとは、対象サーバー自体にアカウントを持たないユーザーの事で、殆どのメールサーバーはバーチャルユーザー形式で運用されています。
Dovecot と SQL ドライバのインストール
# dnf install dovecot dovecot-mysql
Dovecot で必要な DB 項目
※ コチラのサイトが参考になります。
CREATE TABLE users (
userid VARCHAR(128) NOT NULL,
domain VARCHAR(128) NOT NULL,
password VARCHAR(64) NOT NULL,
home VARCHAR(255) NOT NULL,
uid INTEGER NOT NULL,
gid INTEGER NOT NULL
);
項目 | 説明 |
userid | userid@domain の userid 。 半角英数字などで構成される。 |
domain | userid@domain の domain 。 当然、実在するアドレスである必要がある。 |
password | PLAIN もしくは暗号化した文字列を格納する。 暗号化する場合では64文字では少なすぎる。 |
home | バーチャルメールを格納する事になる場所。 今回は自前で生成するので使用しない。 |
uid | Linux のユーザーID番号。 今回は自前で生成するので使用しない。 |
gid | Linux のグループID番号。 今回は自前で生成するので使用しない。 |
従って、今回は次のように作成した。
# データベースを作成
CREATE DATABASE mail CHARACTER SET 'utf8';# DB接続ユーザーの作成
GRANT ALL ON mail.* TO 'hoge'@'localhost' IDENTIFIED BY 'db_password';# DBを選択
use mail;# テーブルの作成
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, # メンテナンス用のキー
userid VARCHAR(128) NOT NULL,
domain VARCHAR(128) NOT NULL DEFAULT 'hoge.com',# デフォルトは必ず変更して下さい。
password VARCHAR(512) NOT NULL
);
※ 必要に応じて項目を変更して下さい。
ホームディレクトリの作成
# # グループの作成 gid = 10000
# groupadd -g 10000 vmail
#
# # ユーザーの作成 uid = 10000
# useradd -g vmail -u 10000 vmail
#
# # ホームディレクトリの作成
# mkdir /home/vmail
# mkdir /home/vmail/dovecot
#
# # Dovecot が操作しやすいようにユーザーとグループを『dovecot』に変更
# chown -R dovecot:dovecot /home/vmail/dovecot
『/etc/passwd』の『vmail』をログインできないように設定
※ ファイルを編集して下さい。
vmail:x:10000:10000::/sbin/nologin
※ これでユーザー名(vmail)、uid(10000)、グループ名(vmail)、gid(10000)のユーザー作成が完了した。
SELinux の設定
# # SELinux ファイルコンテキストの追加
# semanage fcontext -a -t dovecot_spool_t /home/vmail/dovecot(/.*)?
#
# # SELinux ファイルコンテキストの初期化
# restorecon -R /home/vmail/dovecot
10-auth.conf の編集
『/etc/dovecot/conf.d/10-auth.conf』を編集する。
データベースにあるパスワードを暗号化したくないの場合 plain は必須
auth_mechanisms = plain login
※ どの値を設定するかはコチラのサイトが参考になります。
# SQL を認証に使う
!include auth-sql.conf.ext
※ 今回は SQL 認証のみ使用しますので『!include』の項目は『!include auth-sql.conf.ext』のみを残し他は全てコメントアウトして下さい。
auth-sql.conf.ext の編集
『/etc/dovecot/conf.d/auth-sql.conf.ext』を編集する。
# Authentication for SQL users. Included from 10-auth.conf.
#
# <doc/wiki/AuthDatabase.SQL.txt># すべての項目で /etc/dovecot/dovecot-mysql.conf.ext を使う。
passdb {
driver = sql
# Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-mysql.conf.ext
# password_query の項目が使われると思われる。
# ACL(「local」はローカルネットのすべてが含まれるらしいが資料不足)
# なので「,192.168.0.0/16」は必要ないと思われる。
override_fields = allow_nets=local,192.168.0.0/16
}
# "prefetch" user database means that the passdb already provided the
# needed information and there's no need to do a separate userdb lookup.
# <doc/wiki/UserDatabase.Prefetch.txt>
#userdb {
# driver = prefetch
#}
userdb {
driver = sql
args = /etc/dovecot/dovecot-mysql.conf.ext
# user_query の項目が使われると思われる。
# ACL(「local」はローカルネットのすべてが含まれるらしいが資料不足)
# なので「,192.168.0.0/16」は必要ないと思われる。
override_fields = allow_nets=local,192.168.0.0/16
}
# If you don't have any user-specific settings, you can avoid the user_query
# by using userdb static instead of userdb sql, for example:
# <doc/wiki/UserDatabase.Static.txt>
#userdb {
#driver = static
#args = uid=vmail gid=vmail home=/var/vmail/%u
#args = uid=dovecot gid=dovecot home=/var/mail/virtual/%d/%n
#}
※ ここで使用する『driver』は『sql』を指定して下さい。(mysql は指定しないで下さい。)
dovecot-mysql.conf.ext を編集する
『/etc/dovecot/dovecot-mysql.conf.ext』を編集する。
※ 詳しくはコチラのサイトが参考になります。
driver = mysql
# データベースにあるパスワードを暗号化したくないので PLAIN を使う
default_pass_scheme = PLAIN
# The mysqld.sock socket may be in different locations in different systems.
# Use "host= ... pass=foo#bar" with double-quotes if your password has '#' character.
connect = host=/var/lib/mysql/mysql.sock dbname=mail user=hoge password=db_password
# Alternatively you can connect to localhost as well:
#connect = host=localhost dbname=mails user=admin password=pass # port=3306
password_query = SELECT userid AS user, domain, password FROM users WHERE userid = '%n' AND domain = '%d'
user_query = SELECT CONCAT( '/home/vmail/dovecot/', domain, '/', userid ) AS home, 10000 AS uid, 10000 AS gid FROM users WHERE userid = '%n' AND domain = '%d'
# For using doveadm -A:
iterate_query = SELECT userid, domain FROM users
※ 必要に応じて項目を変更して下さい。
パスワードを暗号化する場合は、先ず DB の『users.password』の項目が暗号化されている必要があります。この場合は、このページが参考になります。また、『default_pass_scheme』は『PLAIN』ではなく、コチラのサイトを参考にして指定して下さい。
10-mail.conf を編集する
『/etc/dovecot/conf.d/10-mail.conf』を編集する。
※ この作業はもしかしたら必要ないかも知れませんが、念の為に行います。
※ コチラのサイトが参考になります。
mail_home = /home/vmail/dovecot/%d/%n
mail_location = maildir:~/mail
dovecot.conf を編集する
『/etc/dovecot/dovecot.conf』を編集する。
※ ポートをオープンする為の作業です。
protocols = imap pop3 lmtp listen = *, ::
Postfix との連携の為に 10-master.conf を編集する
『/etc/dovecot/conf.d/10-master.conf』を編集する。
service lmtp { # LMTP をUNIXドメインソケットを利用する設定 unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service auth { # Postfix smtp-auth # Postfix smtp-auth をUNIXドメインソケットを利用する設定 # ただし、『postconf -a』コマンドで『dovecot』が含まれる場合のみ可能 unix_listener /var/spool/postfix/private/auth { mode = 0600 user = postfix group = postfix } }
『/etc/postfix/main.cf』を編集する。
mailbox_transport = lmtp:unix:private/dovecot-lmtp smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
※ この作業は Postfix と連携する場合のみ必要な作業です。
※ LMTP の連携はコチラのサイトが参考になります。
※ SASL の連携はコチラのサイトが参考になります。