我构建了一个 Dovecot 代理,根据用户的域将用户发送到特定的后端。域 A 转到服务器 A,域 B 转到服务器 B,等等。域列表不是静态的,但变化不大。使用 passdb 驱动程序 sql 和简单的 SQL 语句完全可以正常工作,例如:
password_query = SELECT
NULL as password,
'y' as nopassword,
'y' as proxy,
NULL as destuser,
'y' as proxy_nopipelining,
host,
'y' as nodelay,
'y' as nologin,
'any-cert' as 'starttls'
FROM proxy_domain WHERE domain = '%d';
dovecot 配置包含:
passdb {
args = /etc/dovecot/sql.conf
driver = sql
}
userdb {
args = static uid=5000 gid=5000 home=/dev/null
driver = static
}
我的“问题”其实不是什么大问题 - 但是...我只需要为这项工作安装并运行 Mysql/MariaDB 服务器,我认为一定有更简单的方法来解析特定域的主机。并行 postfix 安装使用简单的传输图来完成相同的工作。我不需要 SQL 服务器来进行这种简单的查找。
我想到了Dovecot Lua 密码数据库或者静态密码库但是我找不到任何有用的例子来用 Lua 将域与主机进行匹配,或者如何返回所有必要的参数?
所以我已经安装了 debian 包dovecot-auth-lua
。
我尝试过:
passdb {
driver = lua
args = file=/etc/dovecot/passdb.lua blocking=yes
default_fields = password=NULL nopassword=y proxy=y destuser=NULL proxy_nopipelining=y nodelay=y nologin=y starttls=any-cert
}
这里有必要阻塞吗?这是只读操作,还是?
Lua 脚本:
local database = "/etc/dovecot/backends"
function auth_passdb_lookup(req)
for line in io.lines(database) do
for domain, host in string.gmatch(line, "(.+)%s(.+)") do
if (domain == req.domain) then
return dovecot.auth.PASSDB_RESULT_OK, "host=" .. host
end
end
end
return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, ""
end
当然还有<domain> <host>
每行的后端文件。
但我在代理上遇到了错误
pam_unix(dovecot:auth): check pass; user unknown
pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=user@domain rhost=<my-ip>
pam(user@domain,ip,<id>): pam_authenticate() failed: Authentication failure (Password mismatch?)
这是什么意思?我不确定 - 但确实是这样的,因为我对其中一些返回了“NULL”。当我删除这两个属性时,password
效果destuser
是一样的。
答案1
pam_authenticate 意味着它正在尝试系统用户查找,通过注释掉 10-auth.conf 中 auth-system.conf.ext 的包含来禁用 pam 查找。
附言:你让 LUA 工作了吗?我正在尝试类似的东西。
编辑-通过将这些字段添加到 passdb 查找函数返回字段(而不是 userdb 查找函数字段)中,使我的工作正常:
返回 dovecot.auth.PASSDB_RESULT_OK, "密码=pass 代理=y 主机=imap.domain.com[电子邮件保护]通过=另一个通过”