我正在尝试将 Dovecot 设置为身份验证反向代理,在已经运行的 IMAP 服务器前面完成以下操作:
- 让 Dovecot 使用 Kerberos/GSSAPI 验证用户(以允许单点登录)。
- 如果正确验证,则使用常规 AUTH=PLAIN 方法使用经过验证的用户名通过 Dovecot 代理连接到现有 IMAP 服务器,但使用随机/空密码。我想要的正是这个,因为我将让后端 IMAP 服务器信任验证代理,但它仍然需要使用虚拟密码进行 PLAIN IMAP 登录。
我走了多远?
- 我知道如何配置 Dovecot 使用 Kerberos/GSSAPI 进行身份验证:https://wiki.dovecot.org/Authentication/Kerberos
- 我知道如何配置 Dovecot 来代理后端 IMAP 服务器:https://wiki.dovecot.org/PasswordDatabase/ExtraFields/Proxy
我面临的主要挑战是两者的结合。Kerberos/GSSAPI 身份验证页面以以下内容开始:
Kerberos 身份验证机制不需要
passdb
,但您需要一个,userdb
以便 Dovecot 可以查找用户特定信息,例如存储其邮箱的位置。
嗯,这对我来说就像一个双重反功能:我passdb
首先需要一个代理,并且我不希望它知道“比如他们的邮箱存储在哪里”,因为它应该将所有内容代理到后端服务器上。
那么,有人能给我指出正确的方向吗?
(我刚刚开始使用 Dovecot,所以请耐心等待。另外,顺便说一句,使用 Dovecot 并不是必需的。我用作后端的 IMAP 服务器是 Kopano Gateway,它似乎缺乏 SSO 支持但它确实让我绕过密码验证。
答案1
设置 passdb 属性以包含pass=
主密码。Dovecot 需要密码才能尝试代理。使用 GSSAPI 显然没有密码,因此请提供您的主密码(或者使用 kopano,如果您已bypass_auth
设置,则可以输入任何密码)。请参阅Dovecot 文档,特别是“主密码”部分。
答案2
最后用Alex 在另一个答案中给出的提示和一些最后的帮助在 Dovecot 邮件列表中,Dovecot 原作者 Timo 做出了回应。
下面是完整的示例dovecot.conf
。主要技巧是节args
中的整行passdb
。没有password=something
或者 nopassword=y
,它会认为邮件存储在本地,并且代理未打开,因此您会看到错误Error: mail_location not set and autodetection failed: Mail storage autodetection failed with home=(not set)
。评论中内联了更多小警告。
protocols = imap
passdb {
driver = static
args = proxy=y host=127.0.0.1 port=1143 pass=masterpass nopassword=y
}
# Deliberately omitted userdb, because this is a proxy.
# Kerberos authentication settings
auth_mechanisms = gssapi
auth_gssapi_hostname = mailhost.mydomain.tld
auth_realms = MY-REALM.DOMAIN.TLD
auth_default_realm = MY-REALM.DOMAIN.TLD
# This keytab file contains keys for principal imap/[email protected]
# Unlike SSL keys/certs, do not use '= <', but plain '=' to path of file.
auth_krb5_keytab = /etc/dovecot/imap.keytab
# Pass only local username part to the backend.
auth_username_format = %n
# Logging to foreground with some verbose logging for authentication.
log_path = /dev/stderr
auth_verbose = yes
# Require StartTLS or plain TLS for any interaction.
ssl = required
ssl_cert = </path/to/cert.crt
ssl_key = </path/to/key.pem
ssl_prefer_server_ciphers = yes
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
然后日志将显示:
imap-login: Info: proxy(username): started proxying to 127.0.0.1:1143: user=<username>, method=GSSAPI, rip=1.2.3.4, lip=9.9.9.9, TLS, session=<iJvnvg6P8KEKAAYE>