Dovecot が MySQL クエリを実行できない

Dovecot が MySQL クエリを実行できない

私は workaround.org の ISPMail チュートリアル (2.9 Wheezy バージョン) に従ってきましたが、これまでのところすべて正常に動作しています。「電子メール配信のテスト」のステップに到達したとき、/var/log/mail.log からの出力ログにクエリに関するエラーがあることに気付きました。

May 14 06:48:59 mail postfix/pickup[17704]: EA4AD240A98: uid=0 from=<root>
May 14 06:48:59 mail postfix/cleanup[17776]: EA4AD240A98: message-id=<[email protected]>
May 14 06:48:59 mail postfix/qmgr[17706]: EA4AD240A98: from=<[email protected]>, size=429, nrcpt=1 (queue active)
May 14 06:49:00 mail dovecot: auth-worker(17782): mysql(127.0.0.1): Connected to database mailserver
May 14 06:49:00 mail dovecot: auth-worker(17782): Warning: mysql: Query failed, retrying: Table 'mailserver.users' doesn't exist
May 14 06:49:00 mail dovecot: auth-worker(17782): Error: sql([email protected]): User query failed: Table 'mailserver.users' doesn't exist (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = '%n' AND domain = '%d')
May 14 06:49:00 mail dovecot: lda([email protected]): msgid=<[email protected]>: saved mail to INBOX
May 14 06:49:00 mail postfix/pipe[17780]: EA4AD240A98: to=<[email protected]>, relay=dovecot, delay=0.09, delays=0.03/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
May 14 06:49:00 mail postfix/qmgr[17706]: EA4AD240A98: removed

DB が見つからないというのはかなり興味深いと思ったので、DB に関連するすべてのファイル (postfix cf ファイルを含む) を再度確認したところ、すべてが正しいのでこの時点では困惑していますが、奇妙なことに、電子メールは /var/vmail/domain.com/ の正しい宛先に届いたようです。

これについて心配すべきでしょうか、それとも何か見落としているのでしょうか? これはdovecotからのメッセージなので、ここに含めるdovecot-sql.conf.extからのクエリになります。

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=blocked password=***REMOVED***
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

答え1

mail.log に記載されているように、user_query の値は定義されていません。そのため、Dovecot はデフォルトのクエリにフォールバックします。

設定ファイル /etc/dovecot/dovecot-sql.conf.ext を開くと、user_query の値はおそらくコメントアウトされているか空になっています。適切なクエリを入力してください。

私のように、すべてのメールアカウント(たとえば5000)に同じUIDとGIDを使用している場合は、次のように簡単に行うことができます。

user_query = SELECT ('5000') as 'uid',('5000') as 'gid'

設定ファイルで気づいたことがもう 1 つあります。default_pass_scheme として PLAIN-MD5 を使用しない方がよいでしょう。SHA512 のような強力なものに切り替える方がよいでしょう。

私の回答がお役に立てば幸いです。乾杯!

答え2

nano または vi を使用します (nano 保存 = ctrl+o、終了 = ctrl+x) vi 保存 = 挿入ボタンと esc ボタン、次に :wq! と入力します。保存して終了します。

auth-sql.conf は、以下のファイルから構成されます。

...
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
...
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
}

sql ドライバーを使用して userdb セクションをコメント アウトします。

#userdb {
#driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
#}

systemctl restart dovecotそしてそれは動作するはずです。

問題は、userdb ドライバーが使用していて、データベース内のsqlテーブルを検索しているが、このテーブルが存在しないことです。users

これは、インターネット上にさまざまなバリエーションが出回っている人気のチュートリアルの問題です (どれがオリジナルかはわかりません)。このチュートリアルでは、userdb 行をコメント アウトする必要があることは説明されておらず、構成ファイル内の行の追加または変更に関する手順のみが記載されています。このチュートリアルでは、仮想ユーザー テーブルに MariaDB または MySQL を使用しています。この場合、driver = sqlpassdb のみが必要です。passdb は につながりdovecot-sql.conf.ext、パスワードのデータベースへの適切なクエリと homedir を取得するための静的な方法が含まれています。

見つけたチュートリアル (同じチュートリアルを使用したと思います) を読んで、適切な設定で自分のサーバーでこれをテストしたところ、同様の問題が発生しました。自分のサーバーで postfix と dovecot の設定を 3 回、場合によっては 4 回確認したところ、この解決策で問題が解決しました。dovecot と postfix を clamav、spamassassin、postgrey とともに構成しました。すべてが非常にうまく機能していますが、dovecot と postfix の構成ファイルのすべての行をステップごとに確認するのに 40 時間以上かかりました。

2019年3月22日編集

PAM ドライバーに関する別の説明が載っている本を読みました。

/etc/dovecot/conf.d/10-auth.conf ファイルの最後に次の 1 行があります。

!include auth-system.conf.ext

ファイル /etc/dovecot/conf.d/auth-system.conf.ext には、次のようなデフォルトのコメントアウトされたセクションがあります。

#passdb {
    #driver = pam
    # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
    # [cache_key=<key>] [<service name>]
    #args = dovecot
#}
#userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
#driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
#}

データベースに手動で作成されたアカウントの代わりに静的なローカル アカウントを使用する場合 (大量の電子メール アカウントを MariaDB に自動的に追加する方法は見つかりませんでした)、/etc/dovecot/conf.d/auth-system.conf.ext のコードを次のように変更する必要があります。

passdb {
    driver = pam
    # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
    # [cache_key=<key>] [<service name>]
    #args = dovecot
}
userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
}

これは本当に短い説明です。Dovecot は、ユーザーを作成する SQL データベースを使用することも、システム内のローカル ユーザーのアカウントを認証するために PAM を使用することもできます。どちらを選択するかは管理者次第です。私の意見では、SQL は PAM や /etc/shadow よりもはるかに安全です。MySQL/MariaDB でユーザーを作成する場合は、次の例のように SHA を選択できるためです。

INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('yourdifficultpasswordphrase', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');

その後:

nano /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=yourdbname user=dbuser 
password=yourdifficultpassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT Email as User, password FROM Users_tbl WHERE 
Email='%u';

SHA-512 は役に立ちます。もちろん、これは非常に短い説明ですが、違いと、SQL がより良い選択である理由を説明していただければ幸いです。

答え3

Dovecot は、テーブルusersにデータがあるように見えるのに、というテーブルを探しています:virtual_users

Query failed, retrying: Table 'mailserver.users' doesn't exist

テーブルの名前を変更するか、virtual_usersテーブルを使用するように dovecot を構成します。

答え4

これは正確な答えではありませんが、あなたの問題に関連している可能性があり、新しい訪問者がトラブルシューティングできるようにします。以下のリンクを参照してください。

https://www.dovecot.org/list/dovecot/2013-March/089342.html

関連情報