私のシステムはこのように設定されています。
smtp --> postfix --> dovecot (LMTP 経由) --> メールボックス
難しいのは、認証が LDAP に対して行われることです。
典型的な LDAP エントリは次のようになります。
CN=Jon Doe
uid=jond
[email protected]
今起こっていることは、postfixがメールをdovecotにプッシュしているということです。dovecotはuserdb検索を実行しますが、宛先メールアドレスに基づいて「[メールアドレス]「」。
そこでLDAPは(uid=%u)を探し、それが([メールアドレス])。
Postfix はこれを仮想スタック経由で送信するため、仮想部分は次のように設定されます。
virtual_alias_maps = ldap:/etc/postfix/ldap/ldap-aliases.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /
virtual_mailbox_domains = ldap:/etc/postfix/ldap/virtual_domains.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap/ldap-accounts.cf
virtual_minimum_uid = 5000
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:5000
私が期待していたのは、postfix が virtual_mailbox_maps を使用してユーザーを検索し、そのユーザーを LMTP に渡して、dovecot が userdb 検索を実行できるようにすることです。postfix はそれを実行する方法を知らず、それを実行できる virtual_map* パラメータも見つからないため、正しい手順が何であるかはわかりません。
postfix は LDAP 経由でユーザーを検索し、それを LMTP に送信する必要がありますか? または、LMTP は受信者の電子メール アドレスに基づいて検索を行う必要がありますか?
編集: メール クライアントに接続してメールを受信すると、dovecot の IMAP 部分は正常に機能することを付け加えておきます。ログイン名 (uid) に基づいてすべてを正しく検索します。もちろん、IMAP にログインするときに uid を渡すので、dovecot で簡単に使用できるため、これが可能になります。
postfix がそれを使用しているときは、どういうわけか dovecot に別の方法で実行するように指示する必要があります...
ldap.conf は、次のファイルから構成されます。
hosts = localhost
dn = cn=linagent,ou=people,dc=example,dc=org
dnpass = SECRET
tls = no
auth_bind = yes
base = dc=example,dc=org
deref = never
scope = subtree
user_attrs = \
=home=%{ldap:homeDirectory}, \
=uid=5000, \
=gid=5000, \
=mail=maildir:%{ldap:mailMessageStore}
user_filter = (&(objectClass=inetOrgPerson)(uid=%u))
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=inetOrgPerson)(uid=%u))
答え1
これがそのようになっているかどうかはわかりませんが、dovecot の LDAP 構成を次のように変更しました。
user_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
pass_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
メール クライアントは UID (ユーザー名) 経由でログインするため、メール クライアントからの認証には uid=%u の部分が必要です。
mail=%u の部分は postfix からの LMTP 受信に必要であり、postfix は受信者のメールを知っているだけです。
uid はメール アドレスではないため、このソリューションは機能し、競合は発生しないと考えられます。これは私にとっても理にかなっていますが、なぜ Courier がこれをよりエレガントに処理できるのか疑問に思います。
ただし、これは設計された方法ではないと思うので、この質問は解決しません。
答え2
%u の代わりに %n 変数を使うべきではないでしょうか?
これを確認してください:https://wiki.dovecot.org/変数
これは抜粋ですhttps://wiki2.dovecot.org/AuthDatabase/LDAP/Userdb
変数とドメイン
ユーザー名とドメインは、変数 %n と %d を使用して区別できます。これらは、前のユーザー名を "@" 文字で分割します。前のユーザー名は次のとおりです。
- LMTP の場合、user@hostname になります。hostname は、Postfix の設定などによって異なります。 -IMAP の場合、パスワード データベースがユーザー名として指定したものになります。(LDAP) パスワード データベースに "user_attrs = =user=%n" がある場合、ログイン名のドメイン部分はパスワード データベースによって削除されます。UserDB はドメイン部分を認識しません。つまり、%n と %u は UserDB にとって同じものです。
トーマス